Модернизация бортового компьютера на ATmega8

После публикации статьи Бортовой компьютер (часы, двухканальный термометр, вольтметр на ATmega8 и LCD 16х2) прошел уже почти год, и за это время я получил много писем с просьбами изменить прошивку под нужды пользователей. В основном нужно было добавить в устройство такие функции как предупреждения о низком уровне заряда аккумуляторной батареи, перегреве охлаждающей жидкости двигателя, измерение остатка топлива в баке. Но для одних напряжение на аккумуляторе, например, 11.9 В считается предельно низким, другие могут позволить разрядиться батарее до 10.7 В. Кто-то считает двигатель перегретым уже при 95°С, а кто-то при 105. Поэтому я решил добавить в схему устройства кнопки, организовать меню с настройками, чтобы каждый мог настроить БК под себя и теперь имеет следующие функции:

  • индикация текущего времени
  • измерение температуры двигателя
  • измерение напряжения бортовой сети
  • измерение остатка топлива в баке

Из дополнительных функций устройство имеет:

  • установку порога предупреждения о перегреве (90 — 125°С)
  • установку порога предупреждения о низком уровне заряда аккумуляторной батареи (10.0 — 12.0В)
  • калибровку штатного датчика уровня топлива (0 — 70Л)
  • установку инерционности индикации уровня топлива (2 — 10)
  • установку порога предупреждения о низком уровне оставшегося топлива (1 — 20Л)
  • настройку яркости подсветки дисплея
  • возможность отключения звуковых предупреждений

Схема состоит из распространенных и недорогих радиоэлементов:

Как видно, предусмотрена защита от переполюсовки — диод SK24, вместо него можно поставить любой другой Шоттки или вообще его не ставить, если уверены, что при сборке однажды случайно неверно подадите питание, перепутав полярность. RV1 — подстройка измеряемого напряжения. RV2 — штатный датчик уровня топлива типа БМ150 сопротивлением 330 Ом при пустом баке. Про RV3 скажу чуть позже. RV4 устанавливает контраст дисплея. 

Печатная плата:

На ней предусмотрен 6-пиновый разъём IDC-06 для внутрисхемного программатора USBASP, а так же штыревые разъёмы для подключения датчиков температуры и уровня топлива, разъём для подключения кнопок. В прикрепленном архиве есть файл в формате Sprint Layout, в котором подписаны все элементы.

Почти готовая плата:

При пайке элементов, для удобства, сначала нужно запаять все проводные перемычки, затем SMD компоненты, и только после этого — подстроечные резисторы, разъемы, отсек для батарейки, звуковой излучатель и дисплей. Прошиваем микроконтроллер внутрисхемным программатором. Фьюзы выставляются на тактирование от внутреннего RC генератора на 8МГц:

Будьте очень осторожны при прошивке фьюзов, потому что в некоторых программах-прошивалках их нужно выставлять инверсно. Чтобы избежать неверной расстановки чекбоксов, сначала считайте с МК фьюзы и посмотрите: если RSTDISBL не отмечен галочкой, то нужно расставлять как на картинке. Если отмечен, то фьюзы выставляются инверсно. По окончании прошивки, при правильно собранной схеме, устройство запускается от питания программатора, и раздаётся звуковой сигнал. Теперь нужно установить напряжение на выходе ОУ при пустом баке. Подаём питание 12 вольт. К плате подключается датчик уровня топлива (можно временно заменить на переменный резистор сопротивлением 330 Ом), устанавливается на максимальное сопротивление (бак пуст). С помощью RV3 на ноге ADC1 (PC1) микроконтроллера устанавливается напряжение ровно 5 вольт. Устройство готово:

Плата с кнопками:

 

Напишу как ими управлять. При основном экране (когда на дисплее отображаются все параметры) при нажатии кнопки MUTE/ESC включается/выключается звук предупреждений и звук нажатия кнопок. При этом на дисплей выводится соответствующая информация:  — звук включен и  — звук выключен. При нажатии кнопки HR/+ устанавливаются часы, при нажатии MIN/- — минуты. При нажатии MENU/OK на дисплее появляется основное меню. С помощью кнопок + и — выбираем нужный пункт меню:


При нажатии OK заходим в выбранный пункт.

1. Перегрев двигателя. Здесь кнопками + и — устанавливается порог температуры от +90 до +125°С , при которой устройство будет предупреждать о перегреве двигателя. После установки жмём OK, на месте значения темпратуры порога на секунду появляется надпись «Сохранено». Выходим, нажав ESC.
2. Разряд аккумулятора. В этом пункте устанавливается порог разряда аккумулятора от 10.0 до 12.0В так же как и в п.1.
3. Калибровка уровня топлива начинает производиться при пустом топливном баке автомобиля. На экране отображается следующая информация: количество залитого топлива, под ним значение АЦП для данного уровня, значение АЦП с датчика уровня топлива в настоящий момент.

