Рубрики
Схемы на PIC

Мониторинг напряжения аккумулятора автомобиля с помощью микроконтроллера PIC

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

Необходимые компоненты

  1. Микроконтроллер PIC18F2520 (купить на AliExpress).
  2. Фабричная печатная плата.
  3. USB коннектор.
  4. 2-пиновый коннектор.
  5. 4-х символьный семисегментный дисплей (4-Digit 7 Segment Display).
  6. Транзисторы BC557 (4 шт.) (купить на AliExpress).
  7. Резисторы 1 кОм (6 шт.), 2 кОм, 100 Ом (8 шт.) (купить на AliExpress).
  8. Конденсаторы 1000 мкФ и 10 мкФ (купить на AliExpress).
  9. Конденсаторы 33 пФ – 2 шт. (купить на AliExpress).
  10. Держатель микросхем на 28 контактов.
  11. Микросхема регулятора напряжения 7805 (купить на AliExpress).
  12. Автомобильная USB зарядка.
  13. Светодиод (купить на AliExpress).
  14. Диоды Зенера (стабилитроны) на 5,1 В (2 шт.) (купить на AliExpress).
  15. USB кабель (B-типа или Arduino UNO совместимый).
  16. Кварцевый генератор на 20 МГц (купить на AliExpress).

Общие принципы работы проекта

В большинстве случаев у нас нет необходимости измерять напряжение на аккумуляторе автомобиле, но это желательно делать во время его зарядки чтобы определить идет процесс заряда или нет. Благодаря этому мы можем предотвратить поломку аккумулятора из-за неисправности зарядной системы автомобиля. Напряжение на 12-вольтовой аккумуляторной батарее автомобиля во время ее заряда составляет величину порядка 13.7v. Соответственно, по значению этого напряжения мы можем определить хорошо ли заряжается наша батарея или нет.

В данном проекте мы рассмотрим создание вольтметра на основе микроконтроллера PIC для измерения напряжения на аккумуляторе автомобиля. Напряжение с выхода автомобильной USB зарядки через делитель напряжения будет подаваться на вход АЦП (аналого-цифрового преобразователя) микроконтроллера, где будет измеряться и выводиться на 4-х символьный семисегментный дисплей. Схема будет позволять измерять напряжения до 15v.

Если аккумулятор автомобиля будет находиться в процессе заряда, то тогда значение напряжения на нем должно составлять величину 13,7 В. Если же двигатель автомобиля не работает или его зарядная система неисправна, тогда напряжение на аккумуляторе будет составлять величину 12 В.

Эту же самую схему можно использовать для измерения любых других напряжений до 15 В. Для этой цели в составе нашей печатной платы предусмотрен 2-х пиновый коннектор (зеленого цвета). На видео, приведенном в конце статьи, вы можете увидеть как с помощью данного устройства производилось измерение напряжения на различных источниках.

Схема проекта

Схема устройства мониторинга напряжения аккумулятора автомобиля на микроконтроллере PIC представлена на следующем рисунке.

Напряжение с выхода аккумуляторной батареи через делитель напряжения будет подаваться на контакт AN0 (28) микроконтроллера PIC, где будет измеряться его АЦП. Для защиты работы схемы используется диод Зенера (стабилитрон) на 5.1v.

4-х символьный семисегментный дисплей, используемый для отображения измеренного значения напряжения, подключен к портам PORTB и PORTC микроконтроллера. Регулятор напряжения 5v на основе микросхемы LM7805 используется для питания всей схемы проекта, в том числе и семисегментного дисплея. Кварцевый генератор 20 МГц используется для подачи тактовой частоты на микроконтроллер. На микросхему LM7805 напряжение питания поступает от автомобильной USB зарядки, для этого в нашу печатную плату мы добавили USB порт, к которому мы непосредственно можем подключать автомобильную зарядку.

