Широкополосная лямбда своими руками

Добавил пользователь Евгений Кузнецов
Обновлено: 20.09.2024


Купить показометр главного датчика любого тюнера может каждый, а вот собрать…
Итак, не буду рассказывать, какой я умный и как я сам собрал показометр ШПЛЗ… Это не совсем так. Я взял за основу готовый проект:

Arduino + несложная обвязка на ОУ + LSU-4.9, что еще надо?

Самое дорогое в этом устройстве — непосредственно сам широкополосный лямбда зонд. Новый датчик (LSU-4.9) сейчас стоит 6-7 т.р. Но если немного покопаться в интернете и посетить пару разборок европейцев, то можно вполне недорого (до 3 т.р) найти бу рабочий лямбда зонд. Он штатно ставится на свежие Audi, BMW итд. Короче, кто ищет, тот найдет.

Не будем глубоко разбираться в теории, просто скажу так, что самого датчика мало, его нельзя просто подключить к вольтметру или омметру (итд) и снять показания. Для него нужен некоторый контроллер, который не обойдется без управляющего микроконтроллера. Именно для это в этой схеме применяется Arduino на Attiny. Я использовал Arduino Uno или Nano на Atmega, это не имеет значения. (Uno сгорел по непонятным причинам, видимо что-то замкнул неудачно)

В результате потраченного некоторого времени с паяльником получилось вот это:


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

Чтож, тесты на живом моторе покажут… Параллельно думаю о живом показометре (экранчике), пока под вопросом. Делал на LED 4-х значном сегментном экранчике, но решил не возиться с динамической индикацией и все таки всю мощь и скорость Atmega отдать датчику кислорода…


Сейчас показания идут на комп по последовательному порту. В планах допилить протокол до AEM или Innovate, чтобы Nistune тоже понимал мой контроллер.

PS
Решил, что надо потихоньку уходить от Arduino и изучать "чистое" программирование микроконтроллеров, например в Atmel Studio. Посмотрим, что из этого получится…


Продолжим.
Принципиальная схема практически не поменялась (по сравнениию с первой частью). На всякий случай выкладываю все принципиальные схемы ещё раз:


Обобщённая схема для NTK



Микропроцессорная часть схемы

В схему с микроконтроллером я добавил функционал для трёх кнопок и делитель для измерения уровня заряда аккумулятора. Программно этот функционал не поддерживается (вроде не надо). Всё, что раньше было кинуто проводами, перекочевало на печатную плату. Практически все выводные детальки я заменил на SMD. Типоразмер резисторов и конденсаторов там 0805, поэтому проблем с ручной пайкой быть не должно.
Несколько фоток печатной платы:








Да! Прошу обратить внимание! Монтажка для схемы LSU датчика. Как переделать LSU-NTK и как проверить схему, читать тут ОБЯЗАТЕЛЬНО! Обращаю внимание, на плате два варианта линейного стабилизатора LT1086 под TO-220 и под D2PACK корпуса. Многие танталовые конденсаторы можно заменить на алюминиевые. Вообще говоря, я многие детальки насобирал у себя в хламе, в Китае купил по минимуму и за копейки.
Повторю про переделку LCD дисплея. Дисплей применён на контроллере ST7735 размером 1,8 дюйма. Всё есть в первой части. С дисплея можно отпаять линейный стабилизатор LM1117-3,3 и перенести его на плату. Плюс нужно запаять перемычку на плате дисплея. Я ещё снёс держатель карты памяти для удобства сборки конструкции.

Так. Теперь сам ШДК датчик. Я решил заказать с Китая, я предпочитаю eBay. Вбил артикул (0258017025), выбрал не самый дешевый вариант. Ссылку дать не могу, тот продавец больше не продаёт эти датчики. Попутно заказал ещё и разъём, куда можно воткнуть этот датчик. Пришёл датчик, мягко сказать, так себе. Ни одного обозначения, вообще ничего не написано. Защитный колпачок не такой как на фото. Короче китайцы. Не знаю уж сколько он прослужит, да и не важно мне это сейчас. Напомню, проект затачивался под применение практически любого датчика кислорода, с последующей калибровкой по эталону. Распиновка ШДК на картинке ниже.




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