Итак, бак пустой. Кнопками + и — устанавливаем «литры  0». Неспеша заливаем топливо до тех пор, пока не начнёт изменяться значение ADC. Жмём OK. Это будет нулевой уровень. Далее заливаем в бак 1 литр топлива, при этом значение ADC должно увеличиться, кнопкой + устанавливаем «литры  1». Жмём OK — в EEPROM МК записалось значение АЦП, соответствующее уровню 1 литр. Заливаем ещё литр топлива, кнопкой + устанавливаем «литры  2», нажимаем OK, и так до полного бака. После калибровки нужно перезагрузить устройство.

4. Инерция уровня топлива. Устанавливается количество измерений уровня топлива для вывода на дисплей усредненного значения. Устройство измеряет уровень топлива 1 раз в секунду. Если, например, инерция имеет значение 5, то в программе в массив со сдвигом будут записываться данные 5-ти последних измерений, соответственно за 5 секунд (одно измерение — одна секунда), из этих измерений вычисляется среднее значение остатка топлива и выводится на дисплей. Управление кнопками аналогично п.1.
5. Низкий уровень топлива. Здесь устанавливаем порог предупреждения о низком уровне топлива от 1 до 20 литров. Как управлять кнопками, уже ясно.
6. Яркость дисплея. Я думаю, тут всё понятно.

Все установки записываются в энергонезависимую память микроконтроллера (EEPROM), за исключением звука — при запуске устройства звук всегда включен.
При переходе измеряемых параметров через установленные значения порогов, на дисплее начинает мерцать значение соответствующего параметра, и каждые 30 секунд раздаётся тройной звуковой сигнал.

В архиве «MBC_.rar» находятся проект Proteus, печатная плата в формате Sprint Layout, схема и 2 прошивки: одна для русифицированных дисплеев, вторая — для нерусифицированных (меню на английском языке). У меня дисплей оказался нерусифицированным, поэтому на видео меню на английском.

Исходники прошивок написаны в компиляторе Bascom AVR. Их можно приобрести на торговой площадке exDIY : архив с исходниками (содержит 6 исходников — основной, с переключением типов датчиков уровня и с выводом для подключения вентилятора — все русской и английской версии) и исходный код новой прошивки с упрощенной калибровкой ДУТ

Дополнение 29.11.2013 — добавил архив «Прошивки для датчиков 0л — 0Ом.rar» с прошивками для датчиков уровня топлива, у которых при пустом баке сопротивление 0 Ом.

Дополнение 17.12.2013 — добавлен архив «Исправленные прошивки.rar». Причина исправления — глюк индикации остатка уровня топлива при полном баке — на дисплей выводилось число 69 или 71. Если бак уже откалиброван, то перед тем как прошивать МК, не забудьте сначала отдельно прошить конфигурацию фьюзов, отметив EESAVE, иначе при заливке hex все данные о калибровке бака будут стерты.

27.12.2013 — обновил архив  «Исправленные прошивки.rar». Исправлен недочет звуковых предупреждений о переходе через установленные пороги.

Дополнение 11.02.2014 — добавлен архив «Прошивки с переключением типов датчиков уровня топлива.rar». Описание внутри архива.

Дополнение 12.05.2014 — добавлен архив «Прошивки с управлением вентилятора.rar». Описание внутри.

Дополнение  9.03.2016 — добавлен архив с файлом печатной платы для DIP-компонентов от пользователя Sergio.

6.07.2016 — в статью добавлен архив с новыми прошивками «Прошивки с упрощенной калибровкой уровня топлива.rar». Описание внутри архива.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
LCD1 LCD-дисплей WH1602 1 С подсветкой
U1 МК AVR 8-бит ATmega8A-AU 1 Корпус TQFP-32
U2 Датчик температуры DS18B20 1
U3 Линейный регулятор L7805AB 1 L7805AB2T
U4 Часы реального времени (RTC) DS1307 1 Корпус SO-8
U6 Операционный усилитель LM2904 1 (LM358, LM258) Корпус SO-8
Q1, Q2 Биполярный транзистор PMBS3904 2 Корпус SOT-23
D1 Диод Шоттки SK24 1 Диод Шоттки
D2 Стабилитрон BZV55C5V1 1 Корпус SOD-80
X1 Часовой кварц 32768 Гц 1
R1-R3, R5, R8 Резистор 4.7 кОм 5 SMD 1206
R4 Резистор 24 кОм 1 SMD 1206
R6, R10, R12, R14 Резистор 1 кОм 4 SMD 1206
R7 Резистор 2.7 кОм 1 SMD 1206
R9, R11 Резистор 10 кОм 2 SMD 1206
R13 Резистор 22 Ом 1 SMD 1206
R15 Резистор 150 Ом 1 SMD 1206
Резистор 0 Ом 3 SMD 1206 перемычка
RV1, RV4 Подстроечный резистор 10 кОм 2
RV3 Подстроечный резистор 1 кОм 1
C1-C5 Конденсатор 0.1 мкФ 5 4хSMD 0806 и 1хSMD1206
C6 Конденсатор 470 мкФ х 16В 1
C7 Конденсатор 100 мкФ х 10B 1
BAT1 Батарейка CR2032 1
LS1 Излучатель звуковой KC-1201 1 Без встроенного генератора
Тактовая кнопка IT-1102w 4 SMD