- Необхідні матеріали:
- Розрахунок швидкості та відстані:
- Електрична схема та налаштування обладнання:
- Моделювання:
- Програмування вашого PIC16F877A:
- Робоче пояснення:
Вимірювання швидкості / об / хв Транспортного засобу чи двигуна завжди було захоплюючим проектом для нас. Отже, у цьому проекті ми збираємося створити такий, використовуючи мікроконтролери PIC, готові до використання в промисловості. Для вимірювання швидкості ми використаємо шматок магніту та датчик Холла. Існують інші способи / датчики для вимірювання швидкості, але використання датчика Холла є дешевим, і його також можна використовувати на будь-якому типі двигуна / транспортного засобу. Роблячи цей проект, ми також покращимо наші навички вивчення PIC16F877A, оскільки проект передбачає використання переривань та таймерів. Наприкінці цього проекту ви зможете розрахувати швидкість та відстань, яку подолає будь-який обертовий об'єкт, і відобразити їх на РК-екрані 16x2. Почнемо з цього цифрового спідометра та схеми одометра з PIC.
Необхідні матеріали:
- PIC16F877A
- 7805 Регулятор напруги
- Датчик ефекту Холла (US1881 / 04E)
- 16 * 2 РК-дисплей
- Маленький шматочок магніту
- Підключення проводів
- Конденсатори
- Макет.
- Блок живлення
Розрахунок швидкості та відстані:
Перш ніж ми фактично почнемо будувати схему, давайте зрозуміємо, як ми будемо використовувати датчик Холла та магніт для розрахунку швидкості колеса. Раніше ми використовували ту саму техніку для створення спідометра Arduino, який відображає показання на смартфоні Android.
Датчик Холла - це пристрій, який може визначати наявність магніту на основі його полярності. Ми наклеюємо невеликий шматочок магніту на колесо і розміщуємо датчик Холла біля нього таким чином, щоб кожен раз при обертанні колеса датчик Холу його виявляв. Потім ми використовуємо допомогу таймерів та переривань на нашому мікроконтролері PIC для обчислення часу, необхідного для одного повного обертання колеса.
Коли відомий час ми можемо розрахувати RPM, використовуючи наведені нижче формули, де 1000 / час, який ми отримаємо, дасть нам RPS, а подальше множення його на 60 дасть вам RPM
об / хв = (1000 / зайнятий час) * 60;
Де (1000 / зайнятий час) дає частоту обертання (обертів в секунду) і помножується на 60 для перетворення обертів в хвилину (обертів в хвилину).
Тепер для обчислення швидкості руху транспортного засобу ми повинні знати радіус колеса. У нашому проекті ми використали маленьке іграшкове колесо, радіус якого становить лише 3 см. Але ми припустили, що радіус колеса повинен бути 30 см (0,3 м), щоб ми могли візуалізувати показання.
Значення також множиться на 0,37699, оскільки ми знаємо, що швидкість = (об / хв (діаметр * Пі) / 60). Формули спрощені до
v = радіус_колеса * об / хв * 0,37699;
Після того, як ми обчислимо швидкість, ми також можемо розрахувати відстань, подолану подібним методом. Завдяки нашому розташуванню Холла та магнітів ми знаємо, скільки разів оберталось колесо. Ми також знаємо радіус колеса, за допомогою якого ми можемо знайти окружність колеса, припускаючи, що радіус колеса дорівнює 0,3 м (R), значення окружності Pi * R * R становитимуть 0,2827. Це означає, що щоразу, коли датчик Холла зустрічає магніт, колесо долає відстань 0,2827 метра.
Відстань_покрита = відстань_покрита + окружність_ круга
Оскільки тепер ми знаємо, як буде працювати цей проект, давайте перейдемо до нашої принципової схеми та почнемо її будувати.
Електрична схема та налаштування обладнання:
Принципова схема цього проекту спідометра та одометра дуже проста і може бути побудована на макетній дошці. Якщо ви дотримувались навчальних посібників з PIC, ви також можете повторно використовувати обладнання, яке ми використовували для вивчення мікроконтролерів PIC. Тут ми використовували ту саму плату перфів, яку ми створили для світлодіодного блимання з мікроконтролером PIC, як показано нижче:
Штекерні з'єднання для MCU PIC16F877A наведені в таблиці нижче.
S.No: |
Номер PIN-коду |
Ім'я PIN-коду |
Пов'язаний з |
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. Оскільки проект включає рухомі об'єкти, неможливо продемонструвати повний проект за допомогою моделювання, але роботу РК можна перевірити. Просто завантажте шістнадцятковий файл у симулятор та змоделюйте його. Ви зможете помітити, як працює РК-дисплей, як показано нижче.
Щоб перевірити справність спідометра та одометра, я замінив датчик Холла пристроєм стану логіки. Під час моделювання ви можете натиснути кнопку логічного стану, щоб спрацьовувати переривання та перевірити, чи не оновлюється швидкість та відстань, як показано вище.
Програмування вашого PIC16F877A:
Як вже було сказано раніше, ми використовуватимемо таймери та переривання в мікроконтролері PIC16F877A для обчислення часу, необхідного для одного повного обертання колеса. Ми вже навчились користуватися таймерами в нашому попередньому уроці. У кінці цієї статті я подав повний код проекту. Далі я пояснив кілька важливих рядків нижче.
Наведені нижче рядки коду ініціалізують порт D як вихідні штифти для РК-інтерфейсу та RB0 як вхідний штифт для використання його як зовнішнього виводу. Крім того, ми ввімкнули внутрішній підтягуючий резистор за допомогою OPTION_REG, а також встановили 64 як попередній продаж. Потім ми вмикаємо глобальне та периферійне переривання, щоб увімкнути таймер та зовнішнє переривання. Щоб визначити RB0 як зовнішній біт переривання, INTE слід зробити високим. Значення Overflow is встановлено рівним 100, щоб кожні 1 мілісекунди спрацьовував прапор переривання таймера TMR0IF. Це допоможе запустити таймер мілісекунд, щоб визначити час, зайнятий в мілісекундах:
TRISD = 0x00; // PORTD оголошений як вихід для взаємодії РК-дисплея TRISB0 = 1; // Встановіть штифт RB0 як вхідний сигнал, щоб використовувати його як штифт переривання OPTION_REG = 0b00000101; // Timer0 64 як прескаляр // Також дозволяє PULL UPs 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 MCU.
Робоче пояснення:
Після того, як ви підготуєте апаратне та програмне забезпечення, просто завантажте код на свій PIC16F877A. Якщо ви зовсім не новачок у PIC, вам доведеться прочитати кілька підручників з того, як знати, як завантажити програму на мікроконтролер PIC16F877A.
Я використовував змінний POT для регулювання швидкості двигуна з демонстраційною метою. Ви також можете використовувати те саме, щоб знайти програму в режимі реального часу. Якщо все працює так, як очікувалося, ви зможете отримати швидкість у км / год та відстань, викладену в метрах, як показано на відео нижче.
Сподіваюся, вам сподобався проект і він запрацював. Якщо ні, ви можете використати розділ коментарів нижче або форум, щоб опублікувати свої сумніви.