тахометр на ардуино(так и не решена)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вообщем думаю тут эту тему выложить, тема на форуме не однократно "обсасывалась" но никто так готово и не сделал(либо я не нашел) вообщем собрал автозапуск на ардуино с управлением подсоса автомобиля, нужно считать обороты, но в монитор вылазеет всякая ерезь... 

{
  rpm = (1000000.0 / (micros() - microsold)) * 60;
  microsold = micros();
  if (rpm < 300)
  {
    rpm = 0;
  }
  if (microsold > micros())
  {
    microsold = 0;
  }

  microsold = micros();
}

в общем этот кусок считывает обороты. к пину подключен +12В(датчик хола) с катушки зажигания, через делитель, 270 Ом и 150 Ом. ничгео не грееться, рассчитано. но в сериал выодит неверные значения, ну в частвности выводит в 2 раза больше, но это не беда. можно на 2 поделить. а вот проблемма в следующем. выводит иногда в 3-4 раза больше положеного, допустим обороты 1000, в сериал 2000, потом 2000 а потом может до 8000 подпрыгнуть... что не так то.. .вроде в протеусе все норм. глюков нет. причем если ставил 30 и 15 Ом делитель, проблем не было, только превышение в 2 раза, но это не беда(повторяюсь) но 2-ух вытные резисторы ставить - громостко, и машина не заводиться))) когда заведешь с отключеным проводом, потом подключаешь, то работает. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

П.С. словарь Русского мне очень нужен))) согласен))) пишу уже мозги не работают))) все перепробовал. 

nik182
Offline
Зарегистрирован: 04.05.2015

Может подпрыгнуть - значит есть дребезг. Его нужно убрать или аппаратно или программно. 

Не приведено схемы съёма сигнала, нет куска программы обработки входного сигнала - нет предмета обсуждения.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

что то я сначала не увидел, что microsold еще раз приравниваю к micros... завтра попробую, отпишуть, но пока тема актуальна. почему прыжки происходят.. на не постоянное завышение допустим. 

nik182
Offline
Зарегистрирован: 04.05.2015

Дребезг вещь не постоянная. Может конденсатора на 1000 пикофарад на вход ардуины будет достаточно для устранения. Может пропускает программа приема - не понятно как она организована - кода нет.

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вот кусок схемы. 

#define RPMpin 2 // датчик Холла
long microsold = 0;
int rpm = 0;
void setup()
{
 digitalWrite(RPMpin, 1);
  attachInterrupt(0, RPM1, FALLING);
}
void loop()
{
Serial.print("rpm");
  Serial.println(rpm, DEC);
  delay(500);
}
void RPM1 () {
  rpm = (1000000.0 / (micros() - microsold)) * 60;
  microsold = micros();
 }

а вот управелние... 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

питание ардуины lm7805 с обвязкой конденсаторов. по 0.1uF с каждой стороны и для емкости на 2200 с каждой стороны) много))) но что нашел)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

полная схема

nik182
Offline
Зарегистрирован: 04.05.2015

Что где-то было про прерывания и micros() - как то они не дружат. Я бы таймер какой нибудь в прерывании считывал, а потом обнулял.

Каждый раз получал бы точное время. И строчку с вычислением на сякий случай написал бы так rpm = (int)(60000000.0 / (float)(micros() - microsold)) ;

nik182
Offline
Зарегистрирован: 04.05.2015

Если обороты прыгают вверх, значит время прыгнуло вниз. Это может быть если пришёл либо паразитный импульс, либо на длинном проводе звон. Идеальный метод - повесить на ногу 2 не вольтметр, а осцилограф. Смотреть импульсы на ноге и сравнивать с тем, что выдает ардуино. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

"Я бы таймер какой нибудь в прерывании считывал, а потом обнулял."

это как не могу понять

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ну протеус все идеально выдает, там нет смысла осцилографом смотреть. а осцилографа(реального) не имею((( 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

хотя вот что в протеусе показывает

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

опа. поставил на вход 1000pF и вот что получилось 

будем пробовать

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вот что он у меня показывает, поставил кондер на 4700pF на ногу d2 и к земле. 

на самом деле обороты около 1250 были

пробовал на авто

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

поставиил на 100pF изменений нет

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

чувствую никто на форуме не смог решить проблемму и мне не удастся)))) 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Емкость больше 1000 пик не имеет смысла. 

rpm должен быть объявлен как volatile unsigned int

Посмотри скеч ReadReciver.pde из примера библиотеки  Timer1

http://playground.arduino.cc/Code/Timer1

В setup инициализируется и стартует Timer1 - можно в его прерывании проверять, что двигатель стоит. Инициализировать надо значением немного большим чем период импульсов при минимальном вращении двигателя.  

