считывание импульсов

blink_977
Offline
Зарегистрирован: 10.08.2013

здраствуйте!

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

Так как я не нашел инфу о том, какого типа сигнал там присутствует, я подключил осцилограф. Особо я в осцилографе не шарю, но частота на холостых оборотах была 37гц, ток переменный, потому что он колебался от 47В до -50В.  График типа полусинуса, потому что подъем резкий а спуск плавный. Скорей всего это необработанный сигнал с дачика коленвала.

Теперь вопрос: при подключении этого провода на вход ардуины, нужно ли это сигнал выпрямлять? Или использовать аналоговые входы?

Заранее спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

blink_977 пишет:

выдать один импульс на массу.

Не понял, что здесь имеется в виду.

blink_977 пишет:

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

Это как Вы хотите.

Абсолютный максимум для любого (кроме RESET и GND) ардуиновского пина от -0,5В до Vсс+0,5В (где Vcc - напряжение питания). Так что Вам решать преобразовывать как-то сигнал от -50В до 47В или не надо.

А если преобразовывать, то как именно. Выпрямлять или что-то ещё с ним делать.

 

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

Достаточно подать через резистор 10кОм и стабилитрон на 5 вольт для защиты у ног ардуины поставить.

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

blink_977 пишет:

выдать один импульс на массу.

Не понял, что здесь имеется в виду.

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

то есть я представляю так: провод с тахометра подается через выпрямляющий диод на базу транзистора, через который +5в пойдет на пин ардуины, верно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nik182 пишет:

Достаточно подать через резистор 10кОм и стабилитрон на 5 вольт для защиты у ног ардуины поставить.

Вы уверены? Я на машинные сети не смотрел, что что-то мне кажется, что там шумов должно быть много. А если так ставить, то он любой шум от 3 вольт будет за импульс принимать. Я бы придавил сигнал делителем 1:10, а потом бы уж сделал как Вы говорите. Нет?

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

nik182 пишет:

Достаточно подать через резистор 10кОм и стабилитрон на 5 вольт для защиты у ног ардуины поставить.

Вы уверены? Я на машинные сети не смотрел, что что-то мне кажется, что там шумов должно быть много. А если так ставить, то он любой шум от 3 вольт будет за импульс прнимать. Я бы придави сигнал делителем 1:10, а потом бы уж сделал как Вы говорите. Нет?

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

фишка в том что мне не нужно супер точное определение числа оборотов, ошибка плюс минус 100-150 оборотов не проблема

может оптрон изпользовать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

blink_977 пишет:

может оптрон изпользовать?

Оптрон-то для развязки по-любому не помешает, в этом я согласен.  А так, ТС виднее, он же видел что там за сигналы. Если там есть шумы, то важно не резать лишнее напряжение, а именно пропорционально уменьшать, чтобы 50В импульса превратились, скаже в 5В, в 10В помехи, превратились в 1, а не в те же 5, как было бы при "обрезке".

blink_977
Offline
Зарегистрирован: 10.08.2013

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Диод поставьте. Они ж Вам не нужны? Вам достаточно положительных всплесков, правильно? Ну, поставьте диод анодом в сигналу, он отрицательные "полуволны" срежет. Можете, кстати, полюбоаться на это с осциллографом.

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

Ох не люблю я диодом ничего отрезать в области сигналов. Закрытый диод - большое сопротивление и легкий путь ловли наводок. Пока текут большие токи наводки не работают. Сил у них не хватает. Если не хочется стабилитронов, тогда делитель 10к 1к. Среднюю точку делителя диодами на массу и +5В. И конденсатор 1000 пик на массу. Гарантирую никаких наводок и полную защиту.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Ох не люблю я диодом ничего отрезать в области сигналов. Закрытый диод - большое сопротивление и легкий путь ловли наводок. Пока текут большие токи наводки не работают. Сил у них не хватает. Если не хочется стабилитронов, тогда делитель 10к 1к. Среднюю точку делителя диодами на массу и +5В. И конденсатор 1000 пик на массу. Гарантирую никаких наводок и полную защиту.

