Тахометр на Ардуино (ИЖ ЮПИТЕР)

Sovok
Offline
Зарегистрирован: 25.07.2020

Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание  очень сильно скакают значения. Помогите не знаю что делать. 

Morroc
Offline
Зарегистрирован: 24.10.2016

Усреднять последние N значений ? 

b707
Онлайн
Зарегистрирован: 26.05.2017

Morroc пишет:

Усреднять последние N значений ? 

и делить на N-1 - так точнее :))

b707
Онлайн
Зарегистрирован: 26.05.2017

Sovok пишет:

Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание  очень сильно скакают значения. Помогите не знаю что делать. 

Совок ,врешь,  никакой ты не "совок" совсем. При "совке" все русский знали...

Если по делу - выкладывай свой код., тогда может кто поможет. Без кода пустой разговор.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Шо, опять?      ))))))))))))))))))))))))))))))))))))))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А на ИЖе есть датчик холла ?
Первый раз слышу .
Там же контактный прерыватель.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А если речь идёт о какой то приблуде присобаченной самостоятельно, то нужно описать эту херь и принцип ее работы.
А что бы обороты были точные производить замеры аппаратным таймером.
Усреднять при этом ничего не придется, все будет точно и в режиме реального времени.

Если самостоятельно не сделано ничего и тему перенесут в "Ищу исполнителя", то обращайтесь kakmycmail@gmail.com, опыт создания подобной хренотени имеется

Sovok
Offline
Зарегистрирован: 25.07.2020
#include <TM1637.h>
// Pin 11 - > CLK
// Pin 12 - > DIO
TM1637 tm1637(11, 12);
unsigned long lastflash;
int RPM;
 
void setup() 
{
  Serial.begin(9600);  
  attachInterrupt(0,sens,FALLING); 
  tm1637.init(); 
  tm1637.setBrightness(5); 
}
 
void sens() 
{
  RPM=60/((float)(micros()-lastflash)/1000000);  
  lastflash=micros(); 
}
 
void loop() 
{
  if ((micros()-lastflash)>1000000)
  {
    RPM=0; 
  }
  
  tm1637.dispNumber(RPM);
  Serial.println(RPM);
  delay(50); 
}
 
Вот код, считаю значения с минусового и сигнального провода датчика через делитель. И у меня проблема значения очень сильно скакают и не правильно показивает. Не знаю что делать может кто то что подскажет.
Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну для начала нужно переменную , которая изменяется в прерывании объявить как volatile. Во вторых, это расчет чего ?: RPM=60/((float)(micros()-lastflash)/1000000)

micros()-lastmicros //это время оборота в микросекундах

//Значит сначала нужно узнать сколько оборотов будет за секунду:
1000000/(micros()-lastflash);
//А потом умножить это значение на 60.
RPM=60*(1000000/(micros()-lastflash));

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну и в третьих мотор то двухцилиндровый.

И сигнала за оборот приходит два.

Это вообще не учитываем ?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Кстати нужно выкинуть delay(); и обновлять значения на дисплее , скажем  , два раза в секунду, а не в каждом цикле.

Sovok
Offline
Зарегистрирован: 25.07.2020

Там все правильно считает, у меня проблема в том что все время считает какие то значения даже если датчик не подключен. Я подключал датчик хола с али с ним все работает нормально. не пойму только почему всегда считает какие то значения, подключал опто датчик  такая же проблема. 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Вы читаете ответы? Или мы все впустую пишем?

Sovok
Offline
Зарегистрирован: 25.07.2020

Яж говорю у меня через датчик с али все правильно работает, но я хочу подключится к датчику хола которий стоит на мотоцикле, у мене проблема с напряжением которое видает датчик не знаю как сделать  чтобы работало все правильно как и датчик с али.

 

Sovok
Offline
Зарегистрирован: 25.07.2020

Яж говорю у меня через датчик с али все правильно работает, но я хочу подключится к датчику хола которий стоит на мотоцикле, у мене проблема с напряжением которое видает датчик не знаю как сделать  чтобы работало все правильно как и датчик с али.

 

Sovok
Offline
Зарегистрирован: 25.07.2020

Я понял в чем проблема, у меня провода улавливают помехи от генератора и катушки зажигания. Помогите пожалуста советом что сделать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Экранировать всё в три слоя.

Sovok
Offline
Зарегистрирован: 25.07.2020

Подскажыте чем луче экранировать, я взял екранирований советский тоже были помехи

b707
Онлайн
Зарегистрирован: 26.05.2017

Sovok пишет:
Подскажыте чем луче экранировать, я взял екранирований советский тоже были помехи

