- Необходимые материалы:
- Расчет скорости и пройденного расстояния:
- Принципиальная схема и настройка оборудования:
- Моделирование:
- Программирование PIC16F877A:
- Рабочее объяснение:
Измерение скорости / об / мин транспортного средства или двигателя всегда было увлекательным проектом для нас. Итак, в этом проекте мы собираемся построить его с использованием микроконтроллеров PIC, готовых к промышленной эксплуатации. Мы будем использовать кусок магнита и датчик Холла для измерения скорости. Существуют и другие способы / датчики для измерения скорости, но использование датчика Холла дешево и также может использоваться на любом типе двигателя / транспортного средства. Выполняя этот проект, мы также улучшим наши навыки в изучении PIC16F877A, так как проект предполагает использование прерываний и таймеров. В конце этого проекта вы сможете рассчитать скорость и расстояние, преодолеваемое любым вращающимся объектом, и отобразить их на ЖК-экране 16x2. Давайте начнем с этого цифрового спидометра и схемы одометра с PIC.
Необходимые материалы:
- PIC16F877A
- 7805 Регулятор напряжения
- Датчик эффекта Холла (US1881 / 04E)
- ЖК-дисплей 16 * 2
- Небольшой кусочек магнита
- Соединительные провода
- Конденсаторы
- Макетная плата.
- Источник питания
Расчет скорости и пройденного расстояния:
Прежде чем мы фактически начнем строить схему, давайте разберемся, как мы будем использовать датчик Холла и магнит для расчета скорости колеса. Ранее мы использовали ту же технику для создания спидометра Arduino, который отображает показания на смартфоне Android.
Датчик Холла - это устройство, которое может определять присутствие магнита в зависимости от его полярности. Мы прикрепляем небольшой кусочек магнита к колесу и размещаем рядом с ним датчик Холла таким образом, чтобы каждый раз, когда колесо вращается, датчик Холла обнаруживал его. Затем мы используем таймеры и прерывания на нашем микроконтроллере PIC, чтобы вычислить время, необходимое для одного полного вращения колеса.
Как только затраченное время известно, мы можем рассчитать число оборотов в минуту, используя следующие формулы: где 1000 / затраченное время даст нам число RPS, а дальнейшее умножение его на 60 даст вам число оборотов в минуту.
об / мин = (1000 / затраченное время) * 60;
Где (1000 / timetaken) дает число оборотов в секунду (число оборотов в секунду), а оно умножается на 60, чтобы преобразовать число оборотов в секунду в число оборотов в минуту (число оборотов в минуту).
Теперь, чтобы рассчитать скорость транспортного средства, нам нужно знать радиус колеса. В нашем проекте мы использовали маленькое игрушечное колесо с радиусом всего 3 см. Но мы предположили, что радиус колеса должен составлять 30 см (0,3 м), чтобы мы могли визуализировать показания.
Это значение также умножается на 0,37699, поскольку мы знаем, что скорость = (об / мин (диаметр * Pi) / 60). Формулы упрощены до
v = радиус_колеса * об / мин * 0,37699;
После расчета скорости мы можем также рассчитать пройденное расстояние, используя аналогичный метод. Благодаря нашему расположению Холла и магнита мы знаем, сколько раз вращалось колесо. Мы также знаем радиус колеса, используя который мы можем найти окружность колеса, предполагая, что радиус колеса составляет 0,3 м (R), значения окружности Pi * R * R будут 0,2827. Это означает, что каждый раз, когда датчик Холла встречается с магнитом, колесо преодолевает расстояние 0,2827 метра.
Дистанция покрыта = покрытая дистанция + длина окружности_круга
Поскольку теперь мы знаем, как будет работать этот проект, давайте перейдем к нашей принципиальной схеме и приступим к ее созданию.
Принципиальная схема и настройка оборудования:
Принципиальная схема этого проекта спидометра и одометра очень проста и может быть построена на макете. Если вы следовали руководствам по PIC, вы также можете повторно использовать оборудование, которое мы использовали для изучения микроконтроллеров PIC. Здесь мы использовали ту же перфорационную плату, которую мы создали для мигания светодиодов с микроконтроллером PIC, как показано ниже:
Назначение выводов микроконтроллера PIC16F877A приведено в таблице ниже.
S.No: |
Пин код |
Имя контакта |
Соединен с |
1 |
21 год |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E LCD |
3 |
27 |
RD4 |
D4 ЖК-дисплея |
4 |
28 |
RD5 |
D5 ЖК-дисплея |
5 |
29 |
RD6 |
D6 ЖК-дисплея |
6 |
30 |
RD7 |
D7 ЖК-дисплея |
7 |
33 |
RB0 / INT |
3- й контакт датчика Холла |
Как только вы создадите свой проект, он должен выглядеть примерно так, как на картинке ниже.
Как видите, я использовал две коробки, чтобы разместить рядом мотор и датчик Холла. Вы можете закрепить магнит на вращающемся объекте и не повредить датчик Холла рядом с ним таким образом, чтобы он мог обнаружить магнит.
Примечание: датчик Холла имеет полярность, поэтому убедитесь, какой полюс он обнаруживает, и разместите его соответствующим образом.
Также убедитесь, что вы используете подтягивающий резистор с выходным контактом датчика Холла.
Моделирование:
Моделирование для этого проекта выполняется с помощью Proteus. Поскольку проект включает в себя движущиеся объекты, невозможно продемонстрировать весь проект с помощью моделирования, но можно проверить работу ЖК-дисплея. Просто загрузите шестнадцатеричный файл в Simulation и смоделируйте его. Вы увидите, как ЖК-дисплей работает, как показано ниже.
Чтобы проверить работоспособность спидометра и одометра, я заменил датчик Холла на устройство логического состояния. Во время моделирования вы можете нажать кнопку логического состояния, чтобы вызвать прерывание и проверить, обновляются ли скорость и пройденное расстояние, как показано выше.
Программирование PIC16F877A:
Как было сказано ранее, мы будем использовать таймеры и прерывания в микроконтроллере PIC16F877A для расчета времени, затрачиваемого на один полный оборот колеса. Мы уже узнали, как использовать таймеры в предыдущем руководстве. Полный код проекта я привел в конце статьи. Далее я объяснил несколько важных строк ниже.
В приведенных ниже строках кода порт D инициализируется как выходные контакты для сопряжения с ЖК-дисплеем, а RB0 как входной контакт для использования его в качестве внешнего контакта. Кроме того, мы включили внутренний подтягивающий резистор с помощью OPTION_REG и также установили 64 в качестве предпродажной. Затем мы разрешаем глобальное и периферийное прерывание, чтобы активировать таймер и внешнее прерывание. Чтобы определить RB0 как внешнее прерывание, бит INTE должен быть установлен в высокий уровень. Значение переполнения установлено равным 100, так что каждую 1 миллисекунду будет срабатывать флаг прерывания таймера TMR0IF. Это поможет запустить миллисекундный таймер, чтобы определить время в миллисекундах:
TRISD = 0x00; // PORTD объявлен как выход для сопряжения с ЖК-дисплеем TRISB0 = 1; // Определите вывод RB0 как вход для использования в качестве вывода прерывания OPTION_REG = 0b00000101; // Timer0 64 как предскалярный // Также включает PULL UP TMR0 = 100; // Загружаем значение времени для 1 мс; delayValue может находиться в диапазоне 0-256 только TMR0IE = 1; // Разрешить бит прерывания таймера в регистре PIE1 GIE = 1; // Разрешить глобальное прерывание PEIE = 1; // Разрешить периферийное прерывание INTE = 1; // Включение RB0 как внешнего вывода прерывания
Приведенная ниже функция будет выполняться каждый раз при обнаружении прерывания. Мы можем назвать функцию по своему желанию, поэтому я назвал ее speed_isr (). Эта программа имеет дело с двумя прерываниями: одно - это прерывание от таймера, а другое - внешнее прерывание. Всякий раз, когда происходит прерывание от таймера, флаг TMR0IF становится высоким, чтобы очистить и сбросить прерывание, мы должны сделать его низким, задав TMR0IF = 0, как показано в коде ниже.
void interrupt speed_isr () {if (TMR0IF == 1) // Таймер переполнился {TMR0IF = 0; // Сбросить флаг прерывания таймера milli_sec ++; } если (INTF == 1) {об / мин = (1000 / милли_сек) * 60; скорость = 0,3 * об / мин * 0,37699; // (Предполагая радиус колеса 30 см) INTF = 0; // очищаем флаг прерывания milli_sec = 0; расстояние = расстояние + 028,2; }}
Аналогично, когда происходит внешнее прерывание, флаг INTF становится высоким, его также следует сбросить, задав INTF = 0. Затраченное время отслеживается с помощью прерывания от таймера, а внешнее прерывание определяет, когда колесо завершило один полный оборот. На основе этих данных рассчитывается скорость и расстояние, пройденное колесом во время каждого внешнего прерывания.
После расчета скорости и расстояния их можно просто отобразить на ЖК-экране с помощью наших ЖК-функций. Если вы новичок в ЖК-дисплеях, обратитесь к нашему руководству по сопряжению ЖК-дисплея с микроконтроллером PIC16F877A.
Рабочее объяснение:
После того, как вы подготовите оборудование и программное обеспечение, просто загрузите код в PIC16F877A. Если вы новичок в PIC, вам следует прочитать несколько руководств о том, как загрузить программу в микроконтроллер PIC16F877A.
Я использовал переменный POT для регулировки скорости двигателя в демонстрационных целях. Вы также можете использовать то же самое для поиска приложения в реальном времени. Если все работает, как ожидалось, вы сможете получить скорость в км / ч и пройденное расстояние в метрах, как показано на видео ниже.
Надеюсь, вам понравился проект и он заработал. Если нет, вы можете использовать раздел комментариев ниже или форум, чтобы оставить свои сомнения.