Timer1.initialize(300000); // min rpm 200

Timer1.stop(); Timer1.restart(); Timer1.start();

В твоем прерывании

rpm=60000000.0/ (float)Timer1.read(); Timer1.restart();  Timer1.start();

 

StrangerM
Offline
Зарегистрирован: 02.11.2013

Да с переменными повнимательней - зачем в формуле число с дес. точкой? И разрешение прерывания я бы в луп вставил, после пустой цикл для счета во время его. С с запрещением прерывания при всех остальных деяниях. Особенно принте.

nik182
Offline
Зарегистрирован: 04.05.2015

Загрузил Ваш скетч в Нано. На второй сделал генератор меандра с изменяемой частотой. Всё показывает как задумано. Никаких скачков нет. При изменении периода меандра показания тахометра меняются от 200 до 6000. Все вопросы к Вашему сигналу с датчика Холла. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

т.е. мой скетч работает? это сама машина тупит?

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вот поэтому я и вывел в раздел аппаратные вопросы, тоже так думал(что датчик хола), потому что програмно, с чистыми импульсами - все работает... в программе Proteus 8 Professional. как вот сгладить эти помехи, если кондер не помогает. на педаль акселератора давлю, все изменяться в окне сериал , пропорционально, нормально. у меня есть БК(не штатный) может как нибудь к нему попробовать подцепиться? и вообще сделаать допустим на аналоговый вход.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

d13lider, вы поймали типовой глюк с внешним прерыванием. Не вы первый, таких постов было не меньше десятка за последнюю пару лет. Глобальных решений этой проблемы пока мне неизвестно, любое из известных решений -это обход проблемы. Наиболее удачный обход -это перечитать в прерывании вход, и выполнять команду только если уровень действительно тот, который должен быть. На одном из своих проектов я сам словил этот глюк, причём вычислил источник помехи -это был энкодер висящий вообще на других пинах. Причём когда я отлаживал, и энкодер висел на проводках -глюка небыло. Как спаял на плате -появился глюк. Крутишь энкодер -срабатывает прерывание!  Из чего можно сделать вывод, что паршиво сделал разводку. Думаю у вас то-же самое.

nik182
Offline
Зарегистрирован: 04.05.2015

Я всётаки поискал бы осцилограф. Кратность скачков намекает на просечки в сигнале датчика Холла. Конденсатор тут не поможет. Совет перечитать ещё раз вход внутри прерывания правильный - если поможет - значит наводка. Если не поможет, то просечки датчика. Что типа 

void RPM1 ()
 {
 for (i=0;i<20;i++); 
 if (digitalRead(RPMpin) == LOW){
  rpm = (1000000.0 / (micros() - microsold)) * 60;
  microsold = micros();
  }
 }

 

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

Я бы компаратор с триггером поставил. На триггере порезал частоту, а компаратором подстроился к 80-90% уровню сигнала (задавил шумы). А по сути, трудно рассуждать без осциллографа. Более чем уверен, что по общему проводу в авто много разного можно поймать. Как выше уже написано, разводка платы и точки подключения проводов имеют весомое значение.

StrangerM
Offline
Зарегистрирован: 02.11.2013

Есть еще триггер Шмидта.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

П.С. у меня висят на 3-4 пине gsm модуль, который тоже с частотой какой -то работает и еще серво привод. может это влиять же?

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

d13lider пишет:

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

П.С. у меня висят на 3-4 пине gsm модуль, который тоже с частотой какой -то работает и еще серво привод. может это влиять же?

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

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

d13lider пишет:

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

почитайте для начала тут      LM2907

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

d13lider пишет:

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

Если уж говорить об альтернативных решениях, то есть решения  лучше того, что у вас было, и без всяких преобразователей. Сделать счёт импульсов на  таймерах.  Примеры как это делать я давал на форуме.   Для частоты до 2кГц   и для более высоких частот   Или можно просто взять библу частотометра, она на том-же принципе :)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

23 пост вообще не отрицаю, я впервые разовдил плату... возможно помехи и от наводок... тоже не отрицаю., на счет команду выполнять- я и буду выполнять команду, но мне надо допустим если обороты больше 1200 крутнуть серву на (серва 360) на секолько милисекунд влево, если меньше 900 -вправо. и для этого надо мерить обороты постоянно и точно(относительно). про LM почитаю - отпишусь. dimax, тоже спасибо огромное. все дали темы для размышления. буду обдумывать отпишусь, огромное спасибо. dimax. но там мне вообще надо измерять частоту до 100hz максимум. думаю твой способ подойдет. полистаю тему. но это снова новый скетч. будет ли он работать даже если будут наводки? при плохой разводке.я вот не могу понять, я же в своем скетче тоже счиал импульсы за определенный период времени, или я ошибаюсь? в чем отличие вашего от моего? алгоритм? 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

