Тахометр на Ардуино (ИЖ ЮПИТЕР)
- Войдите на сайт для отправки комментариев
Сб, 25/07/2020 - 09:10
Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание очень сильно скакают значения. Помогите не знаю что делать.
Усреднять последние N значений ?
Усреднять последние N значений ?
и делить на N-1 - так точнее :))
Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание очень сильно скакают значения. Помогите не знаю что делать.
Совок ,врешь, никакой ты не "совок" совсем. При "совке" все русский знали...
Если по делу - выкладывай свой код., тогда может кто поможет. Без кода пустой разговор.
Шо, опять? ))))))))))))))))))))))))))))))))))))))
А на ИЖе есть датчик холла ?
Первый раз слышу .
Там же контактный прерыватель.
А если речь идёт о какой то приблуде присобаченной самостоятельно, то нужно описать эту херь и принцип ее работы.
А что бы обороты были точные производить замеры аппаратным таймером.
Усреднять при этом ничего не придется, все будет точно и в режиме реального времени.
Если самостоятельно не сделано ничего и тему перенесут в "Ищу исполнителя", то обращайтесь kakmycmail@gmail.com, опыт создания подобной хренотени имеется
Ну для начала нужно переменную , которая изменяется в прерывании объявить как volatile. Во вторых, это расчет чего ?: RPM=60/((float)(micros()-lastflash)/1000000)
Ну и в третьих мотор то двухцилиндровый.
И сигнала за оборот приходит два.
Это вообще не учитываем ?
Кстати нужно выкинуть delay(); и обновлять значения на дисплее , скажем , два раза в секунду, а не в каждом цикле.
Там все правильно считает, у меня проблема в том что все время считает какие то значения даже если датчик не подключен. Я подключал датчик хола с али с ним все работает нормально. не пойму только почему всегда считает какие то значения, подключал опто датчик такая же проблема.
Вы читаете ответы? Или мы все впустую пишем?
Яж говорю у меня через датчик с али все правильно работает, но я хочу подключится к датчику хола которий стоит на мотоцикле, у мене проблема с напряжением которое видает датчик не знаю как сделать чтобы работало все правильно как и датчик с али.
Яж говорю у меня через датчик с али все правильно работает, но я хочу подключится к датчику хола которий стоит на мотоцикле, у мене проблема с напряжением которое видает датчик не знаю как сделать чтобы работало все правильно как и датчик с али.
Я понял в чем проблема, у меня провода улавливают помехи от генератора и катушки зажигания. Помогите пожалуста советом что сделать.
Экранировать всё в три слоя.
Подскажыте чем луче экранировать, я взял екранирований советский тоже были помехи
а датчик подтянут к плюсу или к минусу? - если нет, то никакие экраны не помогут. будет ловить помехи даже на заглушенном двигателе
Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание очень сильно скакают значения. Помогите не знаю что делать.
найти схему своего зажигания в инете и выложить сюда - это первое и единственное, если проблема аппаратная.
а датчик подтянут к плюсу или к минусу? - если нет, то никакие экраны не помогут. будет ловить помехи даже на заглушенном двигателе
загляните в хрустальный шар внимательнее... я если честно, ничего не понял, кроме самой идеи.
//-----------дисплей----------- #include <Arduino.h> #include <TM1637Display.h> // Контакты для подключения модуля (цифровые контакты) #define CLK 4 #define DIO 5 TM1637Display display(CLK, DIO); //--------дисплей------- volatile int unsigned long lastflash; volatile int RPM; void setup() { Serial.begin(9600); //открыть порт display.setBrightness(2);//яркость дисплея // определить состояни ног 8 и 9 для исключения ложных сработок при включении digitalWrite(8, HIGH); digitalWrite(9, HIGH); //-------Счетчик оборотов---------- attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала pinMode(3, OUTPUT); //3 пин как выход на датчик pinMode(8, OUTPUT); //8 пин как выход на ТНВД в - pinMode(9, OUTPUT); //9 пин как выход на ТНВД в + digitalWrite(3, HIGH); //подать 5 вольт на 3 пин } void sens() { RPM=60/((float)(micros()-lastflash)/1000000); //расчет lastflash=micros(); //запомнить время последнего оборота } void loop() { display.showNumberDec(RPM, false); //вывод на дисплей оборотов коленвала (норма 1330) if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды RPM=0; //считаем что RPM 0 } //---------контроль оборотов------- //норма 1330 оборотов if (RPM>1350){ //если обороты увеличатся на 20 об/мин digitalWrite(9, HIGH);//защита от одновременного включения с 9 пином digitalWrite(8, LOW); //подать 1 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов; } else if (RPM<1310){ //если обороты уменьшатся на 20 об/мин digitalWrite(8, HIGH);//защита от одновременного включения с 8 пином digitalWrite(9, LOW); //подать 1 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов; } else if (RPM > 1325 && RPM < 1335){ //когда обороты больше 1325 и меньше 1335 //подать 5 вольт на 8 и 9 пины для откл мотора ТНВД digitalWrite(9, HIGH); digitalWrite(8, HIGH); } Serial.println(RPM); //вывод в порт delay(200); //задержка для стабильности }void sens() { static int TempRPM = 0; TempRPM=60/((float)(micros()-lastflash)/1000000); //расчет lastflash=micros(); //запомнить время последнего оборота if (TempRPM < 2000 && TempRPM > 1000) { RPM = TempRPM; }понял
от помех возле датчика поставить ещё одну ардуино. Длина провода будет минимальная. И обороты передавать по цифровой шине на основную дуню. rs485, uart_ttl и т.д.
Как вы умудряетесь с неатомарным чтением переменной из прерывания как-то жить вообще?
//-----------дисплей----------- #include <Arduino.h> #include <TM1637Display.h> // Контакты для подключения модуля (цифровые контакты) #define CLK 4 #define DIO 5 TM1637Display display(CLK, DIO); //--------дисплей------- volatile int unsigned long lastflash; volatile int RPM; void setup() { Serial.begin(9600); //открыть порт display.setBrightness(2);//яркость дисплея // определить состояни ног 8 и 9 для исключения ложных сработок при включении digitalWrite(8, HIGH); digitalWrite(9, HIGH); //-------Счетчик оборотов---------- attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала pinMode(3, OUTPUT); //3 пин как выход на датчик pinMode(8, OUTPUT); //8 пин как выход на ТНВД в - pinMode(9, OUTPUT); //9 пин как выход на ТНВД в + digitalWrite(3, HIGH); //подать 5 вольт на 3 пин } void sens() { RPM=60000000UL/(micros()-lastflash); //расчет оборотов lastflash=micros(); //запомнить время последнего оборота } void loop() { static int RPM_ = 0; static uint32_t prev_printTime = 0; //---------атомик блок cli(); // отменяем ненадолго прерывания if ((micros()-lastflash)>1000000UL) RPM=0; //если сигнала нет больше секунды считаем, что RPM 0 if (RPM < 2000 && RPM > 1000) RPM_ = RPM; //RPM_ = RPM; // можно и так попробовать, коментируя предыдущую строку, без отбрасывания значений sei(); // опять включаем прерывания //---------атомик блок //---------контроль оборотов------- //норма 1330 оборотов if (RPM_>1350){ //если обороты увеличатся на 20 об/мин digitalWrite(9, HIGH);//защита от одновременного включения с 9 пином digitalWrite(8, LOW); //подать 1 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов; } else if (RPM_<1310){ //если обороты уменьшатся на 20 об/мин digitalWrite(8, HIGH);//защита от одновременного включения с 8 пином digitalWrite(9, LOW); //подать 1 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов; } else if (RPM_ > 1325 && RPM_ < 1335){ //когда обороты больше 1325 и меньше 1335 //подать 5 вольт на 8 и 9 пины для откл мотора ТНВД digitalWrite(9, HIGH); digitalWrite(8, HIGH); } //---------отладка------- if (millis() - prev_printTime>500) { Serial.println(RPM_); //вывод в порт display.showNumberDec(RPM_, false); //вывод на дисплей оборотов коленвала (норма 1330) prev_printTime = millis(); } }//end loop[quote=MaksVV]
Вообще-то лучше сделать
А дальше использовать в лупе rpm вместо RPM
Какая длина импульса от датчика при максимальных оборотах? В прерывании можно несколько раз считать заначени с пина D2 и если получим значиние не соответсвуюшее активному состоянию, то игнорировать
А дальше использовать в лупе rpm вместо RPM
дак я вроде так и сделал, только там вместо rpm переменная RPM_
Да я уже заметил, хотел поменять свой пост но не успел. Но вообще лучше не давать локальное переменной имя отличающееся от глобальной только подчеркиванием. Легко просмотреть неправильное использование.
согласен, глаз мылится
Надо проверить провода на свечи, они должны быть с резистором или сам по себе провод высокоомный, в ИЖах с завода стоят обычные, без какого-либо намека на помехагашение, тогда до электроники никому дела не было, так что скорее всего их выбросить , это первое что надо сделать. Возможно придется делать такие помехоподавляющие провода на свечи самому из стандартных покупных для автомобилей. Сопротивление провода не менее 2КОм. и лучше брать экранированные. Можете почитать про провода на свечи, много нового узнаете.