Генератор сигнала Коленвала и распредвала
- Войдите на сайт для отправки комментариев
Мой друг попросил меня сделать преобразователь сигнала коленчатого вала. Т.к. ему поменяли двигатель на не родной. А чтобы панель приборов показывала обороты нужно подать сигнал от старого двигателя. (Сигнал по 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 шиной и решено было оставить старый ЭБУ двигателя который будет посылать на панель обороты. Но этот блок оказался капризный и ему нужны были точные сигналы коленвала и распредвала с "родного" двигателя.
для тех кто набредет на эту тему. Для мотора Honda K20 (24). Вот спустя 4 года, я наконец смог написать нормальный скетч, который хорошо работает хоть до 15 тыс. об мин. И никуда сигналы друг от друга не уплывают. Мне уже конечно это не надо, чисто так, для спортивного интереса.
Аппаратный таймер 1 ардуино в соответствии с заданной частотой вращения коленчатого вала постоянно создает прерывания, соответствующие по времени 1 градусу оборота коленвала, в зависимости от нужного количества градусов в обработчике прерывания формируются сигналы датчиков коленчатого и распределительных валов . Луп не участвует в формировании сигналов, в лупе только в терминале настраивается смещение фаз и обороты колена.
скетч
Аппаратный таймер 1 ардуино в соответствии с заданной частотой вращения коленчатого вала постоянно создает прерывания, соответствующие по времени 1 градусу оборота коленвала...
А почему в качестве единицы задается именно 1/360 часть оборота? Почему, скажем, не 1/256, 1/512 или 1/400?
Ну для удобства и чтобы без дробных частей на зуб. Обычно задающие шкивы коленчатого вала 36 или 60 зубьев, иногда 12 как здесь, может и другие есть, но скорее всего кратно либо 3 либо 6. А разрешение смещения фаз в 1 градус я думаю этого достаточно. Мне смещение вообще было не нужно. Смотря для чего кто сигналы хочет сымитировать.
Наименьшее общее кратное 36, 60, 12, 3 и 6 - 180. Значит, достаточно было сделать 180 прерываний на оборот. 360 - явно избыточно.
Ну как сказать. При задающем диске 60 зубьев, зуб имеет 1 градус и впадина 5 градусов. Если взять квант 1/180 то это будет 2 градуса - зуб в 1 градус сделать не получится.
Что-то я не понял Ваших рассуждений.
А если зуб не 1 градус, а 1.1 градуса, то нам нужно квант до 0.1 градуса уменьшать?
А если там на самом деле вообще периодическая дробь или, не дай Бог, иррациональное число?
А если зуб не 1 градус, а 1.1 градуса, то нам нужно квант до 0.1 градуса уменьшать?
мое рассуждение такое, что если наименьший элемент , в данном случае зуб, размером в 1 градус, то квант должен быть не более 1го градуса. А вы предложили 1/180, что соответствует двум градусам. Имхо, квант в 1 градус необходимо и достаточно, к тому же удобно.
Я не понял проблемы , что такого случиться, если разрешающую способность увеличить? Я ведь ослом на больших оборотах проверял , картина красивая. Понятное дело, что если разрешение ещё увеличивать, то что нибудь да не успеется на высоких оборотах. Но квант в 1 градус всё красиво до 20тыс. об/мин.
мое рассуждение такое, что если наименьший элемент , в данном случае зуб, размером в 1 градус, то квант должен быть не более 1го градуса. А вы предложили 1/180, что соответствует двум градусам. Имхо, квант в 1 градус необходимо и достаточно, к тому же удобно.
С этим рассуждением я не спорю, просто мне хотелось узнать, почему минимальный квант равен 1/360 оборота. Почему, скажем, если шаг зуба 6 градусов, то сам зуб 1 градус, а не 3?
Но, в принципе, цифры еще ко всему и хорошо укладываются в возможности Atmega328. По моим прикидкам максимальная частота прерываний для недлинных операций с управлением пинами лежит где-то в районе 110 кГц, а тут получается близкая величина в 90 кГц.
С этим рассуждением я не спорю, просто мне хотелось узнать, почему минимальный квант равен 1/360 оборота. Почему, скажем, если шаг зуба 6 градусов, то сам зуб 1 градус, а не 3?
Датчики коленвала в большинстве своём бывают либо индуктивные (сигнал синусоида) либо же Холла (прямоугольный сигнал). Дак вот, по моим наблюдениям, в случае с индуктивным, зуб и впадина равны и так бы и было, как вы говорите зуб и впадина по 3градуса. Но речь я вёл про датчик Холла. По какой-то причине автопроизводители зуб при этом делают раз в 5 меньше впадины. Не знаю с чем это связано, но сколько сигналов снимал, всегда так. Вот здесь в соседней теме я и сначала неправильно сделал сигнал - как индуктивный, с равными зубьями и впадинами, потом смотрю, что то не то. Исправил. Можете там сравнить картинку ТС и которую я сначала неправильно сделал, с равными зубами и впадинами.
Здравствуйте. Ардуино только начал изучать. Ваш скетч практически то что нужно, только можете помочь немного переделать, нужна имитация работы датчика холла трамблера. По логике просто -принимаем сигнал с ДХ трамблера и выдаем нужный нам сигнал с нужной скважностью. ( 4х цилиндровый мотор ВАЗ 08-09). Грубо говоря я так понимаю вместо зубьев шкива берем в расчет четыре шторки на валу трамблера. И весь код надо значительно упростить)) - в этом проблема, чтобы его упростить его нужно понять, пока сложно это сделать без вашей помощи.
Не понятно, что именно вам нужно. Мой скетч через Serial получает значение оборотов. В зависимости от оборотов формирует сигналы дпкв и дпрв. Опишите задачу более точно.
Своего рода сделать отсечку оборотов по дх.
Считать показания с датчика холла скважность и частоту, и выдать другой сигнал (на коммутатор зажигания)с прерываниями или выдать чуть другие значения (частоту и скважность, если увеличить или уменьшить возникнут пропуски зажигания) которые не позволят поднимать обороты выше.
Могу реализовать получение сигнала с ДХ, на пин D2 Ардуино, с прерываниями и рассчитать кол-во оборотов коленчатого вала. -это мы получили обороты. Теперь в зависимости от оборотов надо сформировать новый сигнал, с прерываниями такой частоты и скважности чтобы возникла отсечка, пропуски зажигания.
Скважность и частоту можно подобрать опытным путем. А вот как рассчитать и вывести нужный сигнал на пин Ардуино пока сложно.
Не понял при чем тут скважность. Она всегда одна и та же. Размер прорези и закрытой части задающего диска датчика ведь не меняется.
Не проще ли для организации отсечки измерять обороты, и в зависимости от их значения либо пропускать сигнал дальше, либо нет? При отсутствии сигнала как раз и прекратится искрообразование.
Не проще ли для организации отсечки измерять обороты, и в зависимости от их значения либо пропускать сигнал дальше, либо нет? При отсутствии сигнала как раз и прекратится искрообразование.
Хорошая идея. Как реализовать пропускание сигнала?
В обработчике внешнего прерывания CHANGE, добавить типа этого:
if (обороты норм) digitalWrite (нужная нога, digitalRead(2));
Только лучше дергая лапой через регистры
В обработчике внешнего прерывания CHANGE, добавить типа этого:
if (обороты норм) digitalWrite (нужная нога, digitalRead(2));
Только лучше дергая лапой через регистры