Прошу помощи в написание алгоритма для спидометра.
Спидометр для скутра должен работать как велоспидометры, с той лишь разницей что вместо геркона я хочу использовать датчик холла.
Как правильней мерить скорость измерением частоты импульсов за одну секунду или измерением периода и пересчетом в скорость?
Написал два алгоритма, прошу строго не судить , я только начинаю АВРки изучать.
Для упрощение пока беру длинну окружности колеса 1 метр, потом пересчитаю
Алгоритм номер 1
Должен работать так
Таймер 1 переполняется каждую секунду, по прерыванию я забираю из счетчика таймера о значение, это частота импульсов, пересчитываю её в скорость.
В протеусе работает странно, к примеру если у меня частота с генератора 1 герц, то нормально считает 3.6 км/ч, если я ставлю дробное значение частоты, скажем 1.5 гц, то показание всё время меняются. Что это Глюк протеус?
$regfile = "m8def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 16 $framesize = 32 Dim S As Single ' Speed Dim B As Byte ' Помещаем значение из Timer0 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4 Reset Ddrb.1 Config Timer1 = Timer , Prescale = 256 ' Таймер должен переполнятся 1 раз в секунду Config Timer0 = Counter , Edge = Falling ' Счетчик импульсов Timer1 = 0 Enable Timer0 Start Timer0 On Timer1 Speed Enable Interrupts Enable Timer1 Timer1 = 3036 ' Таймер должен переполнятся раз в секуду Cursor Off Cls Locate 1 , 1 Lcd "Test Line" Wait 1 Cls Do ' основной цикл S = B * 36 ' скорость из частоты S = S / 10 Locate 1 , 1 Lcd S Loop Speed: Stop Timer0 ' Останавливая Таймер B = Timer0 ' Забираю значение Timer0 = 0 ' Обнуляю Таймер Timer1 = 3036 Start Timer0 Return