Генератор сигналов для тестирования системы электронного зажигания
- Войдите на сайт для отправки комментариев
Всем доброго дня.
Задался целью собрать генератор сигналов на Ардуино Uno R3. Требуемые параметры:
1. Генерация импульсов для двух датчиков (2 канала), 128 зубьев на маховике, 3 флага ВМТ (1 флаг на 67 зубе для ВМТ 1 группы цилиндров, 2 флага на 1 и 4 зубьях для ВМТ 2 группы)
2. Имитируемая частота вращения КВ (RPM) - 200-10000 об/мин.
3. Частота импульсов первого датчика (ДУИ) - (RPM/60)*128, скважность 2.
4. Частота импульсов второго датчика (ДНО) комбинированная, складывается из двух:
- RPM/60, скважность 256. (один из флагов второй группы)
- (RPM/60)*2, скважность 128 (флаг первой группы и один из флагов второй группы, разнесённые на 180 градусов).
- Сдвиг между первой и второй группой - 3 зуба.
За основу взял код из темы http://arduino.ru/forum/programmirovanie/arduino-push-pull
/*Двухканальный генератор для 128-зубого маховика и 2 датчиков: ДНО и ДУИ ДНО имеет 1 на ВМТ первого цилиндра и две последовательных единицы через 3 зуба на ВМТ второго цилиндра ДУИ имеет 1 на каждый зуб, 0 на отсутствии зуба Цифр.выходы 3 и 4 - ДНО. Цифр.выходы 5 и 6 - ДУИ. */ void (*mas[]) (void)={dead_time, tooth1, tooth2}; // массив указателей функций int RPM=600; //Указываем частоту вращения, об/мин volatile int val_fr = 16000000/((RPM/60)*256); // Вычисляем длительность полупериода для Ардуино 16 МГц byte uk=0; byte dead=0; byte z=1; void setup() { DDRD = B00111100; // нужные пины на выход PORTD = B00000000; //Всем портам ставим лог. 0 TCCR1A=0; TIMSK1=0; // сбрасываем на всякий эти регистры TCCR1B=0; // мало ли что arduino IDE туда записало TCNT1=0; // сбрасываем счетный регистр таймера 1 OCR1A=0; // задаем частоту, в Герцах, по формуле f=F_CPU/OCR1A/2 где F_CPU тактовая частота ардуины TIMSK1|=(1<<OCIE1A); // разрешаем генерацию прерывания таймера 1, по совпадению с регистром OCR1A TCCR1B|=((1<<CS10)|(1<<WGM12)); // запускаем таймер 1 без предделителя в режиме СТС } void loop() { } ISR(TIMER1_COMPA_vect) { OCR1A=val_fr/2; //Настраиваем таймер на полупериод колебания if (z=128) z=1; //Начинаем цикл заново if (dead=1) uk=0; //Указатель на функцию мёртвой зоны по флагу отсутствия зуба if (z=1) uk=2; // Указатель на функцию ДНО+ДУИ для 1 зуба if (z=4) uk=2; // Указатель на функцию ДНО+ДУИ для 4 зуба if (z=67) uk=2; // Указатель на функцию ДНО+ДУИ для 67 зуба (*mas[uk])(); // вызываем функцию по указателю } void dead_time(void) // функция 0 { PORTD = B00000000; // На всех пинах лог 0, формируем мёртвую зону (отсутствие зуба) z++; //Увеличиваем счётчик зуба uk=1; // Ставми указатель на функцию зуба ДУИ dead=0; //Убираем флаг отсутствия зуба } void tooth1(void) // функция 1 { PORTD = B00010000; // на пин 5 лог 1, формируем зуб ДУИ dead=1; //Ставим флаг отсутствия зуба } void tooth2(void) // функция 2 { PORTD = B00010100; // на пины 3 и 5 лог 1, формируем зуб ДУИ + флаг ДНО dead=1; //Ставим флаг отсутствия зуба }
Вопрос: будет ли оно работать, как задумано? (осциллографа под рукой нет, а система зажигания в гараже).
Апдейт. Во всех описаниях порт3 = порт2, порт5 = порт4 :-)
Пставил вместо зажигалки 2 светодиода, включил на минимальную частоту 150об/мин (при 100 в 16-битный регистр OCR1A будет пытаться записаться значение 16000000/((100/60)*128)=75000, а максимум - 65535), ожидал увидеть моргание диода на порту 2 с частотой примерно 5 Гц, а на порту 4 - примерно 320 Гц (т.е.постоянное свечение). Оба светляка светятся постоянно. В чём ошибка - пока не понял.
1. насчет скважности 2 уверены или предполагаете?
2. лямбду не будете симулировать ?
1. Насчёт скважности 2 предполагаю. Электромагнитный датчик даёт синусоидальный сигнал в одном полупериоде (зуб под датчиком) и "полку" на нуле (зуба нет). Соответственно, лучшим выходом было бы эмулировать синусоиду, но это довольно ресурсоёмко. Хотя на частоте врщения 10000 об/мин прерывание происходит каждые 750 тактов, и в теории должно хватать, но всё же попробую с прямоугольным сигналом и скважностью 2.
2. Нет, пока иду "от простого" - 2 датчика. Затем - прикрутить LCD и кнопку для оперативного выбора частоты оборотов м индикации их на дисплее. Затем - остальное, по мере надобности.
Есть! Ошибка была в операторах сравнения. Вдобавок для визуального контроля через светодиоды поставил делитель /64 для таймера. Минимальное значение RPM стало 60 (иначе почему-то уходит в быстрое моргание, подозреваю, что это связано с операцией (RPM/60)*128) с типом int, но не уверен.
Теперь надо проверять осциллографом и прикручивать LCD с кнопками.
1. Насчёт скважности 2 предполагаю. Электромагнитный датчик даёт синусоидальный сигнал в одном полупериоде (зуб под датчиком) и "полку" на нуле (зуба нет). Соответственно, лучшим выходом было бы эмулировать синусоиду, но это довольно ресурсоёмко. Хотя на частоте врщения 10000 об/мин прерывание происходит каждые 750 тактов, и в теории должно хватать, но всё же попробую с прямоугольным сигналом и скважностью 2.
2. Нет, пока иду "от простого" - 2 датчика. Затем - прикрутить LCD и кнопку для оперативного выбора частоты оборотов м индикации их на дисплее. Затем - остальное, по мере надобности.
Скважность заведомо > 2, и имеет значение только фронт импульса (по какому переднему или задн читает ваш эбу не знаю). Стандартно стоит датчик Холла, на полпериоде сигнал далек от синуса и можно заменить прямоугольником. Можно добавить +- небольшую регулировку скважности, а еще проще .
Кстати, вы какой ЭБУ тестируете?
Стандартно стоит электромагнитный датчик 14.3847, у всех знакомых мне ЭМ датчиков сигнал - синусоида.
ЭБУ от двигателя ВАЗ-411.
Скважность, возможно и >2 - это сейчас не очень важно. Если блок не будет реагировать на Ардуино - возьму осциллограф, померю форму импульсов на датчиках при вращении двигателя, буду пытаться приводить скважность к оригиналу. Добавить регулировку скважности довольно просто - согласен.
ЭБУ от двигателя ВАЗ-411. Скважность, возможно и >2 - это сейчас не очень важно. Если блок не будет реагировать на Ардуино - возьму осциллограф, померю форму импульсов на датчиках при вращении двигателя, буду пытаться приводить скважность к оригиналу. Добавить регулировку скважности довольно просто - согласен.
не прямо от дуины, а лучше через оптрон или хотя бы через ключ
Оптика... Как вариант, но я планировал использовать только резистор. Хотя, наверное, оптическая развязка будет правильнее, согласен.
Нет, вот такое:
про ва3 411 я даже не слышал про такой, может быть ГАЗ ?
вижу 2 коммутатора, и наверное то что слева и есть ЭБУ?
ЭБУ хочет хоть какой-нибудь сигнал на входе :-) У электромагнитных датчиков очень широкие пределы - от десятых долей вольта до десятков вольт, в зависимости от скорости штифта под ним. Вот в целях защиты ардуины оптика - это правильно.
Да, справа 2 коммутатора, слева - ЭБУ.
Именно ВАЗ-411. Погуглите, узнаете много интересного :-)
Вопрос: будет ли оно работать, как задумано? (осциллографа под рукой нет, а система зажигания в гараже).
Вам тоже доброго дня!
По каким признаком кроме поймете, что система работает?
дык это же роторный времен ссср брежнева-горбачева очень большая редкость
Да, это именно он и есть.
Еще увидите по реакции ШД ХХ, наверное такой предусмотрен, хотя модельЭБУ уважаемый раритет.
На некоторых ЭБУ ширина импульса для форсунок постоянна, а количество бензина изменяется дополнительными импульсами. Есть на таком ЭБУ датчик детонации и как будете иммитировать его ?
По оценкам, полупроводники тех лет "живут" до 40...50 лет пока не произойдет диффузия p-n переходов.
Этот блок управляет только зажиганием и предупрждает о превышении оборотов. Двигатель карбюраторный.
Используемые датчики - ДНО+ДУИ для определения положения КВ, ДТОЖ для определения "прогретости", имитируется подключением соответсвующего резистора и ДАД для определения давления на впуске -> режима работы двигателя (насколько открыта заслонка). ДАД возвращает напрояжение 0,5...4,5В, имитируется сборкой резисторов с шагом 0,5В.
Используемые датчики - ДНО+ДУИ для определения положения КВ, ДТОЖ для определения "прогретости", имитируется подключением соответсвующего резистора и ДАД для определения давления на впуске -> режима работы двигателя (насколько открыта заслонка). ДАД возвращает напрояжение 0,5...4,5В, имитируется сборкой резисторов с шагом 0,5В.
Если всё ОК - буду использовать Ардуино для тестирования ЭБУ этих 411, а то сейчас приходится цеплять на живой двигатель для теста, что не лучший вариант - 411 у меня единственный, и покупатель ждёт-не дождётся, когда расстанусь с ним :-)
если не секрет сколько стоит такой двигатель ?
Собранный из новых запчастей - от 70000 с навесным. Из б/у - можно в 40-50 уложиться.
Ресурс при правильном уходе - до 70000 км, ценят, во-первых, за раритетность, во-вторых, за соотношение масса/объём/мощность, в-третьих, за возможность установить этот двигатель практически без переделок в стандартный кузов "копейки".
Добавил обработку нажатия кнопки на пине 1.
С каждым нажатием диод на 13 пине моргает один раз длинно (2 сек) и частота импульсов увеличивается вдвое. При превышении частоты, эквивалентной 10000 об/мин, диод моргает 3 раза коротко (0,5 сек), затем 1 раз длинно и частота возвращается к эквиваленту 60 об/мин
Теперь после первого круга стали появляться какие-то странные "фризы" - порт 2 "залипает" в состоянии 1 примерно на секунду, затем выполнение продолжается.
С чем связано, пока не нашёл.
Добавил обработку нажатия кнопки на пине 1.
С каждым нажатием диод на 13 пине моргает один раз длинно (2 сек) и частота импульсов увеличивается вдвое. При превышении частоты, эквивалентной 10000 об/мин, диод моргает 3 раза коротко (0,5 сек), затем 1 раз длинно и частота возвращается к эквиваленту 60 об/мин.
Теперь после первого круга стали появляться какие-то странные "фризы" - порт 2 "залипает" в состоянии 1 примерно на секунду, затем выполнение продолжается.
С чем связано, пока не нашёл.
Без обработки дребезга (например HIGH в течение 50 мсек и более) плохо, тк механическая кнопка дает одним нажатием несколько импульсов и с учетом последующих delay() такое "размножение" приводит к замиранию программы. Лучше перенести обработку нажатия в прерывание, алгоритм: после первого импульса запомнить время и если HIGH продержится XX мсек считать кнопку нажатой (установить бит флаг) , иначе отбросить как шум. Дальше бит обрабатывать вне прерывания и сбросить его.
Область видимости volatile
Именно для исключения дребезга был добавлен "delay", чтоб точно успеть отпустить кнопку в течение этих 2 сек.. только после прошествия этого времени Ардуино заново опрашивает кнопку. В ненажатом состоянии кнопка дребезга не даёт, или я чего-то не понимаю?
Заметил ещё: иногда светляк TX (если правильно понимаю схему Uno, прицеплен к 1 ноге) моргает синхронно с диодом на 2 ноге, иногда не моргает. Могут ли быть между ними какие-то наводки?
Нашёл ошибку.
В строках 73-76 идёт сравнение номера зуба и флага отсутствия зуба с присвоением имени вызываемой функции. При DEAD == 1 ставился указатель на функцию "мёртвой зоны", а при последующих проверках указатель перезаписывался при Z == 1 | 4 | 67. поставил проверку флага DEAD в конец условий.
Всё стало хорошо. В строке 45 оператор /= можно заменить на *= , и при нажатии кнопки частота будет уменьшаться - это способствует визуальному контролю работы генератора на светодиодах.
Заметил ещё: иногда светляк TX (если правильно понимаю схему Uno, прицеплен к 1 ноге) моргает синхронно с диодом на 2 ноге, иногда не моргает. Могут ли быть между ними какие-то наводки?
Нужна проверка того, что кнопка удерживалась 50...80 мс для обнаружения нажатия тк "ловим" передний фронт. Дребезг отпускания у тактовых кнопок с прогибающейся мембраной тоже есть, но малый.
LED на 1, 2 ногах это TX,RX порта монитора и мигают при только при передаче информации (низкий уровень).
Кстати при такой низкой частоте импульсов нет необходимости писать на ассемблере.
Задался целью собрать генератор сигналов на Ардуино Uno R3. Требуемые параметры:
1. Генерация импульсов для двух датчиков (2 канала), 128 зубьев на маховике, 3 флага ВМТ (1 флаг на 67 зубе для ВМТ 1 группы цилиндров, 2 флага на 1 и 4 зубьях для ВМТ 2 группы)
Номера импульсов пока не поставил тк не понял последовательность
Задался целью собрать генератор сигналов на Ардуино Uno R3. Требуемые параметры:
1. Генерация импульсов для двух датчиков (2 канала), 128 зубьев на маховике, 3 флага ВМТ (1 флаг на 67 зубе для ВМТ 1 группы цилиндров, 2 флага на 1 и 4 зубьях для ВМТ 2 группы)
Номера импульсов пока не поставил тк не понял последовательность
Не совсем верно. Во-первых, Ваши графики обратные (высокий уровень для меня всегда был логической "1")
Во-вторых, первый канал (ДНО) - это, по Вашей диаграмме, 2+3 графики, только промежутки между однозубыми и двузубым сигналами больше. Второй канал (ДУИ) - первый график.
В-третьих, первый и второй каналы не складываются и не вычитаются, входы у контроллера для них раздельные.
Если же смотреть по функциям, то график можно представить так:
ДНО
Если же смотреть по функциям, то график можно представить так:
ДУИ- угловых импульсов
ДНО - что это и зачем его складывают из двух сигналов ?
--
Ф1К1= входной сигнал ДУИ из 128 имульсов, на котором пропущены испульсы 1,4,67
Ф1К2= почему всегда высокий уровень без импульсов?
Ф2К1 и Ф2К2 одинаковые выходные сигналы и доллжны быть сдвинуты на 1/4 от 128=периода_Ф1К1 ?
ДУИ- угловых импульсов
ДНО - что это и зачем его складывают из двух сигналов ?
--
Ф1К1= входной сигнал ДУИ из 128 имульсов, на котором пропущены испульсы 1,4,67
Ф1К2= почему всегда высокий уровень без импульсов?
Ф2К1 и Ф2К2 одинаковые выходные сигналы и доллжны быть сдвинуты на 1/4 от 128=периода_Ф1К1 ?
ДНО - Датчик Начала Отсчёта. По нему ориентируется ЭБУ: 1 импульс - ВМТ первой группы цилиндров, 2 импульса - ВМТ второй группы.
Ф1 отвечает только за импульсы ДУИ. Ф1К2 - всегда низкий уровень. Пропуски в графике сделаны, т.к.на зубьях 1, 4 и 67 функция 1 не отрабатывает, вместо неё отрабатывает функция 2, которая даёт в канал 1 импульс ДУИ, чтоб не прерывать счёт импульсов, и одновременно даёт импульс в канал ДНО, т.к.зубы ДНО расположены рядом с 1, 4 и 67 зубьями венца ДУИ.
Таким образом, график Ф2К1 компенсирует пробелы в графике Ф1К1. Получаем непрерывное следование импульсов ДУИ (К1) и импульсы ДНО (К2) на 1, 4 и 67 зубьях.
Немного "пригладил" генератор - вынес в переменные параметры для регулировки, чтоб иметь более гибкую настройку:
слова понятны, а сколько каналов ввода (датчиков) и каналов вывода (исполнительных устройств ) не понимаю
Гм... Не совсем понял, откуда эта таблица.
Ф1К1 - ДУИ, вход
Ф2К1 - ДУИ, вход
Ф2К2 - ДНО, вход
Ф1К1 и Ф2К1 формируют импульс на одном и том же пине, подключенном ко входу ДУИ на ЭБУ.
Ф2К2 - на другом пине, подключенном ко входу ДНО на ЭБУ.
таблица из экселя с ваших слов
Есть в коде программы "вялое место" : увеличение частоты в 2 раза (уменьшение делителя) и лишь потом ее проверка на соответствие. Это может привести к двум скачкам частоты. Для упрощения кода и избежания двойного скачка можно использовать функцию min(текущеезначение/2, минимальноедопустимое );
Так в том-то и вопрос, чтоб не выйти за границы допустимого диапазона и ходить "по кругу". Как только частота выходит за него, она возвращается к изначальной. Если использовать Ваше предложение, частота никогда не поднимется выше м максимального предела. А вообще, сейчас жду модуль LCD, буду выводить текущее значение RPM и частоты, ну и регулировка будет более гибкой - там, всё-таки, не одна кнопка :-)
Чтобы ходить по кругу необязательно превышать максимум есть решения проще, например ходить не по кругу абсолютных значений (делителей, множителей и т.д.), а по кругу enumerated индексов массива и т.д.
mtmbox@mail.ru
Итак, LCD панелька установлена и прикручена.
Что получилось в итоге:
Обработку кнопок прерываниями пока не освоил, Ардуинка у меня только 2 недели :-) Разберусь - буду причёсывать.
Добрый день!
Достался мне прибор на основе Вашего кода, который измеряет давление в цилиндрах двигателя внутреннего сгорания, используя вот такой датчик https://www.ebay.ca/itm/G1-4-inch-5V-0-1-2-MPa-Pressure-Transducer-Sensor-Oil-Fuel-Diesel-Gas-Water-Air-/321801631422
При включении от прикуривателя на usb часто пишет ошибка датчика. Каким образом обрабатывается аналоговый сигнал? Можете код привести?
Судя по всему, Вам достался компрессометр с кодом, выложенным на сайте, посвящённом любителям Mazda RX-7:
В вашей ситуации рекомендовал бы проконсультироваться с изготовителем компрессометра и, если изготовитель допускает подачу питающего напряжения в рекомендованных мной пределах, выполнить пункт, указанный в описании кода:
Рекомендуется питать компрессометр от отдельного батарейного источника питания +8...+12В, во избежание помех и ошибок из-за просадки напряжения при прокрутке двигателя стартером.
Иначе на датчик может поступать слишком низкое напряжение, а так как датчик, по сути своей, работает в схеме как делитель напряжения на переменном резисторе, то и на выходе может дать заниженный вольтаж, что приведёт во время самотестирования к ошибке слишком низкого напряжения при атм.давлении.