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