Подсчет оборотов двигателя от датчика коленвала

Gumel
Offline
Зарегистрирован: 03.01.2016

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

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

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

http://compcar.ru/forum/attachment.php?attachmentid=18429&stc=1&d=142441... пример шкива где хорошо виден пропуск зубьев.

Надеюсь понятно изложил. Кстати на малых оборотах обороты коленвала особенно не равномерны и угловая скорость не постоянна.

Не знаю как это релизовать в програмном коде.

Alexino
Offline
Зарегистрирован: 29.12.2015

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

Gumel
Offline
Зарегистрирован: 03.01.2016

Нужно и считать зубья и ловить пропуск.

ESV
Offline
Зарегистрирован: 16.12.2015

Задача ассемблерная.

Alexino
Offline
Зарегистрирован: 29.12.2015

Gumel пишет:

Нужно и считать зубья и ловить пропуск.
Ну тогда нет никаких проблем.
Создаёте буфер (массив) из количества ячеек, не меньше количества зубьев на вале. Лучше раза в 2-3 больше.
Измеряете периоды между импульсами и укладываете их в массив по кругу (кольцевой буфер).
В любое время, в лупе, забираете этот буфер и имеете там множество чистых периодов и один (или несколько) большой(их). Большие - это пропуски.
Дальше уже обрабатывайте эти значения как Вашей душе угодно. Можно повыкидывать большие, если они Вам не нужны, а остальные, чистые, усреднить. Можно не усреднять, а брать самый кпримеру маленький из них, или большой, ну или средний. В общем, там уже креативите как хотите, вариантов множество, всё зависит от задачи.

Alexino
Offline
Зарегистрирован: 29.12.2015

ESV пишет:

Задача ассемблерная.

С чего это ? Что тут такого, с чем можно справиться только на ассемблере ?

Gumel
Offline
Зарегистрирован: 03.01.2016

Спасибо чуть-чуть прояснилось.

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

Если корректор УОЗ стоит в 0, то корректировки производиться не должно, т.е. считываем данные и тут же дублируем их на другом выходе.

Если корректор УОЗ(Alfa измеряется в градусах) стоит в запаздывание(меньше 0) то дублируем данные с коленвала, но с дополнительной задежкой(Tуоз в секундах) Туоз=

Тзуб - время между началами импульсов от каждого зуба

Подсчет оборотов в минуту  = Обм=58 / Тзуб1+Тзуб2...+Тзуб58 В идеале подсчет должен производиться после каждого зуба, т.е. Обм=58/Тзуб2+Тзуб3+....+Тзуб58+Тзуб1 (58 количество зубов на шкиве, если бы пропуска не было бы, то было бы 60 зубъев)

Туоз=6/(Обм* (-1)*Alfa) 

Если Alfa>0 тогда начинаем считать Тзуб до тех пор пока Тзуб1,2,3,...,58. не заполнятся

Грубо говоря должны получить таблицу : 0.001, 0.003(тут пропуск 2-х зубов), 0.001.... 0.001. 

Вот тут самое интересное.... Туоз=Тзуб58-6/(Обм*Alfa) Получим время через которое Ардуино должен подать подать мнимый импульс продолжительностью Тимп = 1/(2*Обм) В данном случае Тзуб58 это табличное время прохождения зубом или... короче вот тут затуп у меня из-за этого пропуска на шкиве. Надо предугодать как-то по началу последнего пика от датчика прибавить время Тзуб взятой из таблицы именно этого зуба и вычесть время Туоз (Туоз=6/(Обм* (-1)*Alfa) ) и через это время подать импульс продолжительностью Тимп = 1/(2*Обм).

Как это правильно формульно записать ума не приложу, поправьте если что не так.

Может алгоритм более простой найдете, целый вечер убил на написание этого поста.

По данной формуле теоритически можем сместить уоз на 6 градусов(т.к. у нас 60 секторов на которые разделен маховик зубъями два из которых отсутсвуют 360/60=6 градусов)

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Gumel, пропущено 2 зуба, значит длина импульса пропуска в 3 раза больще длины обычного импульса. Этот момент и нужно поймать. Попробуй так: заведи три таймера Tcur - текущего зуба, Tprev - предыдущего зуба и T - обороты двигателя. Если Tcur/Tprev > 2 значит пропуск зуба, запоминай Т и сбрасывай в ноль. 1/Т это частота вращения коленвала.