спасибо, пойду этим путем

blink_977
Offline
Зарегистрирован: 10.08.2013

вот так?

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

Да. И ещё один диод к плюсу питания. Тогда при привышении напряжения диод откроется и напряжение на входе не превысит Uпит+Uд - около 5.7 вольта.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Да. И ещё один диод к плюсу питания. Тогда при привышении напряжения диод откроется и напряжение на входе не превысит Uпит+Uд - около 5.7 вольта.

добавил диод на +5в, протеус показывает 4.4в, вроде норм.

а при повышении напряжения, 5.7в не многовато для пина ардуины?

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

Нет нормально. Там внутри тоже есть защитные диоды. 10к ограничивает ток. 

blink_977
Offline
Зарегистрирован: 10.08.2013

только немного скачет ток, от 4.29 до 4.4

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

Верхний диод перевернуть надо. И попробовать импульсы +-100 вольт - на входе ардуины должны быть +5.7 -0.7

blink_977
Offline
Зарегистрирован: 10.08.2013

пробовал, ток скачет от 0.6 до 4,2, это от постоянных 50в. импульсы пока не пробовал

с чего так?

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

А мне показалось что там вольтметр на схеме нарисован и показывает вольты а не амперы. Вольты и должны прыгать в зависимости от импульсов.

blink_977
Offline
Зарегистрирован: 10.08.2013

извиняюсь, у меня импульсы поданны были.

от 50в выходит 0.6-4.2

от 100в 0.7-5,7

blink_977
Offline
Зарегистрирован: 10.08.2013

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

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

Ну так правильно. Теперь функцию pulseIn два раза - один раз ловим LOW второй раз HIGH и посчитав среднее имеем точную скорость вращения. Если поставить таймаут милисекунд 300, то если через секунду имеем ноль, то двигатель стоит.

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

Он не может висеть в воздухе. Корпус скорее всего на массе машины. 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Ну так правильно. Теперь функцию pulseIn два раза - один раз ловим LOW второй раз HIGH и посчитав среднее имеем точную скорость вращения. Если поставить таймаут милисекунд 300, то если через секунду имеем ноль, то двигатель стоит.

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

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Он не может висеть в воздухе. Корпус скорее всего на массе машины. 

датчик питается напрямую от бортовой сети, но массу берет с блока управления двигателем, автомобиль BMW E46

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

А масса блока управления двигателем не сидит на массе машины?

blink_977
Offline
Зарегистрирован: 10.08.2013

само собой сидит, но там цифровая масса и аналоговая, они разделенны как то вроде...

ладно, неважно, завтра подключу и все видно будет.

спасибо за помощь

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

Да бывает что разделены или резистором 0.1 Ома или дросселем.

blink_977
Offline
Зарегистрирован: 10.08.2013

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Ну так правильно. Теперь функцию pulseIn два раза - один раз ловим LOW второй раз HIGH и посчитав среднее имеем точную скорость вращения. Если поставить таймаут милисекунд 300, то если через секунду имеем ноль, то двигатель стоит.

Не надо LOW и HIGH. Надо что-то одно, чтобы измерить полный период. Иначе будем мерять часть периода при неизвестной скважности. Выбор переднего или заднего фронта определяется тем, какой из них круче.

blink_977
Offline
Зарегистрирован: 10.08.2013

набросал вот это пока... я только учусь еще, помогите написать до конца, как среднее вычислить?

#define input 2
#define output 3

unsigned long duration1;
unsigned long duration2;


void setup()
{
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT); 
  digitalWrite(3, LOW);
}

void loop() 
{

    duration1 = pulseIn(2, HIGH);
    duration2 = pulseIn(2, LOW);

}

 

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

А что с ним мучится?

Начать можно с такого

