Официальный сайт компании Arduino по адресу arduino.cc
Генератор сигнала Коленвала и распредвала
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Мой друг попросил меня сделать преобразователь сигнала коленчатого вала. Т.к. ему поменяли двигатель на не родной. А чтобы панель приборов показывала обороты нужно подать сигнал от старого двигателя. (Сигнал по CAN Шине в панель идет, поэтому пришлось оставить старый ЭБУ для этого)
Ардуина будет от нового двигателя получить сигнал просто тахосигнала определённой частоты.
В зависимости от этой частоты должна меняться частота периодов выдаваемого сигнала с двух каналов ардуины.
Возможно ли такое сделать на ардуине. Вот требуемые сигналы:
Скетч я конечно сделал, но это конечно говновод ещё тот. Работает, но в зависимости от разных оборотов нижний сигнал смещается, особенно после 5000 об/мин.
Подскажите такое возможно на ардуино? если да, готов заплатить за реализацию.
вот мой мега скетч ) там каждый элемент сигнала на отдельном таймере на millis.
вот что получилось с этого скетча на оборотах 1400, но если обороты менять, нижний график уплывает
Я так понимаю нужно делать прямое управление портами через регистры, и аппаратные таймеры использовать, прерывания ещё наверное. Я ещё не дорос до этого.
1. Получаете тахосигнал, измеряете его период
2. на основе периода расчитываете нужные длительности всех интервалов на диаграме.
3. формируете два сигнала начиная с момента где они совпадают, тем гарантируете их совпадение. Делантся без делеев на класической машинке состояний.
4. Обмываете результат за счет друга, публикуете на форуме, читаете восторженые отзывы.
ПС. в скетче позаменяйте строки вида
ckpTime1 = micros();
439
ckpTime2 = micros();
440
ckpTime3 = micros();
на
спасибо попробую
Не помогло. Спецы по таймерам, отзовитесь, плиз. Dimax ,как лучший в этом вопросе , прошу помощи.
1. Получаете тахосигнал, измеряете его период
2. на основе периода расчитываете нужные длительности всех интервалов на диаграме.
3. формируете два сигнала начиная с момента где они совпадают, тем гарантируете их совпадение. Делантся без делеев на класической машинке состояний.
4. Обмываете результат за счет друга, публикуете на форуме, читаете восторженые отзывы.
я не знаю че такое машинка состояний, но код немного переделал.
Измеряется частота (ну или период), другой ардуиной кстати.
Передаётся на эту дуню по сериал.
В зависимости от этой частоты формируется (с помощью библиотеки PWM.h) шим сигнал (коленвала) с одной и той же скважностью, но с изменяемой частотой
подсчитывается каждый импульс (зуб) этого шим сигнала прерыванием. их 12, но я сделал два по 12 итого 24.
В зависимости от номера зуба коленвала создается второй сигнал - зубья распредавала - на micros()
В зависимости от номера зуба коленвала создается третий сигнал - доп. зуб коленвала - на micros()
первый и третий сигналы хочу соединить на лог элементе "И" (К555ЛИ1 ?)
PS использовал теперь низкоуровневое управление портами.
Стало работать гораздо лучше, но всё равно есть нюансы
Код
получилось настроить таймер 1 ардуино чтобы получить такие сигналы. Работает гораздо более стабильно. Кто нибудь подскажите как сделать дополнительные зубья? можно на других пинах, т.к. К555ЛИ1 хорошо сигналы соединяет, попробовал.
поспешил, на частоте более 600 лажа потому что измерение в лупе, надо на второе внешнее прерывание вешать
Вот исправил, теперь вроде как до 1400 Гц стабильный сигнал. Вопрос как создать дополнительный зуб у распредвала и коленвала, не используя micros() остаётся открытым.
получилось вот так
Код
Продолжаю монолог. Всем спасибо за неоценимую "помощь" в освоении таймеров и прерываний. Изначально тахосигнал, с которого нужно было измерять обороты, был такой
т.е. я сначала пытался измерить частоту тахосигнала, а затем выдать свою частоту на сигнал коленвала (т.е. на три импульса тахосигнала нужно выдать 12 импульсов коленвала). Боролся , боролся, все "помогали". Т.е. сгенерировать сигнал то более менее получилось, но вот адектватно измерить часототу тахосигнала не вышло, т.к. все методы либо медленно мереют, либо при прекращении сигнала показывают предыдуще измеренную частоту, а мне надо ноль.
Короче вышел из положения. На установленном двигателе кроме тахосигнала нашел сигнал первичного вала АКПП. На нём гораздо больше импульсов на один оборот коленвала.
Плохо только что немного отличается частота вращения, т.к. гидротрансформатор АКПП немного скользит, да и фиг с ним, не сильно как мне кажется. Зато пропала необходимость измерения частоты. Сигнал этот 5В в отличие от тахосигнала (он на 14В) - пропала необходимость в преобразователе напряжения (до этого использовал оптопару).
В прерывании подсчитываю количество импульсов сигнала этого первичного вала КПП. И в зависимости от номера имульса рулю тупо ногами МК низкоуровнево. Код сократился до нельзя и работает стабильно хоть до 10000 RPM.
Всего одна переменная и луп пустой.
ПС. Информация будет полезна тем, кто на хонде решил поменять рядный 4 цил двигатель К20 или К24 на V6 J30 или J35
Привет. Можешь немного пояснить, только пытаюсь вникнуть в МК, архитектуру и язык С.
01: назначаем порт 3 на вход
02: устанавливаем на входе 3 значение 1
03: запускаем функцию IMPULSE по изменению состаяния на входе
не могу понять с командой attachInterrupt, а именно с единицей, как понял здесь назначается порт по которому идут прерывания, почему 1?
И еще вопрос. Этой прогой ты имитируешь работу датчиков КВ и РВ синхранизируясь по датчику входного вала АКП. Зная к-во зубьев за оборот мы имеем один оборот коленчатого вала (не беря в расчет вероятность проскальзывания муфты). Два оборота вала АКП получаем полный цикл, 2 поворота КВ и один РВ. Хорошо, сигналы этих датчиков мы с имитировали. А как выполняется синхранизация по положению КВ? Те начиная считать зубья с вала АКП программе без разницы фактическое поожение КВ, на каком такте работы находится тот или иной цилиндр. Или я не совсем правильно что то понял
Те начиная считать зубья с вала АКП программе без разницы фактическое поожение КВ, на каком такте работы находится тот или иной цилиндр. Или я не совсем правильно что то понял
да без разницы, т.к. устройство задумывалось просто сымитировать работу двигателя (чтобы тахометр работал).
03: запускаем функцию IMPULSE по изменению состаяния на входе
не могу понять с командой attachInterrupt, а именно с единицей, как понял здесь назначается порт по которому идут прерывания, почему 1?
А зачем такой огород городить ради тахометра. Вам нужно просто знать обороты двигателя. Если датчик коленвала типа Холла - взять сигнал с него, посчитать количество импульсов за оборот. Еще проще взять сигнал управления катушкой зажигания. Можно и с форсунки, но в некоторых режимах форсунки могут отключаться.
Если приборка действительно CAN-овая, то больше сложностей передать сигнал в шину.
В том то и дело, что я на тот момент не умел обращаться с CAN шиной и решено было оставить старый ЭБУ двигателя который будет посылать на панель обороты. Но этот блок оказался капризный и ему нужны были точные сигналы коленвала и распредвала с "родного" двигателя.