Здравствуйте. Это программа для расходомера на основе водяного счетчика. В счетчик поставлен ик датчик, от него идет сигнал с частотой пропорциональной расходу на 8 пин ардуино нано. В программе задействован таймер1 в режиме захвата. Проблема в том, что счетчик переполнений таймера увеличивается не только по переполнению, но и по достижению половины т.е. 32768.
//расходомер на основе водяного счетчика . один импульс - 2.442 Е-2 литра.
//сигнал поступает на пин8,считается длина периода, по нему вычисляется расход воды в л/мин.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C MyLCD(0x27, 16, 2);
volatile bool Start = 0;
volatile uint8_t T1OVF_Counter = 0; //счетчик количества прерываний по переполнению таймера1
volatile uint32_t T = 0, T2 = 0;
float Rashod = 0;
const float Imp = 3.663E+5;
ISR(TIMER1_OVF_vect)
{
T1OVF_Counter++;
}
ISR(TIMER1_CAPT_vect)
{
if (!Start)
{
TCNT1 = 0;
Start = 1;
}
else
{
T2 = ICR1;
T = ((uint32_t)T1OVF_Counter << 16) | T2;
T1OVF_Counter = 0;
Start = 0;
}
}
void setup() {
MyLCD.begin();
MyLCD.setBacklight(1);
pinMode(8, INPUT);
TCCR1A = 0; TCCR1B |= B11000011; //шумоподавитель вкл, передний фронт вкл, прескалер =64
TIMSK1 |= B00100001; // вкл прерывания по переполнению и захвату
}
void loop() {
Rashod = Imp / T; //литров в минуту
MyLCD.clear();
MyLCD.setCursor(0, 0);
MyLCD.print(T);
MyLCD.setCursor(0, 1);
MyLCD.print(Rashod, 4);
MyLCD.setCursor(8, 1);
MyLCD.print("L/MIN");
delay(500);
}
вопросов не было видимо надо покритиковать код…
думаю так будет правильней…
ИМХО
pinMode(8, INPUT);
TCCR1A = 0; TCCR1B |= 0b11000011; //шумоподавитель вкл, передний фронт вкл, прескалер =64
TIMSK1 |= 0b00100001; // вкл прерывания по переполнению и захвату
Это, конечно, догадки - но посмотри внимательнее на его код. Диагностического вывода счетчика у него в коде нет… а значит он делает вывод об ошибке по косвенным признакам.
определяю так: подаю вместо датчика частоту, плавно увеличиваю. после 32767 количество посчитанных тактов перескакивает на98304, а счетчик переполнений увеличивается на 1.
46
ну раньше еще была строка для выведения количества переполнений, потом убрал.
И ко всем: я на этом форуме 1 день, плохо ориентируюсь в интерфейсе. Если что извиняйте. да и программист я без году неделя.
Как по мне, формула стр.28 неверна. Надо по первому фронту сохранить значение ICR1, а по второму вычесть из текущего сохранённое (ИМХО, могу ошибаться)