Алгоритм работает так. Получаем значение Uout с АЦП. После всех преобразований получаем реальные вольты, начинаем сравнивать со всеми подряд значениями из таблицы. Как только знак результата меняется (например, полученный Uout был всё время меньше табличного значения, а потом вдруг стал больше), значит, мы попали как раз между двумя точками, где лежит полученное значение. Теперь другими словами. Пусть в процессе перебора мы попали в некую i-ю точку, где сменился знак. Знаем Uout[i](табл),AFR[i](табл) и Uout[i-1](табл),AFR[i-1](табл) или Uout[i+1](табл),AFR[i+1](табл), в зависимости от того, с какой стороны шёл поиск значения. Дальше по двум точкам МНК. Получаем на этом участке f(x)=ax+b, подставляем рассчитанный Uout и находим AFR. Ну а дальше вывод на дисплей, подготовка пакета для LC-1 и прочая борода. Конечно, этот алгоритм имеет ограничение. Табличная функция AFR(Uout) не может иметь экстремумов, точек максимума и минимума кроме двух на которых определена. Иначе одному значению AFR будет соответствовать несколько Uout, что недопустимо.
Теперь по строчкам прошивки. До входа в основной цикл while(1) происходит загрузка таблицы AFR-Uout из EEPROM, переменные двухбайтовые:

Значения в EEPROM хранятся в виде двухбайтового целого, умноженного на 1000, поэтому при считывании в массив с плавающей точкой, происходит деление на 1000. Да-да можете пинать меня, я программист такой, уж какой есть:
ALF _UOUT[temp_ui]=((float)((RXBUF[i]<<8)+RXBUF[i+1])/1000);

Дальше интересности в основном цикле. Опущу всякую бороду типа вывод на экран состояния нагревателя и прочее, не существенное. Веселуха начинается тут:


if(flag_end_adc!=0)
flag_end_adc=0;
vin_f=calibr_adc*(2)*((adc_data*2.56)/1024);
vin_f_akk=vin_f_akk+vin_f;
akk_cou++;
….

Когда АЦП отработает (if(flag_end_adc!=0)), то произойдет расчет реальных вольт:
vin_f=calibr_adc*(2)*((adc_data*2.56)/1024);

Вот и всё. Наш искомый: ALF=a*vin_f+b;
Куски кода, которые сидят тут:

отвечают за обмен данными с компьютером.Тут ничего интересного. Это получение команды и отправка всех калибровочных значений на комп, и получение новых калибровок с компа. Там происходит проверка контрольной суммы, компоновка, короче нудятина всякая.
Ну и в конце, сам протокол LC-1. Что-то у меня вызывает сомнения его корректность работы. Если работает, хорошо, если плохо и вы почините, то тоже хорошо (удалил строчки комментариев):


if(flag_lc_out!=0)
<
flag_lc_out=0;
temp_ui=(unsigned short int)((ALF*10000/147)-500);
TRANS_UART(0xB2);
TRANS_UART(0x82);
TRANS_UART(0x43);
TRANS_UART(0x13);
TRANS_UART((temp_ui>>7));
TRANS_UART((temp_ui&0b01111111));
>

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


Внешнее ПО
ПО написано в среде Delphi 5. Чтобы настроить контроллер ШДК, а конкретно залить калибровки в EEPROM, была написана маленькая утилитка:


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

Зеленая рамка – работа с COM портом
Синяя рамка – ввод калибровок
Жёлтая рамка – отправка/получение калибровок
Оранжевая рамка – инструменты, плюшки

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



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


Ссылки на архив с барахлом.

07 марта 2020 Дополнение к статье. Решение проблемы отсутствия связи с ПО на компьютере.

Микроконтроллер(далее МК) ATmega8, как и многие другие, содержат ячейки памяти, которые отвечают за калибровку внутреннего RC генератора. Некоторые экземпляры, купленные мной в китае, были с совершенно раскалиброванным RC генератором, что делает невозможным настройку, например, UART посредством формул в Datasheet или встроенного в CodeVision помощника настройки МК(значок-шляпа волшебника). Поэтому такие МК я калибровал вручную. Результат калибровки виден в коде в виде строчки:
OSCCAL=175;

Соответственно, если ваш МК уже с нормально настроенным RC генератором, то эта строчка всё испортит.

В сети блуждает небольшая схемка, на одном операционном усилителе (ОУ), но она скорее описывает общий принцип.


Я даже решил включить умного и сам попытался накидать что-то, но, слава Богу, нашлась готовая схема. Даже две.

Ссылки на интересные ресурсы:

Итак схемы, одна для NTK, другая для LSU. Они практически идентичные.

Схема управления/измерения для NTK


Схема управления/измерения для LSU


Объединённая схема (нагреватель и схема управления) с сайта

Вот ссылка на ресурс, кто захочет сделать эту самоделку, читать обязательно это:

Было принято решение надабратьнадо делать.

Часть схемы, которую я сочинил. Содержит микроконтроллер, дисплей, мост USB-UART.


Небольшое отступление. К моменту как я разобрался с ШДК и нашлась схема, мне достался условно исправный ШДК от конторы NTK (артикул 036906262 J). Этот датчик был снят с автомобиля, потому что возникала ошибка по нагревателю. Но сам нагреватель оказался в порядке, точнее сопротивление нагревателя в норме и нагреватель нагревал. Что с ним не так, было выяснено позднее, точнее это только предположение.