d13lider, ваш чисто программный. Мой программно-аппаратный, т.к. таймер -это отдельное устройство внутри МК. Но главное с таймером нет такого глюка, как с внешним прерыванием INT, он более устойчив к наводкам на МК, т.к. у него есть специальный режим шумоподавления на входе захвата (ICP).  Для начала можно попробовать менее радикальные способы, например поменять логику выхода в прерывание на RISING, убрать диод с входа, и сделать резистором пул-даун на землю. Иногда это спасает от глюка.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

d13lider, нет. для измерения низких частот используется несколько другой способ. Таймер запускается, и считает такты контроллера своим счётным регистром, а в момент прихода фронта внешнего импульса вываливается в прерывание, и в регистре захвата можно считать число тактов с прошлого прерывания. Это число можно пересчитать в любые удобные единицы. Это очень быстрый способ измерения, требуется всего 1 период внешнего сигнала для вычисления его частоты. 

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

У меня в машине давно стоит тахометр-вольтметр на про мини. Сигнал оборотов берется из специальной линии к которой подключены эбу которым он нужен. Сам сигнал формирует эбу двигателя по датчику коленвала. Тахометр считает по прерываниям, остальное время уходит на динамическую индикацию. Никаких сбов и помех. Схему и скетч могу поискать. Только если найду, то будет скан с бумаги, вырисовывать лень :)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Alex_Sk. у меня нет ЭБУ

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

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

Разница может быть в том, что в эбу питание фильтруется и помехи не проходят на выход для тахометра. А в датчике Холла на выходе будет вся "грязь" с питающего провода. А в бортсети "грязи" хватает. Может стоит попробовать зафильтровать питание Холла?

nik182
Offline
Зарегистрирован: 04.05.2015

Alex_Sk пишет:

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

Я тоже так думал, пока не попал на конкретный дребезг от датчика Холла. Он же на магнитное поле срабатывает, а оно может иметь рип. Рядом полно магнитных железок крутится и в области срабатывания датчика поле колеблется. Хватает на то чтобы 2 - 3 коротких импульса иногда проскакивали. Зависит от датчика Холла - с гистерезисом или нет.

Проверить после прерывания подтянут сигнал или нет попробовали?  

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

Насколько понимаю, речь об автомобильном трамблере. Там ДХ с гистерезисом и вроде выход с ОК.

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

Нужно чтобы автор указал тип ДХ и что еще к нему подключено (скорее всего коммутатор стандартный или самодельный).

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Alex_Sk, мне кажется вы совершенно напрасно так активно продвигаете идею плохого сигнала с датчика. Я конечно ничего не исключаю, но! Прерывание INT0 склонно глючить от наводок на любом входе мк, и  особо обожает глючить от наводок "в землю", которые без хорошего осциллографа просто не увидеть.   Вот картинка для примера:

Это сигнал на одном их входов МК. Обратите внимание на выброс в отрицательную область амплитудой примерно 0,7в Вот этой микросекундной загагулинки достаточно что-бы вызвать ложное срабатывание прерывания INT0.  А вызвать его может любая ёмкостная составляющая на низкоимпендансном источнике сигнала.

nik182
Offline
Зарегистрирован: 04.05.2015

Как по мне, в схеме делитель на входе явно лишний. Сигнал должен быть подан прямо на диод, а за диодом цепь из резистора 1к на +5V  и конденсатора на 1000 пик на землю. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

а если диод пробьет? и 14 вольт бахнет в дуину?

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

это все устанавливаеться на audi 80. ДХ какой там, не знаю. катушка бош. траблер бош.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

nik182
Offline
Зарегистрирован: 04.05.2015

Если диод пробьет то от такого импульса и делитель не спасёт. Я вообще не люблю не обвязанные диоды. В обратном направлении у них сорпротивление бесконечность. При закрытии диода у вас на ноге образуется высокое сопротивление из внутреннего подтягивающего резистора, на котором легко собираются наводки. Т.е. надо либо диод убирать, либо делитель за него переносить. Без этого наводки будут собираться. С переносом тоже не всё просто - надо помнить о подтягивающем резисторе.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

подтягивающий внутренний успользую

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

т.е. попробовать диод перенести? а может еще на ДХ кондер повесить?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ну делитель вообщем попробую без делителя и через один диод, с подтягивающим резистором

 

nik182
Offline
Зарегистрирован: 04.05.2015

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

nik182, ну я это и имел ввиду) после завтра только машина будет. попробую.