не правильно показания тахометра
- Войдите на сайт для отправки комментариев
Сб, 11/02/2017 - 17:48
Здравствуйте всем, написал код для тахометра но не правильно показывает и не получается считать входяший длительность импульса. Подаю сигналы с осцилографом длительность импульса 4 мс и период 62мс
unsigned long lastflash; int RPM; void setup() { DDRD &=~(1<<PD3); PORTD|=(1<<PD3); Serial.begin(9600); EICRA=(0<<ISC11)|(0<<ISC10); EIMSK=(1<<INT1); } void loop() { if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды RPM=0;} //считаем что RPM 0 Serial.println(RPM); //вывод в порт delay(50); //задержка для стабильности cli(); // запрещаем прерывания sei(); } ISR(INT1_vect) { RPM=60/((float)(micros()-lastflash)/1000000); //расчет lastflash=micros(); //запомнить время последнего оборота }
В строке 21 первую цифру надо написать как 60.0 иначе имеем целочисленное деление. Вообще в прерывании делать такой длинный расчёт плохо. Длинный, потому что займет несколько сотен микросекунд. Очень долго множить и делить float. Всё это время micros() не будет работать.
Все переменные используемые в перывании должны быть объявлены как volatile.
Зачем запрещать, а потом сразу разрешать прерывание (строки 16-17)?
Для стабильности чего задержка в строке 15?
Спасибо за отзыв можете подсказать порядок разрешении и запрета прерывание. Как лучше считать импульсы внутри прерывании