не правильно показания тахометра
- Войдите на сайт для отправки комментариев
Сб, 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?
Спасибо за отзыв можете подсказать порядок разрешении и запрета прерывание. Как лучше считать импульсы внутри прерывании