Chip
Я сегодня замерил с помощью старой программы и методом подбора выяснил, что сигнал на комбинации приборов, от которого я пляшу, имеет 24 импульса на 1 оборот колеса - видимо это после преобразования контроллера или датчик такой...или передаточное число в КПП.
В результате получил вполне приемлемые данные, соответствующие показанию спидометра.
Единственно бывает, что скорость отличается на 3-4 км между соседними срабатываниями таймера, например 39 и 36, на самом деле скорость ~40. Выбивание из ряда объясняю тем, что граничные импульсы попали в соседнее срабатывание таймера.
В принципе код вполне устраивает
Код:
#include <MsTimer2.h>
int ledPin = 13; // контакт для светодиода
int switchPin = 30; // контакт для кнопки
int RelayPin = 14; // Контакт для реле
int HallPin = 3; // Контакт для датчика холла
int SpeakerPin=8; // Контакт для динамика
boolean RelayOn = false;
unsigned long speedtime = 0;
int count = 0;
unsigned long time;
float lkolesa;
float Speed;
float TimerInterval=500;
void setup()
{
Serial.begin(115200);
pinMode(SpeakerPin, OUTPUT); // для динамика
pinMode(ledPin, OUTPUT); // для светодиода
pinMode(switchPin, INPUT); // для кнопки
pinMode(RelayPin, OUTPUT); // для реле
pinMode(HallPin, INPUT); // датчик холла
digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
attachInterrupt(1, int_on, RISING);
MsTimer2::set(TimerInterval, flash); // таймер будет срабатывать через каждые 500ms
MsTimer2::start();//запустить таймер
}
void loop()
{
}
void int_on()
{
count++; //увеличить счетчик
}
void flash() //обработка прерывания таймера
{
lkolesa=0.686;
Speed=lkolesa*count*(2400/TimerInterval);
Serial.flush();
Serial.println(count);
Serial.println(Speed);
count=0;
}
Также проверил и более старый код:
Код:
void int_on()
{
count++; //увеличить счетчик volatile
if (count >=24)
{
speedtime = micros()-time; //время прихода 6-ти импульсов
time = micros(); //обнулить
lkolesa=0.686;
Speed=((lkolesa*3600000*4)/speedtime);
Serial.println(speedtime);
Serial.println(Speed);
count = 0;
}
он выдает более точные данные, но реже, только после получения 24 импульсов...
Над твоим новым кодом думаю... учитывая мои 24 импульса.
Код:
void int_on()
{
delta=3030*(micros()-micross);// тут 1 имульс и время за которое он произошел
micross = micros(); //обнулить
}
Мне кажется по одному импульсу судить нельзя, не точно получится
У меня выше тоже самое, но за 24 импульса, возможно стоит за 4 или 6 импульсов судить о скорости