Развел я плату за пару вечеров. Решил, помимо схем самого управления/измерения и нагревателя разместить на плате и микроконтроллер с дисплеем, потом добавил и мост USB-UART, потому что протокол LC-1 никто не отменял. Родилась вот такая плата.


Первые испытания.
Первые испытания были самые волнительные. Изначально контроллер ATmega8A и мост USB-UART я решил не запаивать, чего детальки попусту переводить. К выходу схемы управления/измерения просто подключил мультиметр. Результаты приятно удивили. Оно работает! Видео как я запускал вот тут

Кстати на момент лабораторной работы уже работал экран и АЦП контроллера. Получилась таблица AFR-Uout. Для чистоты эксперимента поменял местами два ШДК и произвёл ещё один цикл измерений. Дальше дома в Excel строится график и аппроксимация (линия тренда). Вот тут произошёл затык, потому что точки не хотели попадать ни на что адекватное, поэтому просто, прикрыв левый глаз, сделал линейную аппроксимацию.


Работу самодельного ШДК я проверил в пути.


Примотал изолентой к бортовику и поехал катать. На ХХ и в стационарных режимах, когда работает УДК, ШДК показывает примерно 14,5-14,7 AFR. На мощностных режимах 14-13 AFR. При разгоне видно, что происходит обогащение. Я думаю, что всё получилось, система работает. Может быть с точностью ± лапоть, но мне этого достаточно, по крайней мере пока. Может быть, применив заведомо-исправный ШДК, показания будут точнее.


ШДК подключается к схеме управления как указано, далее выход схемы управления/измерения Vout идёт на схему с микроконтроллером на вход операционного усилителя LM358. Нагреватель связан со схемой управления посредствам оптопары 4N35. Для того, чтобы микроконтроллер определял готовность нагревателя кинут провод от 1-ой лапки 4N35 до 2-ой лапки микроконтроллера (программно ни на что не влияет). Дисплей применён на контроллере ST7735 размером 1,8 дюйма. Один из самых дешёвых в Китае. Дисплей питается от 3,3В при помощи установленного стабилизатора LM1117-3,3. Поэтому на самом дисплее нужно запаять перемычку J1 и по желанию снести с платы дисплея стабилизатор LM1117-3,3. Кстати, стабилизатор можно перенести на основную плату.


Программа написана на обычном СИ, без каких-либо причуд. Среда разработки и компилятор CodeVision.
Поясню по некоторым строчкам кода.
Важная строчка:
vin_f=1.0194805194805194805194805194805*(2)*((adc_data*2.56)/1024);

Дальше важная строчка:
ALF=3.319*vin_f+6.3208;

В прошивке происходит усреднение по 10 значениям напряжения на входе АЦП.

Страшные конструкции типа:
temp_ui=ALF_ui;
SetCharScale(8,1,(0x30+(temp_ui/1000)),4,2);
temp_ui=temp_ui%1000;
SetCharScale(8,1+2,(0x30+(temp_ui/100)),4,2);
SetCharScale(8,1+4,'.',4,2);
temp_ui=temp_ui%100;
SetCharScale(8,1+6,(0x30+(temp_ui/10)),4,2);
temp_ui=temp_ui%10;
SetCharScale(8,1+8,(0x30+(temp_ui)),4,2);

Это всего-навсего вывод чисел на экран.

Дальше вот эта часть:

TRANS_UART(0xB2);
TRANS_UART(0x82);
TRANS_UART(0x43);
TRANS_UART(0x13);
TRANS_UART((temp_ui>>7));
TRANS_UART((temp_ui&0b01111111));
delay_ms(81);
delay_us(920);

отвечает за протокол LC-1. Функция TRANS_UART выкидывает 1 байт в последовательный порт. Описания протокола LC-1 море в интеренте. Проверить полностью протокол я пока неуспел, но теоретически должен работать.

Финальная часть.
Как же настраивать эту невразумительную систему? Мне, как её создателю, всё понятно. Но наверно только мне. Постараюсь разложить по пунктам.
1) Конструкция собирается, проверяется.
2) Берется эталонный ШДК, вкручивается в одну выхлопную систему с самодельным ШДК.
3) Меняя состав смеси фиксируются напряжения на выходе схемы управления (самодельный ЩДК) и реальный AFR (эталонный ШДК).
4) По полученной таблице строится график и рассчитывается линия тренда (аппроксимация)
5) В коде программы заменяется строчка:
ALF=3.319*vin_f+6.3208;
На строчку с вашими коэффицентами
ALF=*vin_f+;