а датчик подтянут к плюсу или к минусу? - если нет, то никакие экраны не помогут. будет ловить помехи даже на заглушенном двигателе

Гриша
Offline
Зарегистрирован: 27.04.2014

Sovok пишет:

Здраствуйте, хочу сделать тахометр на ардуино на мотоцикл иж. Считую значения с датчика хола на мотоцикле електроное зажигание, при считивание  очень сильно скакают значения. Помогите не знаю что делать. 

найти схему своего зажигания в инете и выложить сюда - это первое и единственное, если проблема аппаратная.

b707 пишет:

а датчик подтянут к плюсу или к минусу? - если нет, то никакие экраны не помогут. будет ловить помехи даже на заглушенном двигателе

загляните в хрустальный шар внимательнее...  я если честно, ничего не понял, кроме самой идеи.

tpga2008
Offline
Зарегистрирован: 19.04.2020
Тоже похожая проблема.
Датчики пробовал и хола, и ИК, остановился на щелевом оптическом, вроде меньше всего косяков, но все равно проскакивают.
 
Подскажите, пожалуйста, как написать условие, чтобы значения RPM вне диапазона 1000-2000 считать ошибочными и не учитывать в работе?
 
В моем случае это наверное единственный выход, т.к. длина провода до датчика > 2 метров, не помогает даже витая пара в экране, а, поскольку RPM используется не только для вывода на дисплей, но и для управления ТНВД, ошибки недопустимы.
//-----------дисплей-----------
#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); //задержка для стабильности
}

 

 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
void sens() {
static int TempRPM = 0;
TempRPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
if (TempRPM < 2000 && TempRPM > 1000) { 
RPM = TempRPM;
}

 

tpga2008
Offline
Зарегистрирован: 19.04.2020

понял

MaksVV
Offline
Зарегистрирован: 06.08.2015

от помех возле датчика поставить ещё одну ардуино. Длина провода будет минимальная. И обороты передавать по цифровой шине на основную дуню. rs485, uart_ttl и т.д.

sadman41
Offline
Зарегистрирован: 19.10.2016

Как вы умудряетесь с неатомарным чтением переменной из прерывания как-то жить вообще?

MaksVV
Offline
Зарегистрирован: 06.08.2015
//-----------дисплей-----------
#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

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

[quote=MaksVV]

//---------атомик блок
cli(); // отменяем ненадолго прерывания 
unsigned int rpm=RPM;

sei(); // опять включаем прерывания 
/

 

Вообще-то лучше сделать

cli(); // отменяем ненадолго прерывания 
unsigned int rpm = RPM;
sei() 

А дальше использовать в лупе rpm вместо RPM

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

tpga2008 пишет:

Тоже похожая проблема.
Датчики пробовал и хола, и ИК, остановился на щелевом оптическом, вроде меньше всего косяков, но все равно проскакивают.

 

Какая длина импульса от датчика при максимальных оборотах? В прерывании можно несколько раз считать заначени с пина D2 и если получим значиние не соответсвуюшее активному состоянию, то игнорировать

MaksVV
Offline
Зарегистрирован: 06.08.2015

asam пишет:
Вообще-то лучше сделать...

А дальше использовать в лупе rpm вместо RPM

дак я вроде так и сделал, только там вместо rpm  переменная RPM_

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да я уже заметил, хотел поменять свой пост но не успел. Но вообще лучше не давать локальное  переменной имя  отличающееся от глобальной только подчеркиванием. Легко просмотреть неправильное использование. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

согласен, глаз мылится

SLKH
Offline
Зарегистрирован: 17.08.2015

sadman41 пишет:
Как вы умудряетесь с неатомарным чтением переменной из прерывания как-то жить вообще?
а не один ли хрен? на ардуину, питаемую ХЗ каким напряжением в системе с жутким уровнем помех, приходят ХЗ какие импульсы - опять же с ХЗ какими помехами. имхо, твои лямбды с атомарностью (и вообще любой программизм) тут не ранее третьей очереди.

ЧБ
Offline
Зарегистрирован: 26.09.2020

Надо проверить провода на свечи, они должны быть  с резистором или  сам по себе  провод  высокоомный, в ИЖах с завода стоят обычные, без какого-либо намека на  помехагашение, тогда до электроники никому дела не было, так  что  скорее всего их выбросить , это первое что надо сделать. Возможно придется делать  такие помехоподавляющие провода на свечи самому из стандартных  покупных для  автомобилей. Сопротивление провода не менее 2КОм. и лучше брать экранированные. Можете почитать про провода на  свечи, много нового узнаете.