#define In1Pin PB0
unsigned long ih,il,tx;
void setup() {
  PORTB= 0x0; 
  DDRB=0x2; // PB1 - выход
}
void loop() { 
while(1){
  ih=pulseIn(In1Pin,HIGH,200000L); 
  il=pulseIn(In1Pin,LOW,200000L);
  if ((ih=0) || (il=0))  continue; // Движок стоит, ничего не делаем
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx > 27000)||(tx<27050))  PORTB= 0; else PORTB = 2; // если где то ХХ то низкий уровнь   
}
}

 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

А что с ним мучится?

Начать можно с такого

#define In1Pin PB0
unsigned long ih,il,tx;
void setup() {
  PORTB= 0x0; 
  DDRB=0x2; // PB1 - выход
}
void loop() { 
while(1){
  ih=pulseIn(In1Pin,HIGH,200000L); 
  il=pulseIn(In1Pin,LOW,200000L);
  if ((ih=0) || (il=0))  continue; // Движок стоит, ничего не делаем
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx > 27000)||(tx<27050))  PORTB= 0; else PORTB = 2; // если где то ХХ то низкий уровнь   
}
}

 

извините за глупый вопрос, я разобраться пытаюсь: куда тут количество оборотов записывается? в tx?

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

andriano пишет:

Не надо LOW и HIGH. Надо что-то одно, чтобы измерить полный период. Иначе будем мерять часть периода при неизвестной скважности. Выбор переднего или заднего фронта определяется тем, какой из них круче.

Надо, Федя, надо ((С) Гайдай) Ксожалению pulseIn не считает период импульов, а только нахождение в состоянии HIGH или LOW. Если время нахождения в HIGH не равно LOW то частоту колебаний правильно не определить. Берём то и то и вычисляем среднее. Это будет не честный период, так как будет считаться не вподряд, а через один. От крутизны фронта зависит только точность.  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Угу. В английской доке этот случай оговорен. В отличие от русской, которую можно понять диаметрально противоположно (как я сначала и понял).

nik182
Offline
Зарегистрирован: 04.05.2015
<div>
Tx это период следования импульсов. Вы написали, что на ХХ частота 37 герц значит период равен 0.027027 сек или 27027 микросекунд. Вот я и вставил условие (строка 13) , что где то рядом ногу тиньке выставлять в 0.</div>
<div>
Что бы посчитать обороты нужно константу, зависящую от числа меток коленовала поделить на период. Если ХХ у вас 700 оборотов то обороты равны 18918900 / tx. Но так как вам нужна только одна точка, то это лишняя операция и сравнение можно проводить просто с периодом.</div>
blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

<div>
Tx это период следования импульсов. Вы написали, что на ХХ частота 37 герц значит период равен 0.027027 сек или 27027 микросекунд. Вот я и вставил условие (строка 13) , что где то рядом ногу тиньке выставлять в 0.</div>
<div>
Что бы посчитать обороты нужно константу, зависящую от числа меток коленовала поделить на период. Если ХХ у вас 700 оборотов то обороты равны 18918900 / tx. Но так как вам нужна только одна точка, то это лишняя операция и сравнение можно проводить просто с периодом.</div>

я спросил про чтение оборотов, потому что просто проверить хотел, как все будет работать... а так мне чтение оборотов не нужно совсем, при 800-900 оборотов, нужно включить какой нибудь пин на пол секунды, и все

а не лучше будет эту ногу в HIGH выставлять, и через транзистор управлять?

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

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

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

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

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

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

а, стоп, то есть при достижении 37 герц он будет ногу выставлять... понятно все

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

 

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

какое такое время? Сколько раз? На каких оборотах? Типа один раз когда с больших к ХХ подходишь или наооборот, когда обороты от ХХ пошли вверх и пересекают 800-900?  Или булькать импульсами пока обороты 800 - 900? И какой длительности импульс? Т.З. надо точнее писать.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

какое такое время? Сколько раз? На каких оборотах? Типа один раз когда с больших к ХХ подходишь или наооборот, когда обороты от ХХ пошли вверх и пересекают 800-900?  Или булькать импульсами пока обороты 800 - 900? И какой длительности импульс? Т.З. надо точнее писать.

