Индикатор расхода топлива для инжекторного двигателя – часть 0b11

imageПоследняя часть цикла статей о индикаторе расхода топлива. Первые две части находятся здесь и здесь.

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

Саму программу и файл прошивки можно сказать здесь.

Программа пользуется обоими таймерами, имеющимися на борту микропроцессора. Восьмибитный таймер, запущенный с делителем 1024 (т.е. работающий на частоте 8МГц/1024=7812Гц), при переполнении вызывает прерывание. За 1 секунду происходит примерно 30 таких прерываний, так что отсчитав 6 из них, можно точно отмерять промежутки времени в примерно 0.2 секунды. Это и есть те самые 0.2 секунды, задающие такт всей системе.

Шестнадцатибитный таймер использует внешнее прерывание для включения и выключения – он включается по спадающему и выключается по возрастающему фронту. Иными словами, таймер считает, когда инжектор открыт. Каждые 0.2 секунды главная функция программы сравнивает текущее значение таймера с максимально известным значением, и на основании этого сравнения, принимает решение, насколько заполнить индикатор. Теперь о максимальном значении – у программы есть два режима работы, в точности как у Терминатора – помните, у него был переключатель в мозгах, который позволял или запрещал Терминатору учиться новым вещам. Изначально программа учится – каждый раз, обнаружив новое значение таймера, которое больше предыдущего максимума, она запоминает его в энергонезависимую память EEPROM (в переменную maximum). Там-же хранится флаг (переменная learning), отвечающий за включение и отключение режима обучения – соответственно, когда этот режим выключен, программа не будет запоминать новые максимальные значения подсчетов таймера.

Возможность смены режима обучения была сделана вот для чего: как выяснилось, на максимальном “газе” (а-ля “pedal to the metal”) подача бензина столь велика, что после запоминания значений таймера в таких режимах работы, при обычном, спокойном стиле езды, индикатор заполняется всего на 2-3 деления из 10. Естественно, это не совсем удобно и устройство теряет смысл существования, при обычной езде, без гонок. Поэтому я обучил его немного газанув на разгоне, и отрубил обучающий режим. Теперь при прогреве например, горят 2 деления. При обычной езде – до 6ти, при резвом разгоне – 9-10, ну и если вообще притопить, то все 10 постоянно.

Для сброса сохраненного в EEPROM максимально известного значения таймера и переключения режимов обучения устройства, существует кнопка SW2 (смотрите схему). Если во время работы устройства подержать ее нажатой несколько секунд, то EEPROM обнулится. Если держать ее нажатой в момент инициализации микропроцессора (читай –  подачи питания на устройство), то оно переключится на другой режим обучения.

Для визуализации процессов инициализации, запоминания в EEPROM новых значений и переключения режимов обучения реализованы простые схемы подмигивания индикатором – этим занимаются функции running_bar и blinking_bar.

Поскольку запись в EEPROM процесс довольно медленный, обнаружив необходимость записать в EEPROM новое значение таймера, программа ждет примерно минуту (300 циклов по примерно 0.2 секунды), прежде чем записать его (этим занимается переменная e_eprom_w_timer). Если в течении этой минуты будет обнаружено очередное, еще более высокое значение таймера, то отсчет минуты начинается заново.

Важный момент в работе шестнадцатибитного таймера – при выключении двигателя, таймер включается по спадающему фронту внешнего прерывания, и остается включенным. Это не есть хорошо, поскольку работа всего устройства будет скомпрометирована. Решение проблемы очень простое: таймер работает с делителем 64, т.е. на частоте 8МГц/64=125КГц, следовательно он переполнится примерно за 0.5 секунды. Включаем прерывание на переполнение этого таймера. Если такое прерывание наступает, то система понимает, что двигатель остановлен, вырубает таймер, обнуляет его, отменяет запись в EEPROM нового, нереального значения таймера (ведь он продолжает непрерывно считать почти полсекунды, думая что инжектор открыт) и инициализирует систему по новой (замещает неверные максимальные значения таймера правильными, из EEPROM).

Разумеется, программа писалась от простого к сложному, и всякие футуристические мигания и остальные спец-эффекты появились только в последних версиях. Первые версии тестировались в симуляторе на компе, затем схема была собрана на макетной панели и вся финальная отладка проводилась уже в авто:

b_board_small

После окончательной отладки системы, была разведена вот такая вот плата:

fuel_meter_1

fuel_meter_2

fuel_meter_3

Файлы проекта, а также оттиск в формате PDF можно слить отсюда.

После протравки:

fuel_meter_02

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

fuel_meter_03

Я не стал выкладывать фото, как я разместил финальную версию девайса в машине – это личное дело каждого, да и машины у всех разные.

Система подключается к одному из инжекторов, установленных на двигателе. К каждому инжектору в авто присоединено два провода. На одном из них (неважно на каком) нужно снять изоляцию и подпаяться к оголенному месту. Очень важно потом все это дело надежно заизолировать, потому как влага под капотом дело нередкое, и затекать ей к месту нашей пайки совсем не нужно.

Поскольку систему я строил и отлаживал довольно долго, провод от инжектора не мог просто так валяться в салоне – он мог легко где-нибудь случайно замкнуться на массу, и иди знай чем все это закончится. Потому еще на первой стадии я предусмотрел возможность отключать его от инжектора с помощью первого, что попалось под руку – разъём RS232:

fuel_meter_01

Мама (справа) всегда остается под капотом, а вот папа (слева) в маме, только когда нужно получать сигнал от инжектора. На движке как нельзя кстати оказалась какая-то скоба, к которой все это дело очень хорошо прихерачилось стяжками.

Видео работы устройства:

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

В целом система получилась довольно компактной и надежной – катаюсь с ней уже два месяца. Никаких проблем замечено не было.



У этой записи 5 комментариев

  1. sotikov

    А в цифровом виде (указание расхода на 100 км) нет желания сделать? Так-то оно и так понятно, чем больше давишь тапку, тем больше расход.

  2. -=MindHunteR=-

    @ sotikov:
    привет.
    Я месяца полтора назад сделал новую версию платы, и индикатор встроил прямо в дэшборд. Стало круче – скоро будут фото.
    Можно и расход вывести, это не проблема. Только надо подцеиться еще и к датчику скорости и много много много раз калибровать систему, поскольку в ней будет слишком много неизвестных.
    А есть надобность в такой плате?

  3. sotikov

    А есть надобность в такой плате?

    Сам индикатор информативнее будет, если цифры выводить. *DL*

  4. -=MindHunteR=-

    @ sotikov:
    Возможно. Но мне персонально хотелось именно такой индикации.
    На новой версии платы есть выводы для трех семисегментных индикаторов, выводящих проценты, так же как их выводит моя шкала.
    Скоро выложу, как обещал.
    Схему для индикации расхода на 100 км – себе делать не буду, но готов помочь, если кому захочется сделать себе.

  5. boris

    Доброго времени суток! Об’ясните пожалуйста по индикатору расхода.У меня Приора,надо что-то менять в прошивке(я в этом вообще ничего не понимаю,прошивал знакомый сказал что установил два файла хекс и еще какой-то в результате при включении светодиоды “бегают”как на видео ,а дальше что-то непонятное то горят три то вся шкала.Пробовал на трассе при разгоне горит вся шкала потом все гаснут потом горит 5-6).Второй вопрос-при нажатии sw-1контроллер перезагружается,а sw-2 не дает ни какого эффекта.Хочется чтобы было как на видео.С уважением Борис.

Добавить комментарий