- Materiale necesare:
- Calculul vitezei și distanței acoperite:
- Schema circuitului și configurarea hardware-ului:
- Simulare:
- Programarea PIC16F877A:
- Explicație de lucru:
Măsurarea vitezei / rpm a unui vehicul sau a unui motor a fost întotdeauna un proiect fascinant pentru noi de încercat. Deci, în acest proiect vom construi unul folosind microcontrolerele PIC industriale pregătite. Vom folosi o bucată de magnet și un senzor Hall pentru a măsura viteza. Există alte modalități / senzori de măsurare a vitezei, dar utilizarea unui senzor de hală este ieftină și poate fi utilizată și pe orice tip de motor / vehicul. Prin realizarea acestui proiect, ne vom îmbunătăți și abilitățile în învățarea PIC16F877A, deoarece proiectul implică utilizarea întreruperilor și cronometrelor. La sfârșitul acestui proiect, veți putea calcula viteza și distanțele parcurse de orice obiect rotativ și le puteți afișa pe un ecran LCD de 16x2. Să începem cu acest Vitezometru digital și Circuitul Odometru cu PIC.
Materiale necesare:
- PIC16F877A
- 7805 Regulator de tensiune
- Senzor de efect Hall (US1881 / 04E)
- Afisaj LCD 16 * 2
- O mică bucată de magnet
- Conectarea firelor
- Condensatoare
- Breadboard.
- Alimentare electrică
Calculul vitezei și distanței acoperite:
Înainte de a începe să construim circuitul, să înțelegem cum vom folosi un senzor Hall și un magnet pentru a calcula viteza unei roți. Anterior, am folosit aceeași tehnică pentru a construi vitezometrul Arduino care afișează citiri pe telefonul inteligent Android.
Un senzor Hall este un dispozitiv care poate detecta prezența unui magnet pe baza polarității sale. Lipim o mică bucată de magnet pe roată și așezăm senzorul holului lângă el în așa fel încât de fiecare dată când rotirea roții senzorul hol îl detectează. Apoi folosim ajutorul cronometrelor și întreruperilor de pe microcontrolerul nostru PIC pentru a calcula timpul necesar unei rotații complete a roții.
Odată cunoscut timpul necesar, putem calcula RPM utilizând formulele de mai jos, unde 1000 / timpul luat ne va oferi RPS și înmulțirea acestuia cu 60 vă va oferi RPM
rpm = (1000 / temporizat) * 60;
Unde (1000 / timp) dă rps (Revoluții pe secundă) și se înmulțește cu 60 pentru a converti rps în rpm (Revoluții pe minut).
Acum, pentru a calcula viteza vehiculului, trebuie să cunoaștem raza roții. În proiectul nostru am folosit o roată mică de jucărie care are o rază de doar 3cm. Dar, am presupus că raza roții trebuie să fie de 30 cm (0,3 m), astfel încât să putem vizualiza citirile.
Valoarea este, de asemenea, înmulțită cu 0.37699, deoarece știm că Velocity = (RPM (diametru * Pi) / 60). Formulele sunt simplificate până la
v = radius_of_wheel * rpm * 0.37699;
Odată ce calculăm viteza, putem calcula și distanța parcursă folosind o metodă similară. Cu aranjamentul nostru Hall și magnet știm că de câte ori s-a rotit roata. Știm, de asemenea, raza roții, cu ajutorul căreia putem găsi circumferința roții, presupunând că raza roții este de 0,3 m (R), valorile circumferinței Pi * R * R vor fi 0,2827. Aceasta înseamnă că, de fiecare dată când senzorul de hală întâlnește magnetul, o distanță de 0,2827 metri este acoperită de roată.
Distanță_coperită = distanță_coperită + circumferința_cercului
Deoarece, acum știm cum va funcționa acest proiect, vom continua cu schema noastră de circuite și vom începe să o construim.
Schema circuitului și configurarea hardware-ului:
Diagrama circuitului acestui proiect al vitezometrului și a contorului de kilometraj este foarte simplă și poate fi construită pe o placă de calcul. Dacă ați urmat tutorialele PIC, puteți reutiliza și hardware-ul pe care l-am folosit pentru învățarea microcontrolerelor PIC. Aici am folosit aceeași placă de perfecționare pe care am construit-o pentru LED-ul intermitent cu microcontroler PIC, așa cum se arată mai jos:
Conexiunile pin pentru MCU PIC16F877A sunt date în tabelul de mai jos.
S. Nu: |
Numarul pin |
Nume PIN |
Conectat la |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RB0 / INT |
Al 3- lea pin al senzorului Hall |
Odată ce vă construiți proiectul, ar trebui să arate cam așa în imaginea de mai jos
După cum puteți vedea, am folosit două cutii pentru a plasa motorul și un senzor de hol în poziția din apropiere. Puteți fixa magnetul pe obiectul dvs. rotativ și intact senzorul de hol aproape de el în așa fel încât să poată detecta magnetul.
Notă: Senzorul Hall are polarități, deci asigurați-vă ce pol detectează și plasați-l corespunzător.
De asemenea, asigurați-vă că utilizați un rezistor Pull-up cu pinul de ieșire al senzorului de hol.
Simulare:
Simularea pentru acest proiect se face folosind Proteus. Deoarece proiectul implică mutarea obiectelor, nu este posibil să se demonstreze proiectul complet folosind simularea, dar funcționarea ecranului LCD poate fi verificată. Pur și simplu încărcați fișierul hexagonal în Simulare și simulați-l. Veți putea observa funcționarea LCD-ului așa cum se arată mai jos.
Pentru a verifica vitezometrul și kilometrajul funcționează, am înlocuit senzorul Hall cu un dispozitiv de stare logică. În timpul simulării puteți face clic pe butonul de stare logică pentru a declanșa întreruperea și a verifica dacă viteza și distanța parcurse se actualizează așa cum se arată mai sus.
Programarea PIC16F877A:
După cum sa spus mai devreme, vom folosi ajutorul cronometrelor și întreruperilor din microcontrolerul PIC16F877A pentru a calcula timpul necesar unei rotații complete a roții. Am învățat deja cum să folosim temporizatoarele în tutorialul nostru precedent. Am dat codul complet al proiectului la sfârșitul acestui articol. Mai departe, am explicat câteva linii importante mai jos.
Liniile de cod de mai jos inițializează portul D ca pini de ieșire pentru interfața LCD și RB0 ca pin de intrare pentru utilizarea acestuia ca pin extern. Mai mult, am activat rezistența de tragere internă folosind OPTION_REG și am setat 64 ca pre-vânzare. Atunci activăm întreruperea globală și periferică pentru a activa temporizatorul și întreruperea externă. Pentru a defini RB0 ca bit de întrerupere extern INTE ar trebui să fie ridicat. Valoarea Overflow este setată să fie 100, astfel încât pentru fiecare 1 milisecundă să se declanșeze semnalul de întrerupere a temporizatorului TMR0IF. Acest lucru vă va ajuta să rulați un cronometru de milisecundă pentru a determina timpul necesar în milisecunde:
TRISD = 0x00; // PORTD declarat ca ieșire pentru interfața LCD TRISB0 = 1; // DEFiniți pinul RB0 ca intrare pentru a-l utiliza ca pin de întrerupere OPTION_REG = 0b00000101; // Timer0 64 ca prescalar // Activează și PULL UP-urile TMR0 = 100; // Încărcați valoarea timpului pentru 1 ms; delayValue poate fi între 0-256 numai TMR0IE = 1; // Activați bitul de întrerupere a temporizatorului în registrul PIE1 GIE = 1; // Activați Global Interrupt PEIE = 1; // Activați întreruperea periferică INTE = 1; // Activați RB0 ca pin extern de întrerupere
Funcția de mai jos va fi executată de fiecare dată când este detectată o întrerupere. Putem numi funcția conform dorinței noastre, așa că am numit-o ca speed_isr (). Acest program tratează două întreruperi, una este Timer Interrupt și cealaltă este External Interrupt. Ori de câte ori apare o întrerupere cu temporizator, semnalul TMR0IF se ridică, pentru a șterge și a reseta întreruperea, trebuie să o reducem definind TMR0IF = 0 așa cum se arată în codul de mai jos.
void interrupt speed_isr () {if (TMR0IF == 1) // Timerul a survolat {TMR0IF = 0; // Ștergeți indicatorul de întrerupere a temporizatorului milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; viteza = 0.3 * rpm * 0.37699; // (Presupunând că raza roții este de 30cm) INTF = 0; // ștergeți indicatorul de întrerupere milli_sec = 0; distanță = distanță + 028,2; }}
În mod similar, atunci când are loc o întrerupere externă, semnalul INTF va crește, acest lucru ar trebui, de asemenea, eliminat definind INTF = 0. Timpul necesar este ținut în evidență de întreruperea temporizatorului și întreruperea externă determină când roata a finalizat o rotație completă. Cu aceste date, viteza și distanța parcurse de roată sunt calculate în timpul fiecărei întreruperi externe.
Odată ce viteza și distanța sunt calculate, acestea pot fi afișate pur și simplu pe ecranul LCD folosind funcțiile noastre LCD. Dacă sunteți nou în LCD-uri, consultați ecranul nostru de interfață LCD cu tutorialul MCU PIC16F877A.
Explicație de lucru:
După ce ați pregătit hardware-ul și software-ul, pur și simplu încărcați codul pe PIC16F877A. Dacă sunteți complet nou în PIC, atunci ar trebui să citiți câteva tutoriale pentru a ști cum să încărcați programul pe un microcontroler PIC16F877A.
Am folosit un POT variabil pentru a regla viteza motorului în scop demonstrativ. De asemenea, puteți utiliza același lucru pentru a găsi o aplicație în timp real. Dacă totul funcționează așa cum era de așteptat, atunci ar trebui să puteți obține viteza în km / oră și distanța acoperită în termeni de metri, așa cum se arată în videoclipul de mai jos.
Sper că ți-a plăcut proiectul și l-ai pus în funcțiune. Dacă nu, puteți utiliza secțiunea de comentarii de mai jos sau forumul pentru a vă posta îndoielile.