[Из песочницы] Делаем «вечный» датчик массового расхода воздуха на ATiny13
Этот проект появился из-за нежелания покупать бывшую в употреблении около 30 (тридцати) лет деталь за совсем немаленькую сумму в 3000 — 5000 руб. Можно сказать что это будет проба пера в схемотехнике и программировании микроконтроллеров. Если интересно — продолжение под катом.
Осторожно много фото!
Итак, начинаем подпирать велосипеды костылями.
Вводные данные
BMW E30 в кузове купе 1986 г с мотором M10B18 (4 цилиндра, 1.8л, инжектор):
Проблемы
1. Чихает
2. Не едет
3. Жрет и не толстеет
Годы в России не пощадили её. Высококачественный бензин, соляные ванны, «пористые дороги». Однако, больше всего ей досталось от бывших хозяев и суровых Русских автомехаников, бессмысленных и беспощадных, производивших ремонты сомнительной необходимости и эффективности. Ярким примером одного из таких ремонтов вы можете полюбоваться на КДПВ. А что это там такое беленькое, все в припое? Это керамическая плата— основная деталь ДМРВ, на нее нанесены пленочные резисторы и дорожка по которой должен бегать подвижный контакт. Как видно на фото она треснула, и некто пытался восстановить ее таким вот варварским методом. Безуспешно. Вот он — корень всех проблем! Тут нужно сказать что ДМРВ является основным датчиком, влияющим на смесеобразование.
Немного теории
Наша машинка оснащена чудом Немецкой промышленности системой распределенного впрыска L-Jetronic.
Гугл гласит:
Система распределенного впрыска L-Jetronic является системой импульсного впрыска с электронным управлением количественным и качественным составом топливно-воздушной смеси. Для обеспечения импульсного впрыска топлива в системе применены форсунки с электромагнитным управлением.
Ну, распределённого — это громко сказано, тут все 4 форсунки соединены параллельно и, соответственно пшикают одновременно, хотя да, это я придираюсь, установлены они каждая напротив своего цилиндра в разных местах впускного коллектора — т.е. распределённо. Мозг здесь довольно глупенький — холостым ходом, зажиганием, прогревочными оборотами не управляет.
Все что ему подвластно — это несколько датчиков и форсунки.
Вернемся к ДМРВ. Здесь установлен электро-механический ДМРВ, в народе именуемый «лопата», очевидно за характерную форму подвижной заслонки.
Принцип действия его довольно прост: воздух потребляемый мотором проходит через входное отверстие, и в зависимости от интенсивности (считай массы воздуха в единицу времени) отклоняет измерительную заслонку на определенный угол. На оси заслонки установлен подвижный контакт, который и бегает по дорожке нашей многострадальной платы из первой картинки.
Варианты решения проблемы:
1. Купить новый ДМРВ — стоит космических денег 35000–60000 руб, сопоставимо со стоимостью авто.
2. Купить БУ ДМРВ — 30 лет эксплуатации, никаких гарантий, стоит 3000 — 5000 руб.
3. Купить новую плату (неоригинал, делают малыми партиями) — цена 300р+пересыл, выглядит так:
Как видно, конструкция отличается от заводской. Надежность под вопросом, в интернете можно найти негативные отзывы о якобы недолговечности сего решения, подтвержденные фотографиями изношенных плат подобного типа.
4. Купить ДМРВ современного типа без движущихся деталей + так называемый конвертер — цена вопроса немного отпугивает, так же необходимо будет адаптировать впускной тракт, наращивать длину патрубков и т. д.
5. Придумать что-то своё.
Для меня выбор был очевиден.
Я решил оставить механическую часть, так как никаких признаков износа не обнаружил. Думаю она прослужит дольше чем остальная машина.
Задача немного упростилась, необходимо преобразовывать угол поворота в напряжение. Хотя нет, постойте, не все так просто… Дело в том что как я уже говорил мозг здесь довольно глупенький и, соответственно на вход он хочет получать максимально готовые данные. Это отразилось в конструкции ДМРВ — график зависимости выходного напряжения от угла поворота оси заслонки нелинеен, и дополнительная сложность — он масштабирован сопротивлением датчика температуры воздуха, который так же встроен в ДМРВ. Соответственно характеристика датчика должна меняться в зависимости от температуры воздуха.
Поиск готового схемотехнического решения не привел к успеху. Проблема с износом ДМРВ подобного типа многих коснулась, много тем на специализированных форумах где на десятках страниц люди обсуждают как же её решить.
Для начала хотелось бы получить данные об угле поворота оси. Переменные резисторы и прочую механику я сразу отбросил, как ненадежные. Оптический датчик — хорошо, но пыль может доставить неприятности, а пыли в дороге хватает. Магнитные датчики — вероятно это то что нужно.
Нашёл вот такой: KMA-200.
С ходу не смог купить его в своей глуши. И случайно наткнулся на вот такой готовый ДПДЗ в котором и применен KMA-200.
В нагрузку получаю магнит с креплением, датчик уже на плате с необходимой обвязкой, покрыт лаком, защищающим от влаги и статики. Нашёл кстати похожий проект.
Отлично!
На выходе у такого датчика напряжение от 0 до 5 вольт зависимость от угла поворота линейная. Нужно как-то преобразовать ее в нужную нам характеристику. Аналоговые схемы в принципе могли бы обеспечить это, но были бы довольно сложны в проектировании и наладке, например какой-нибудь интегратор на операционниках с термокомпенсацией, но это для меня сложновато…
Тут я вспомнил что у меня есть горсть ATiny13, почему бы не использовать их?
Набросал и смоделировал схемку:
Немного о схеме.
- Микроконтроллер тактируется от внутреннего генератора частотой 8МГц.
- Использованы 2 канала АЦП, считывается угол поворота оси заслонки и уровень напряжения на резистивном делителе частью которого является датчик температуры.
- Выходной сигнал ШИМ с частотой около 18кГц
Далее простой фильтр и операционный усилитель LM358 из старой материнки (КУ=1+(330000/100000)=4.3), управляющий полевиком (из той же материнки). Максимальное выходное напряжение = 4.3×2.5 = 10,75В.
Зачем полевик спросите вы? А кто его знает отвечу вам я! Лишним не будет. С помощью этой схемы я управлял мощной нагрузкой в виде нескольких автомобильных ламп соединенных параллельно просто для проверки что она это тоже может.
Вообще все детали у меня были в наличии кроме датчика поворота.
Время писать прошивку! Это первая моя прошивка МК, так что конечно все не оптимально, и конечно я выбрал немного странноватый инструмент BascomAVR, в котором писать приходится на каком-то псевдо-кубейсике. Очевидно встроенный туда компилятор не очень оптимизирован, прошивка получается жирная, и полиномиальная интерполяция которую я хотел туда впихнуть к сожалению не влезла. Пришлось реализовать аппроксимацию тремя прямыми отрезками. Почему тремя? Потому что больше не влезло (Bascom + 1 кб flash).
$regfile = "attiny13.dat"
$hwstack = 8
$swstack = 16
$framesize = 16
Config Portb.1 = Output
Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Up
Config Adc = Single , Prescaler = Auto
Start Timer0
Dim Adcval As Word , Temp As Single
Do
Adcval = Getadc(2) 'считываем угол
Select Case Adcval 'в зависимости от участка характеристики выбираем нужную прямую
Case 0 To 306
Temp = Adcval * 2.2
Adcval = Temp
Case 307 To 613
Temp = Adcval * 0.9377
Adcval = Temp
Adcval = Adcval + 384
Case 614 To 1023
Temp = Adcval * 0.15
Adcval = Temp
Adcval = Adcval + 870
End Select
Temp = Adcval * 0.0009765625 'масштабируем полученное значение
Adcval = Getadc(3) 'считываем температуру
Temp = Temp * Adcval 'перемножаем значение температуры и отмасштабированное значение угла поворота
Pwm0b = Temp * 0.25 'масштабируем полученное значение
Loop
End
$prog &HFF , &H7A , &HFF , &H00 ' generated. Take care that the chip supports all fuse bytes.
$prog &HFF , &H6A , &HFF , &H00 ' generated. Take care that the chip supports all fuse bytes.
$prog &HFF , &H7A , &HFF , &H00 ' generated. Take care that the chip supports all fuse bytes.
$prog &H00 , &H00 , &H00 , &H00 ' generated. Take care that the chip supports all fuse bytes.
$prog &H00 , &H00 , &H00 , &H00 ' generated. Take care that the chip supports all fuse bytes.
Чтобы выяснить уравнения прямых буквально минут за 10 набросал тупую софтинку в Qt Creator, пошевелил контрольными точками, определился с положением прямых.
Красная линия это искомая характеристика, синяя это аппроксимация прямыми. Далее компиляция и заливка прошивки в эмулятор. Все шевелится так как я и ожидал.
На скорую руку разводим плату и расчехляем лазерный утюг.
Травим, паяем, исправляем косяки разводки (ну куда же без них).
Внимательный читатель и опытный радиолюбитель заметит 2 ошибки которые я допустил при запайке.
Далее включение, проверка основных параметров, и суточная прогонка в разных режимах. Проверка показала что все работает так как и задумывалось. Время сборки и установки на авто.
После настройки подстроечником, машина начинает работать так как и должна, в дальнейшем был проверен расход бензина и динамика, все оказалось в норме, те соответствовало заявленным характеристикам. Машинка каталась на юга из средней полосы России, никаких проблем не появилось.
Я считаю, что первый опыт программирования микроконтроллеров, да в принципе и создания схем, был для меня удачен. Конечно есть огрехи: например выбор среды программирования. В следующем проекте я уже использовал CVAVR, прошивка получается намного компактнее. Выбор микроконтроллера тоже можно было бы назвать не удачным, хотя я его и не выбирал, он у меня был, и было желание его использовать. Сразу по окончанию работы с этим проектом я заказал несколько ATiny85, которые имеют в 8 раз больше памяти, но пока шла посылка эту машину внезапно купили, и ДМРВ так и остался с не идеальным алгоритмом).