Даже можно заменить линейную функцию на любую другую
ALF=f(vin_f);

Переменные ALF и vin_f – это числа с плавающими точками, поэтому в формуле могут быть любые числа, не только целые.
6) Программа компилируется. Микроконтроллер прошивается. Вот тут будет больше всего трудностей… увы.
7) По возможности, скинуть мне ваши функции, исходные данные (можно прямо в Excel) и артикул применяемого ШДК. Это для того, чтобы можно было создать базу и сделать проект удобным для применения и настройки уже без эталонных ШДК.

З.Ы. Если я что-то забыл, если что-то непонятно (а наверняка так оно и есть). Спрашивайте, попробую объяснить, недостающие исходники прикреплю. СОздадим бюджетный ШДК всем миром!

Испытания


Это просто продолжение части 2. Добрался до испытаний только в середине зимы. На улице поливал дождь, поэтому все действия производил в гараже. Подцепил инженерник, вкрутил эталонный ДК и настраиваемый ДК.



Прошил тестовой прошивкой ЭБУ (без регулирования по ДК). Очень долго возился с настройками COM портов, это мрак, но после танцев с бубном всё получилось. ДК от innovate запитал от AC/DC источника на 12в, самодельный ДК от прикуривателя мотоцикла. АЦП самодельного контроллера ШДК было уже откалибровано, поэтому в помощи тестера я не нуждался. Задача простая, получить соотношение ALF датчика innovate и напряжение с АЦП самоделки. Всё как и в предыдущей части статьи, меняем Цилиндровое GBC при помощи j5 online tuner, дожидаемся стабилизации параметров и записываем.



Записывать нужно достаточно бодро, иначе параметры состава смеси могут уползти или начать прыгать. Если бы можно было производить настройку в лабораторных условиях, а не на реальном моторе, то было бы проще. По итогу, я провел три серии экспериментов. Приходилось прерываться, как минимум, потому что мотор нагревался. Встречного потока воздуха в гараже у меня нет, как и тосола в системе охлаждения. В паузах настраивал и корректировал характеристику самодельного контроллера ШДК. Вот несколько фото эволюции:




Не знаю что не так с открытым воздухом. Нужно изучать мат часть. Пришёл домой и подровнял характеристику. Вот такой вышел конечный итог:


Зеленым обведу то, что реально измерил:


Естественно, промерить с шагом 0,25 я не мог. Поэтому я получил некоторый набор точек, ну а промежуточные, в которые не попал, просто усреднил. Пока это всё правил, сразу пришла мысль по обновлению ПО. Нужно чтобы при наведении точки на графике подсвечивалось окошко со значениями, это было бы вообще удобно. Может быть обновлю программку. На фото ниже несколько попыток зафиксировать настроенный самодельный контроллер ШДК и эталонный от innovate. Прошу прощения за качество фоток, руки-крюки всё вибрирует от мотора, сложно поймать фокус.





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



Я думаю, эксперимент прошёл успешно. Конструкция имеет право на жизнь и может быть повторена. В конце будут все исходники, плата и таблица AFR-Uout для датчика с определённым артикулом. У меня всё. Спасибо за внимание!


Для китайского датчика с артикулом 0258017025 у меня получилась такая характеристика:

Так как по роду своей деятельности очень плотно занимаюсь настройкой карбюраторов, наконец-то решился к заказу очень дорогого, но необходимого прибора — широкополосного датчика кислорода (ШДК). Кому интересно — тыцяем.

Широкополосный датчик кислорода предназначен для точной настройки карбюраторов по стихиометрическому составу смеси, которая, как известно, для бензина составляет 14.7 кг воздуха к 1 кг топлива. Сий нехитрый, но, блин, недешевый прибор заменяет собой одновременно а) индикатор качества смеси ИКС (свечка такая, с окошком, через которое видно цвет пламени) и б) жопомер — самый распростаненный в кругах автолюбителей измерительный прибор.

Через 26 дней ОНО было у меня:


Изначально разъем присутствует только на датчике лямбды, остальные провода просто висят в воздухе. Пришлось вооружиться паяльником и соединить их согласно схемы. Кроме этого, купил и припаял вилку прикуривателя, чтобы брать питание +12В непосредственно из прикуривателя.

Индикатор представляет собой АЦП, который преобразует выход контроллера лямбды от 0.5 вольт (лямбда 0.5, соотношение воздух-топливо 7.4:1) до 5 вольт (лямбда 1.5, соотношение воздух-топливо 22.1:1). В принципе, можно использовать любой вольтметр, откалиброванный соответствующим образом.


Или как вариант посложнее и попрактичней, используется так называемая трубка Вентури:



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

Читайте также: