Цифровой спидометр и одометр на микроконтроллере PIC


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

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

Итак, в нашем проекте мы можем определять скорость и пройденную дистанцию с помощью микроконтроллера PIC и датчика Холла и выводить их на экран ЖК дисплея 16x2. Также на нашем сайте вы можете посмотреть другие проекты спидометров и одометров:

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

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Держатель микросхем на 40 контактов (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. Датчик Холла US1881/04E (купить на AliExpress).
  5. Небольшой кусок магнита.
  6. Кварцевый генератор 20 МГц (купить на AliExpress).
  7. Конденсатор 0,1 мкФ и 22 пФ (2 шт.) (купить на AliExpress).
  8. Конденсатор 10 мкФ (купить на AliExpress).
  9. Регулятор напряжения 7805 (купить на AliExpress).
  10. Резистор 10 кОм (купить на AliExpress).
  11. Потенциометр 10 кОм (купить на AliExpress).
  12. ЖК дисплей 16х2 (купить на AliExpress).
  13. Перфорированная плата.
  14. Соединительные провода.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Расчет скорости и пройденного расстояния

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

Внешний вид платы с датчиком Холла

Если нам будет известно время одного оборота, то мы сможем рассчитать количество оборотов в минуту (revolutions per minute, RPM) по следующей формуле:

В этой формуле (1000/timetaken) позволяет нам рассчитать число оборотов в секунду (Revolutions per second, rps), а при помощи умножения этой величины на 60 мы как раз и получаем число оборотов в минуту (rpm).

Теперь, чтобы рассчитать скорость транспортного средства нам необходимо знать радиус колеса. В нашем проекте мы использовали небольшое колесо от детской игрушки радиусом 3 см. Но мы будем считать что у нас колесо радиусом 30 см чтобы смоделировать измерение скорости для реального транспортного средства.

Теперь нам необходимо умножить полученное значение числа оборотов в минуту на значение 0.37699 поскольку скорость=(RPM (diameter * Pi) / 60). В результате получаем следующую упрощенную формулу для расчета скорости:

Затем мы можем определить и пройденное расстояние аналогичным образом. С помощью наших магнита и датчика Холла мы будем знать какое число оборотов совершило колесо. Зная радиус колеса мы сможем определить длину его окружности, в нашем случае оно составит величину 0,2827 метра. Это будет означать, что каждый раз когда датчик Холла будет обнаруживать вблизи себя магнит наше транспортное средство будет проезжать расстояние равное 0,2827 метра. В результате получим следующую формулу для расчета пройденного расстояния:

где circumference_of_the_circle – длина окружности нашего колеса.

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

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

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

Внешний вид платы из проекта мигания светодиодом на микроконтроллере PIC

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

№ п/п Номер контакта Наименование контакта Куда подключен
1 21 RD2 RS (ЖК дисплей)
2 22 RD3 E (ЖК дисплей)
3 27 RD4 D4 (ЖК дисплей)
4 28 RD5 D5 (ЖК дисплей)
5 29 RD6 D6 (ЖК дисплей)
6 30 RD7 D7 (ЖК дисплей)
7 33 RB0/INT 3-й контакт датчика Холла

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Как видите, мы использовали две небольшие коробочки для закрепления нашей конструкции.

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

Моделирование работы проекта

Моделирование работы проекта производилось с помощью симулятора Proteus. Поскольку проект содержит движущиеся части, то полностью, конечно, смоделировать его в Proteus невозможно. Но проверить работу ЖК дисплея можно. Поэтому загрузите hex файл программы в симулятор и проверьте работу проекта. Вы должны заметить что ЖК дисплей успешно функционирует.

Тестирование работы проекта в симуляторе Proteus

Для проверки работы проекта в Proteus мы заменили датчик Холла на логическое устройство. Для проверки работы проекта вы можете нажимать на эту логическую кнопку что будет приводить к срабатыванию прерывания в микроконтроллере и, таким образом, будет производиться расчет скорости и пройденного расстояния.

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

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

В следующем фрагменте кода мы инициализируем Port D для работы на вывод данных, а контакт RB0 – на ввод данных, на нем мы будем производить обнаружение сигнала внешнего прерывания. Далее мы задействуем внутренний подтягивающий резистор используя OPTION_REG и установим коэффициент деления предделителя равный 64. Затем мы разрешим прерывание таймера, установим глобальное разрешение прерываний и разрешение прерываний от периферийных устройств. В качестве значения начала счета для таймера укажем 100 – в этом случае флаг прерывания от таймера TMR0IF будет срабатывать каждую миллисекунду.

Далее запрограммируем функцию обработки прерывания – она будет вызываться каждый раз при обнаружении прерывания. В нашей программе мы будем использовать два прерывания: одно от таймера, а второе – внешнее прерывание (External Interrupt). При срабатывании прерывания от таймера флаг TMR0IF будет устанавливаться в high, чтобы сбросить это прерывание, мы должны установить TMR0IF=0.

Аналогичным образом при срабатывании внешнего прерывания флаг INTF будет устанавливаться в high, чтобы сбросить это прерывание мы должны установить INTF=0. Используя эти два прерывания (от таймера и внешнее) мы можем определять время, за которое колесо совершает один полный оборот и затем на основании этого времени определить скорость движения транспортного средства и пройденное им расстояние.

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

Тестирование работы проекта

В демонстрационных целях мы использовали потенциометр для управления скоростью вращения колеса. Если проект работает правильно, то на экране ЖК дисплея должны отображаться рассчитанные значения скорости и пройденного пути как показано на следующем рисунке.

Отображение рассчитанных значений скорости и пройденного пути

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

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

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

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

(Проголосуй первым!)
Загрузка...
824 просмотров

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

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