Автомобильная USB зарядка обеспечивает стабилизированное напряжение 5v, получаемое за счет преобразования напряжения 12v бортовой сети автомобиля. Но нам необходимо в нашей схеме необходимо измерять напряжение 12v, а не 5v с выхода зарядки, поэтому нам зарядку необходимо немного модифицировать. Для этого вам нужно открыть корпус USB зарядки, найти там выводы 5v (output) и 12v (input) и удалить соединение с 5v, замотав его изоляционной лентой или чем-нибудь еще, и затем соединить напрямую выходы зарядки со входами 12v. Как показано на следующем рисунке мы удалили соединение, показанное красным цветом (для вашей зарядки картинка может отличаться).

Для настройки АЦП на контакте AN0 мы будем использовать внутреннее опорное напряжение 5 В и частоту f/32.

Для расчета напряжения аккумулятора автомобиля мы будем использовать формулу:

Расчет делителя напряжения

В нашем проекте напряжение с выхода аккумуляторной батареи автомобиля может составлять величину 12v-14v, соответственно, максимальное напряжение для нашего проекта вольтметра мы примем равным 15v.

В нашем делителе напряжения резисторы R1 и R2 будут иметь следующие номиналы:

R1= 2K
R2=1K

Соответственно, подставляя в формулу их значения, получим:

Resistor factor= 1023.0 * (1000/2000+1000)
Resistor factor=1023.0 * (1/3)
Resistor factor= 341.0 для напряжений до 15 Вольт

Соответственно, окончательная формула для расчета измеряемого нами напряжения будет выглядеть следующим образом:

Дизайн и заказ печатной платы для нашего проекта

Для разработки дизайна печатной платы авторы проекта (ссылка на оригинал приведена в конце статьи) использовали бесплатный симулятор EasyEDA. В данном симуляторе вы можете сделать разработанный вами дизайн платы видимым всем остальным пользователям сети. Разработанный авторами дизайн печатной платы для этого проекта доступен по следующей ссылке:

https://easyeda.com/circuitdigest/PIC_based_Car_Battery_Monitoring_System-63c2d5948eaa48c5bcbbd8db49a6c776

Внешний вид (сверху) данного дизайна печатной платы приведен на следующем рисунке. Соответственно, открыв данный дизайн в редакторе EasyEDA, вы сможете рассмотреть печатную плату со всех сторон.

Также из редактора EasyEDA можно заказать изготовление печатной платы, использовав свой разработанный дизайн печатной платы или загрузив имеющиеся у вас Gerber файлы в редактор. При заказе изготовления печатной платы необходимо указать количество необходимых экземпляров печатной платы, число ее слоев, толщину, цвет и другие параметры.

Спустя несколько дней после заказа изготовления печатной платы ее авторы получили изготовленные три экземпляра платы в следующем виде:

После этого автор проекта припаял на нее необходимые компоненты и получил собранную конструкцию проекта в следующем виде:

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты. Для написания кода программы мы будем использовать MPLAB X IDE, а для компиляции и компоновки проекта – компилятор XC8. Код программы будет написан на языке C.

В коде программы мы будем считывать значение напряжения, подаваемого на аналоговый контакт микроконтроллера PIC, а для передачи данных на 4-х разрядный семисегментный дисплей мы будем использовать процедуру обработки прерывания от таймера (Timer Interrupt Server Routine). Вычисление измеренного значения напряжения будет производиться в основной части программы.

Первым делом в программе мы подключим необходимые заголовочные файлы и настроим биты конфигурации (фьюзы) микроконтроллера PIC.

Затем объявим контакты, к которым подключен семисегментный дисплей.

Далее запрограммируем функцию обработки прерывания от таймера для вывода данных на семисегментный дисплей. Более подробно об использовании таймеров в микроконтроллерах PIC вы можете прочитать в данной статье.

В основной функции void main() инициализируем таймер.

Затем в цикле while мы будем считывать значение напряжения с аналогового входа и производить необходимые вычисления.

Функция adc_init() будет использоваться для инициализации АЦП.

Функция adc_value() будет использоваться для считывания значения с выхода АЦП и расчета значения напряжения, соответствующего ему.

Функция convert(float f) будет использоваться для преобразования значения напряжения в формат, необходимый для его вывода на семисегментный дисплей.

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *