Автомобильный тахометр с термометром (ARDUINO UNO, HD44780)
У очень многих современных автомобилей нет тахометра. Возможно, производители и правы, и знать водителю частоту вращения коленвала двигателя не обязательно. К тому же, весьма важным параметром для безопасности движения является температура воздуха за пределами автомобиля, особенно в межсезонье, когда наледь на дороге может появиться весьма неожиданно.
Здесь приводится описание очень несложного в изготовлении, благодаря применению готового модуля - ARDUINO UNO, прибора, который одновременно показывает и температуру на улице, и частоту вращения коленвала.
Индикатором служит ЖК-дисплей типа 1602А, он стандартный, на основе контроллера HD44780. Обозначение 1602А фактически значит, что он на две строки по 16 символов в строке.
Основой прибора служит готовая плата ARDUINO UNO, это относительно недорогой готовый модуль, на котором расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и источник питания.
Прибор подключается по питанию к выходу замка зажигания автомобиля, а сигнал на измерение частоты вращения коленвала получает с датчика Холла, который является датчиком зажигания.
Прибор может работать только в автомобиле с электронной системой зажигания (в автомобиле с электромеханической системой зажигания датчика Холла нет).
Датчик зажигания автомобиля с четырехцилиндровым бензиновым двигателем формирует два импульса за один оборот коленчатого вала. Если у двигателя не четыре цилиндра частота следования импульсов будет другой. Здесь именно под четырехцилиндровый мотор.
Принципиальная схема
Датчиком температуры служит термодатчик LM235, который представляет собой физически, термозависимый стабилитрон. Напряжение на нем численно равно температуре по шкале Кельвина, при расчете 0,01V на один градус. То есть, при 0°С (273К) на них 2,73V.
Поэтому, фактически, в части измерения температуры устройство представляет собой вольтметр постоянного напряжения, с вычислителем, переводящим данные об измеренном напряжении в данные о температуре в градусах Цельсия.
Рис. 1. Принципиальная схема автомобильного тахометра с термометром на ARDUINO UNO и HD44780.
Схема прибора показана на рисунке 1. На этом рисунке плата ARDUINO UNO показана схематично как «вид сверху».
Для согласования цифрового порта с датчиком Холла используются каскад на транзисторе VT1. Ток на датчик температуры Т1 поступает через токоограничивающий резистор R5.
Программа для микроконтроллера
Программа на C++ с подробными комментариями приведена в таблице 1.
Рис. Программа для Ардуино.
/* тахометр и термометр */
#include
Liquidcrystal lcd(2, 3, 4, 5, б, 7); //порты для дисплея
int Htime; //длительность положительного полупериода
int Ltime; //длительность отрицательного полупериода int analoglnput=0; //аналоговый вход АО
float vout; //значение аналогового входа АО
float temp; //результат измерения температуры
float Ttime; //длительность полного периода
float frequency; //результат тахометра
void setup() {
pinMode(10, INPUT); //входом тахометра будет порт 10
lcd.begin(16,2); //дисплей 16 символов 2 строки
}
void loop() {
Htime=pulseln(10,HIGH); //измерение положительного полупериода
Ltime=pulseln(10,LOW) ; //измерение отрицательного полупериода
Ttime=Htime+Ltime; //вычисление периода
frequency=30000000/Ttime; //вычисление результата тахометра
vout=analogRead(analoginput); //чтение значения входа АО
temp=vout*5.0/10.24-273.0; //вычисление температуры
lcd.clear(); //очистка памяти дисплея
lcd.setCursor(0,0); //установка курсора на первую строку
lcd.print(frequency,0); //печать целого числа результата тахометра
lcd.print(" ob/min"); //печать единицы измерения тахометра
lcd.setCursor(0,1); //установка курсора на вторую строку
lcd.print(temp,0); //печать целого числа результата температуры
lcd.print(" С"); //печать единицы измерения температуры
delay(500); //время индикации полсекунды
}
Действие программы по измерению частоты вращения коленвала основано на измерении периода импульсов, поступающих с датчика, и последующего расчета частоты вращения коленвала.
Для работы используется функция pulseln , которая измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса. Так что, для того чтобы узнать период нужно сложить длительность положительного и отрицательного полупериодов.
Далее, частота вращения вычисляется по формуле:
F=30/T
где Т - период в секундах, a F - частота вращения коленвала в оборотах в минуту. Поскольку период измерен в микросекундах фактически формула такая:
F= 30000000/Т
Измерение длительности периода состоит из двух частей, сначала измеряются длительности положительной и отрицательной полуволны в строках:
Htime=pulseIn(10,HIGH);
Ltime=pulseln(10,LOW);
Затем, происходит вычисление полного периода в строке:
Ttime=Htime+Ltime;
И потом, вычисление частоты вращения коленвала в строке:
frequency=30000000/Ttime ;
Действие программы по измерению температуры основано на измерении напряжения, на чтении данных с аналогового входа и расчета результата измерения для перевода значения напряжения в значение градусов по Цельсию.
Напряжение на аналоговых портах может быть только положительным и только в пределах от нуля до напряжения питания микроконтроллера, то есть, номинально, до 5V. Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму.
Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.
Но, нам, во-первых, нужно получить результат не в единицах вольт, а в единицах равных 0,01V, а во-вторых, перевести его в градусы Цельсия. Поэтому результат умножается на 5 и делится на 10,24, а затем из него вычитают 273.
Для чтения данных с аналогового порта используется функция analogRead
Чтение данных с аналогового порта АО (именно порт АО здесь используется для измерения напряжения на датчике температуры) происходит в строке:
vout=analogRead(analoginput);
Затем, производится вычисление значения температуры, выраженной в градусах Цельсия:
temp=vout*5.0/10.24-273.0.
В этой строке число 5.0 - это напряжение на выходе стабилизатора платы ARDUINO UNO В идеале должно быть 5V, но для точной работы термометра это напряжение нужно предварительно измерить. Подключите источник питания и измерьте достаточно точным вольтметром напряжение +5V на разъеме POWER платы. Что будет, то и вводите в эти строку вместо 5.0. например, если будет 4.85V, строка будут выглядеть так:
temp=vout*4.85/10.24-273.0;
Затем, результаты измерений выводятся на ЖК-дисплей. Частота вращения вносится в первую строку дисплея, а температура «за бортом» во вторую. Единицы измерения указаны как «ob/min» и «С».
Если входного сигнала с датчика Холла нет, например, включили зажигание, но двигатель не завели, то в строке, где индицируется частота вращения, будет надпись «inf».
Если прибор дает сбои при измерении частоты вращения коленвала, может потребоваться оптимизация режима работы входного каскада на транзисторе VT1, соответственно, подбором сопротивления резистора R3, а так же емкости конденсатора С2. Датчик температуры удобнее всего расположить во внешнем зеркале (если зеркала без подогрева).
Каравкин В. РК-04-20.