дело в том что я пытаюсь впихнуть блок CAS от бмв E60 в свою машину, это блок который управляет старт/стопом, дистанционным управлением, центральными замками, итд... мне вообще всегда нравилось впихивать все что не предназначено для другого) попутно я утоляю свой интерес как это все работает, я провел достаточно много времени разбираясь с тем как он работает, и как обойти те или иные проблемы, которые возникали по ходу, щас мне осталось разобраться с отключением стартера, когда двигатель заведется. в E60 это происходит по CAN шине, и по проводу идущему на блок управления двигателем. по CAN шине сделать это не получится, а вот провод нашелся, и при замыкании его на массу, стартер отключается. импульс должен быть один раз при включенной плате, то есть плата включилась, скетч пошел, один импульс до следующей перезагрузки. про обороты точно пока не могу сказать, так как должен подобрать их экспериментальным путем на автомобиле, я думаю что примерно 700-800... когда обороты с нуля пошли вверх, на 700 нужен импульс на пол секунды, один раз за одно включение платы. импульс длительностью в пол секунды хватит

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

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

Ок. Завтра подправлю под эту задачу. Будет давать один импульс при подъёме от нуля до ХХ и ждать следующего нуля.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Ок. Завтра подправлю под эту задачу. Будет давать один импульс при подъёме от нуля до ХХ и ждать следующего нуля.

 

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

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

Как то  так

#define InPin PB0
#define OutPin PB1
unsigned long ih,il,tx;
bool fl;
void setup() {
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih=0) || (il=0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx < 27000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
}
}

 

blink_977
Offline
Зарегистрирован: 10.08.2013

спаял все на весу для проверки, проверил только что, и что то не то у меня вышло: на проводе тахометра осцилограф показывал RMS - 6.3 вольта, тестер показыает тоже самое, когда я подключаюсь к проводу, ток на нем падает до 3.2 вольта, а на PB0 ардуины у меня 0.3 вольта, и конечно ничего не работает. ток на проводе тахометра должен так падать, когда я к нему подключаюсь?

и еще, я сменил в вашем скетче PB1 на PB5, что бы диод на 13 пине на ардуине моргнул, но домаю это не имеет значения? PB0 - это пин 8 на плате уно, так ведь?

blink_977
Offline
Зарегистрирован: 10.08.2013

вот скрины с осциллографа

без подключения к проводу:

после подключения:

как видно там и ток импульсов падает, это нормально?

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

Падает не ток. Падает напряжение. Можно 10к поменять на 100к, 1к на 10к. Но это не главная проблема. Очень мне сигнал не нравится. Очень хочется посмотреть как выглядит сигнал на конденсаторе в схеме согласования.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Падает не ток. Падает напряжение. Можно 10к поменять на 100к, 1к на 10к. Но это не главная проблема. Очень мне сигнал не нравится. Очень хочется посмотреть как выглядит сигнал на конденсаторе в схеме согласования.

 

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

полезу опять в машину, и выложу скрин

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

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

blink_977
Offline
Зарегистрирован: 10.08.2013

точка соединения резисторов, диодов и конденсатора

входной пин ардуины:

кстати я щас вспомнил, пики не совсем короткие, у меня на 10мс выставленно когда я скрин делал, на 1мс пики не острые а квадратные, только продолжительность я не посмотрел тогда (

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, да у Вас поди конденсатор всё проинтегрировал. Попробуйте из Вашей схемы убрать всё, кроме делителя И посмотрите на сигнал (просто посмотрите, ардуину не подключайте). Он должен быть приличным, если так, ставьте стабилитрон, ну можно ещё резистор перед ним и опять же, посмотрите на выходной сигнал. Он должен быть без отрицательных выбросов, с положительными в пределах 5В. Если всё так, то подключайте ардуину и забудьте о перхоти.

Кстати, а отрицательный выбросы Вам точно не нужны? А то можно и их обработать при желании. Я тут как-то вот такой сигнал в Ардуину заводил (клеточка = 5 Вольт) и он мне нужен был весь (и верхняя часть, и нижняя, могу показать как я это делал, если интересно.