Помогите найти ошибку в коде
- Войдите на сайт для отправки комментариев
Пт, 26/08/2016 - 08:05
Уважаемые! помогите найти ошибку.
#include <TimerOne.h> boolean state = LOW; boolean prevState = LOW; const int sensorPin = 10; // порт для датчика long timer = 0; // для замера времи одного оборота (в миллисекундах) long measuredTimer = 100000; // время одного оборота (в миллисекундах) const int debounce = 10; // защита от дребезга контактов const int timeout = 250; // (миллисекунд) масимальное время ожидания long counter = 0; // счетчик оборотов int km = 0; // скорость на выходе const float radius = .1; const float circumference = TWO_PI*radius; const float RPMtoKMH = circumference * 0.06 / 1; float rpm = 0.0; // оборотов в минуту void setup() { pinMode(sensorPin, INPUT); Serial.begin(9600); Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second) Timer1.attachInterrupt( timerIsr ); // attach the service routine here } void loop() { // Main code loop // TODO: Put your regular (non-ISR) logic here rpm = digitalLowPass(rpm, 60000.0 /measuredTimer, 0.75); km=rpm * RPMtoKMH, 1; Serial.println(km); } /// -------------------------- /// Custom ISR Timer Routine /// -------------------------- float digitalLowPass(float last_smoothed, float new_value, float filterVal) { return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); } void timerIsr() { prevState = state; state = digitalRead(sensorPin);// считываем датчик if (state == HIGH && prevState == LOW && timer > debounce){//если датчик сработал measuredTimer = timer; //фиксируем результат замера timer = 0; //обнуляем счетчик времени counter++; //увеличиваем счетчик оборотов на единицу } timer++; if (timer > timeout){// если импульсов долго нет, значит стоим measuredTimer = measuredTimer + 100; } }
В принципе все работает, но последние показания не сбрасываюся на 0, даже когда датчик не замкнут. А при таком коде все работает
// данные пользователя - вводятся индивидуально const int ledPin = 13; int ledState = LOW; unsigned long previousMillis = 0; const int sensorPin = 10; // порт для датчика const float radius = .1; // радиус колеса в метрах ВАШЕГО велосипеда const float magnets = 1; // количество магнитов для датчика на колесе const int timeout = 500; // (миллисекунд) масимальное время ожидания const int debounce = 10; // защита от дребезга контактов int km = 0; // скорость на выходе const float circumference = TWO_PI*radius; // расстояние одного оборота колеса const float RPMtoKMH = circumference * 0.06 / magnets; // коэф перевода (об/мин) в (км/ч) long timer = 0; // для замера времи одного оборота (в миллисекундах) long measuredTimer = 100000; // время одного оборота (в миллисекундах) float rpm = 0.0; // оборотов в минуту long counter = 0; // счетчик оборотов boolean state = LOW; boolean prevState = LOW; void setup() { pinMode(ledPin, OUTPUT); // Print a message to the LCD. Serial.begin(9600); // включаем вывод в последовательный порт pinMode(sensorPin, INPUT); // TIMER - выставляем таймер с частотой прерывания в 1 кГц cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 1999; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS11); TIMSK1 |= (1 << OCIE1A); sei(); // END } ISR(TIMER1_COMPA_vect) {//Функция прерывания с частотой в 1кГц для считывания датчика prevState = state; state = digitalRead(sensorPin);// считываем датчик if (state == HIGH && prevState == LOW && timer > debounce){//если датчик сработал measuredTimer = timer; //фиксируем результат замера timer = 0; //обнуляем счетчик времени counter++; //увеличиваем счетчик оборотов на единицу } timer++; if (timer > timeout){// если импульсов долго нет, значит стоим measuredTimer = measuredTimer + 100; } } void loop(){ // рассчитываем обороты в секунду и сглаживаем низкочастотным фильтром // (чем больше коэф (к единице) тем плавнее значения) rpm = digitalLowPass(rpm, 60000.0 /measuredTimer, 0.75); km=rpm * RPMtoKMH, 1; Serial.println(km); } //Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация) float digitalLowPass(float last_smoothed, float new_value, float filterVal) { return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); }
Но мне нужно именно со сторонней библиотекой.
Уберите антидребезг.
Уберите антидребезг.
К сожалению не помогло (
совсем убрали?
какая именно переменная должна сброситься?
Да разобрался сам. Время срабатывания таймера нужно было уменьшить