- Необходими материали:
- Изчисляване на скоростта и изминатото разстояние:
- Електрическа схема и хардуерна настройка:
- Симулация:
- Програмиране на вашия PIC16F877A:
- Работно обяснение:
Измерването на скоростта / оборотите в минута на превозно средство или мотор винаги е било очарователен проект за нас, който трябва да опитаме. И така, в този проект ще изградим такъв, използвайки PIC микроконтролери, готови за промишленост. Ще използваме парче магнит и сензор на Хол за измерване на скоростта. Има и други начини / сензори за измерване на скоростта, но използването на сензор на Hall е евтино и може да се използва за всякакъв тип мотор / превозно средство. Правейки този проект, ние също ще подобрим нашите умения за изучаване на PIC16F877A, тъй като проектът включва използването на прекъсвания и таймери. В края на този проект ще можете да изчислите скоростта и разстоянията, изминати от всеки въртящ се обект, и да ги покажете на LCD екран 16x2. Нека започнем с тази цифрова верига на скоростомера и одометъра с PIC.
Необходими материали:
- PIC16F877A
- 7805 Регулатор на напрежение
- Сензор за ефект на Хол (US1881 / 04E)
- 16 * 2 LCD дисплей
- Малко парче магнит
- Свързващи проводници
- Кондензатори
- Макет.
- Захранване
Изчисляване на скоростта и изминатото разстояние:
Преди да започнем да изграждаме веригата, нека разберем как ще използваме сензор на Хол и магнит за изчисляване на скоростта на колелото. По-рано използвахме същата техника за изграждане на Arduino Speedometer, който показва показанията на Android Smart Phone.
Сензорът на Хол е устройство, което може да открие наличието на магнит въз основа на неговата полярност. Залепяме малко парче магнит върху колелото и поставяме сензора на Hall близо до него по такъв начин, че всеки път, когато колелото се върти, сензорът на Hall го разпознава. След това използваме помощта на таймери и прекъсвания на нашия PIC микроконтролер, за да изчислим времето, необходимо за едно пълно завъртане на колелото.
След като времето, за което е известно, можем да изчислим RPM, като използваме формулите по-долу, където 1000 / време, взето ще ни даде RPS и допълнителното умножаване с 60 ще ви даде RPM
обороти в минута = (1000 / време) * 60;
Където (1000 / отнема време) дава rps (обороти в секунда) и се умножава по 60, за да конвертира rps в rpm (обороти в минута).
Сега, за да изчислим скоростта на превозното средство, трябва да знаем радиуса на колелото. В нашия проект сме използвали малко колело за играчки с радиус от само 3 см. Но приехме, че радиусът на колелото трябва да бъде 30 см (0,3 м), за да можем да визуализираме показанията.
Стойността също се умножава с 0,37699, тъй като знаем, че скоростта = (RPM (диаметър * Pi) / 60). Формулите са опростени до
v = радиус_ на_колесо * обороти в минута * 0,37699;
След като изчислим скоростта, можем да изчислим и изминатото разстояние, използвайки подобен метод. С нашата подредба на Hall и магнит знаем колко пъти се е завъртяло колелото. Също така знаем радиуса на колелото, с помощта на който можем да намерим обиколката на колелото, като приемем, че радиусът на колелото е 0,3 m (R) стойностите на обиколката Pi * R * R ще бъдат 0,2827. Това означава, че за всеки път, когато сензорът на залата срещне магнита, колелото покрива разстояние от 0,2827 метра.
Разстояние_покрито = разстояние_покрито + обиколка_на_кръга
Тъй като сега знаем как ще работи този проект, нека да преминем към нашата електрическа схема и да започнем да я изграждаме.
Електрическа схема и хардуерна настройка:
Схемата на този проект за скоростомер и одометър е много проста и може да бъде изградена върху макет. Ако сте следвали уроците за PIC, можете също да използвате повторно хардуера, който използвахме за обучение на PIC микроконтролери. Тук използвахме същата перфектна платка, която сме изградили за LED мигане с PIC микроконтролер, както е показано по-долу:
Пиновите връзки за PIC16F877A MCU са дадени в таблицата по-долу.
S.No: |
ПИН номер |
Име на ПИН |
Свързан с |
1 |
21. |
RD2 |
RS на LCD |
2 |
22. |
RD3 |
E на LCD |
3 |
27 |
RD4 |
D4 на LCD |
4 |
28 |
RD5 |
D5 на LCD |
5 |
29 |
RD6 |
D6 на LCD |
6 |
30 |
RD7 |
D7 на LCD |
7 |
33 |
RB0 / INT |
3 -ти щифт на сензор на Хол |
След като изградите своя проект, той трябва да изглежда нещо подобно на снимката по-долу
Както можете да видите, използвах две кутии, за да поставя двигателя и сензор на Hall в близко положение. Можете да фиксирате магнита върху своя въртящ се обект и да повредите сензора на Hall близо до него по такъв начин, че да може да открие магнита.
Забележка: Датчикът на Хол има полярности, затова се уверете кой полюс открива и го поставете съответно.
Уверете се също, че използвате издърпващ резистор с изходния щифт на сензора на Hall.
Симулация:
Симулацията за този проект се прави с помощта на Proteus. Тъй като проектът включва движещи се обекти, не е възможно да се демонстрира цялостният проект с помощта на симулация, но работата на LCD може да бъде проверена. Просто заредете шестнадесетичния файл в симулацията и го симулирайте. Ще можете да забележите, че LCD дисплеят работи, както е показано по-долу.
За да проверя дали спидометърът и километражът работят, замених сензора на Хол с устройство за логическо състояние. По време на симулацията можете да кликнете върху бутона за логическо състояние, за да задействате Прекъсването и да проверите дали изминатата скорост и разстояние се актуализират, както е показано по-горе.
Програмиране на вашия PIC16F877A:
Както казахме по-рано, ще използваме помощта на таймери и прекъсвания в микроконтролера PIC16F877A, за да изчислим времето, необходимо за едно пълно завъртане на колелото. Вече научихме как да използваме таймери в нашия предишен урок. Дадох пълния код на проекта в края на тази статия. По-нататък обясних няколко важни реда по-долу.
Долните редове на кода инициализират порт D като изходни щифтове за LCD интерфейс и RB0 като входен щифт за използването му като външен щифт. Освен това активирахме вътрешен издърпващ резистор, използвайки OPTION_REG и също така зададохме 64 като предпродажба. След това Активираме глобално и периферно прекъсване, за да активираме таймера и външното прекъсване. За да се дефинира RB0 като външен бит за прекъсване, INTE трябва да се повиши. Стойността за препълване е зададена на 100, така че на всеки 1 милисекунда флагът за прекъсване на таймера TMR0IF ще се задейства. Това ще ви помогне да стартирате милисекунден таймер, за да определите времето, необходимо в милисекунди:
TRISD = 0x00; // PORTD деклариран като изход за свързване на LCD TRISB0 = 1; // ОПРЕДЕЛЕТЕ ПИН RB0 като вход за използване като прекъсване ПИН OPTION_REG = 0b00000101; // Timer0 64 като предскаларен // Също така позволява PULL UPs TMR0 = 100; // Зареждане на стойността на времето за 1ms; 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 Отнеманото време се следи от прекъсването на таймера и външното прекъсване определя кога колелото е завършило едно пълно завъртане. С тези данни скоростта и разстоянието, покрито от колелото, се изчисляват по време на всяко външно прекъсване.
След като скоростта и разстоянието се изчислят, те могат просто да се покажат на LCD екрана, използвайки нашите LCD функции. Ако не сте начинаещи в LCD-тата, направете справка с нашия интерфейсен LCD с PIC16F877A MCU урок.
Работно обяснение:
След като подготвите хардуера и софтуера, просто качете кода на вашия PIC16F877A. Ако сте напълно нови за PIC, трябва да прочетете няколко урока за това как да качите програмата в микроконтролер PIC16F877A.
Използвал съм променлив POT за регулиране на скоростта на двигателя за демонстрационни цели. Можете също да използвате същото за намиране на приложение в реално време. Ако всичко работи както се очаква, трябва да можете да получите скоростта в км / час и разстоянието, покрито в метри, както е показано във видеото по-долу.
Надявам се, че проектът ви е харесал и сте го заработили. Ако не, можете да използвате раздела за коментари по-долу или форума, за да публикувате своите съмнения.