- Materials necessaris:
- Càlcul de la velocitat i la distància cobertes:
- Diagrama de circuits i configuració de maquinari:
- Simulació:
- Programació del PIC16F877A:
- Explicació de treball:
Mesurar la velocitat / rpm d’un vehicle o d’un motor sempre ha estat un projecte fascinant per a nosaltres. Per tant, en aquest projecte en construirem un amb els microcontroladors PIC industrials preparats. Utilitzarem un tros d’imant i un sensor Hall per mesurar la velocitat. Hi ha altres maneres / sensors per mesurar la velocitat, però, utilitzar un sensor de sala és barat i també es pot utilitzar en qualsevol tipus de motor / vehicle. En fer aquest projecte, també millorarem les nostres habilitats en l’aprenentatge de PIC16F877A, ja que el projecte implica l’ús d’interrupcions i temporitzadors. Al final d'aquest projecte, podreu calcular la velocitat i les distàncies cobertes per qualsevol objecte giratori i mostrar-les en una pantalla LCD de 16x2. Comencem amb aquest velocímetre digital i el circuit de l’odòmetre amb PIC.
Materials necessaris:
- PIC16F877A
- Regulador de voltatge 7805
- Sensor d'efecte Hall (US1881 / 04E)
- Pantalla LCD de 16 * 2
- Un petit tros d’imant
- Connexió de cables
- Condensadors
- Taula de pa.
- Font d'alimentació
Càlcul de la velocitat i la distància cobertes:
Abans de començar a construir el circuit, entenguem com utilitzarem un sensor Hall i un imant per calcular la velocitat d’una roda. Anteriorment, hem utilitzat la mateixa tècnica per construir el velocímetre Arduino que mostra les lectures al telèfon intel·ligent Android.
Un sensor Hall és un dispositiu que pot detectar la presència d’un imant en funció de la seva polaritat. Enganxem un petit tros d’imant a la roda i col·loquem el sensor del vestíbul a prop, de manera que cada vegada que giri la roda el sensor del vestíbul el detecti. A continuació, utilitzem l’ajuda de temporitzadors i interrupcions del nostre microcontrolador PIC per calcular el temps necessari per a una rotació completa de la roda.

Un cop conegut el temps que necessitem, podem calcular el RPM utilitzant les fórmules següents: on 1000 / temps que es prengui ens donarà el RPS i, multiplicant-lo amb 60, obtindreu el RPM.
rpm = (1000 / temporades) * 60;
On (1000 / temporades) es dóna el rps (revolucions per segon) i es multiplica per 60 per convertir rps a rpm (revolucions per minut).
Ara per calcular la velocitat del vehicle hem de conèixer el radi de la roda. En el nostre projecte hem utilitzat una roda de joguina petita que té un radi de només 3cm. Però, hem assumit que el radi de la roda ha de ser de 30 cm (0,3 m) per poder visualitzar les lectures.
El valor també es multiplica per 0,3799, ja que sabem que Velocity = (RPM (diàmetre * Pi) / 60). Les fórmules es simplifiquen fins a
v = radi_de_roda * rpm * 0,3799;
Un cop calculem la velocitat, també podem calcular la distància recorreguda mitjançant un mètode similar. Amb la nostra disposició Hall i imant, sabem quantes vegades la roda ha girat. També coneixem el radi de la roda, amb la qual podem trobar la circumferència de la roda, suposant que el radi de la roda sigui 0,3 m (R), els valors de la circumferència Pi * R * R seran 0,2827. Això significa que, cada vegada que el sensor de sala es troba amb l'imant, la roda cobreix una distància de 0,2827 metres.
Distància_coberta = distància_coberta + circumferència_del_cercle
Com que ara sabem com funcionarà aquest projecte, anem al nostre diagrama de circuits i comencem a construir-lo.
Diagrama de circuits i configuració de maquinari:

El diagrama del circuit d’aquest projecte de velocímetre i comptaquilòmetres és molt senzill i es pot construir sobre una taula de treball. Si heu seguit els tutorials PIC, també podeu reutilitzar el maquinari que hem utilitzat per aprendre microcontroladors PIC. Aquí hem utilitzat la mateixa placa perfecta que hem creat per a parpellejar LED amb microcontrolador PIC, com es mostra a continuació:

Les connexions de pins per a la MCU PIC16F877A es donen a la taula següent.
|
S. No: |
Número de pin |
Nom del pin |
Connectat a |
|
1 |
21 |
RD2 |
RS de LCD |
|
2 |
22 |
RD3 |
E de pantalla LCD |
|
3 |
27 |
RD4 |
D4 de pantalla LCD |
|
4 |
28 |
RD5 |
D5 de pantalla LCD |
|
5 |
29 |
RD6 |
D6 de pantalla LCD |
|
6 |
30 |
RD7 |
D7 de pantalla LCD |
|
7 |
33 |
RB0 / INT |
3 rd pin de sensor Hall |
Un cop hagueu construït el vostre projecte, hauria de tenir un aspecte semblant a la imatge següent

Com podeu veure, he utilitzat dues caixes per col·locar el motor i un sensor de sala a la posició propera. Podeu fixar l’imant a l’objecte que gira i intactar el sensor del vestíbul prop d’ell de manera que pugui detectar l’imant.
Nota: el sensor Hall té polaritats, així que assegureu-vos de quin pol detecta i col·loqueu-lo en conseqüència.
Assegureu-vos també que utilitzeu una resistència pull-up amb el pin de sortida del sensor hall.
Simulació:
La simulació d’aquest projecte es fa mitjançant Proteus. Com que el projecte implica objectes en moviment, no és possible demostrar el projecte complet mitjançant simulacions, però es pot verificar el funcionament de la pantalla LCD. Simplement carregueu el fitxer hexadecimal a la simulació i simuleu-lo. Podreu notar que la pantalla LCD funciona com es mostra a continuació.

Per comprovar que el velocímetre i el comptaquilòmetres funcionen, he substituït el sensor Hall per un dispositiu d'estat lògic. Durant la simulació, podeu fer clic al botó d'estat lògic per activar la interrupció i comprovar si la velocitat i la distància recorreguda s'actualitzen tal com es mostra a dalt.
Programació del PIC16F877A:
Com s’ha dit anteriorment, utilitzarem l’ajut de temporitzadors i interrupcions del microcontrolador PIC16F877A per calcular el temps que es necessita per fer una rotació completa de la roda. Ja hem après a utilitzar els temporitzadors al nostre tutorial anterior. He donat el codi complet del projecte al final d’aquest article. A continuació he explicat algunes línies importants a continuació.
Les línies de codi següents inicialitzen el port D com a pins de sortida per a la interfície LCD i RB0 com a pin d'entrada per utilitzar-lo com a pin extern. A més, hem activat la resistència de tracció interna mitjançant OPTION_REG i també hem establert 64 com a prevenda. A continuació, activem la interrupció global i perifèrica per habilitar la temporització i la interrupció externa. Per definir RB0 com a bit d'interrupció extern INTE s'hauria d'elevar. El valor de Desbordament és 100, de manera que per cada 1 mil·lisegon s'activarà el senyal d'interrupció del temporitzador TMR0IF. Això ajudarà a executar un temporitzador de mil·lisegons per determinar el temps trigat en mil·lisegons:
TRISD = 0x00; // PORTD declarat com a sortida per a la interfície LCD TRISB0 = 1; // DEfiniu el pin RB0 com a entrada per utilitzar-lo com a pin d'interrupció OPTION_REG = 0b00000101; // Temporitzador0 64 com a prescalar // També habilita PULL UP TMR0 = 100; // Carregueu el valor de temps durant 1 ms; delayValue només pot estar entre 0-256 TMR0IE = 1; // Activa el bit d’interrupció del temporitzador al registre PIE1 GIE = 1; // Activa la interrupció global PEIE = 1; // Activeu la interrupció perifèrica INTE = 1; // Activeu RB0 com a pin d'interrupció extern
La funció següent s'executarà cada vegada que es detecti una interrupció. Podem anomenar la funció segons el nostre desig, de manera que l’he nomenat speed_isr (). Aquest programa tracta de dues interrupcions: una és Interrupció per temporitzador i l’altra és Interrupció externa. Sempre que es produeix una interrupció del temporitzador, el senyal TMR0IF augmenta, per esborrar i restablir la interrupció hem de fer-la baixa definint TMR0IF = 0 tal com es mostra al codi següent.
void interrupt speed_isr () {if (TMR0IF == 1) // El temporitzador ha sobrepassat {TMR0IF = 0; // Esborra el senyal d'interrupció del temporitzador milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sec) * 60; velocitat = 0,3 * rpm * 0,3799; // (Suposant que el radi de la roda sigui de 30 cm) INTF = 0; // esborreu el senyal d'interrupció milli_sec = 0; distància = distància + 028,2; }}
De la mateixa manera, quan es produeix una interrupció externa, la bandera INTF augmentarà, també s'hauria d'esborrar definint INTF = 0. La interrupció del temporitzador manté el temps emprat i la interrupció externa determina quan la roda ha completat una rotació completa. Amb aquestes dades, la velocitat i la distància cobertes per la roda es calculen durant cada interrupció externa.
Un cop calculada la velocitat i la distància, es poden mostrar simplement a la pantalla LCD mitjançant les nostres funcions LCD. Si no coneixeu els LCDs, consulteu el nostre tutorial MCU PIC16F877A sobre interfícies LCD.
Explicació de treball:
Un cop hàgiu preparat el maquinari i el programari, només cal que pengeu el codi al vostre PIC16F877A. Si sou completament nou a PIC, hauríeu de llegir alguns tutorials sobre saber carregar el programa a un microcontrolador PIC16F877A.
He utilitzat un POT variable per ajustar la velocitat del motor amb finalitats de demostració. També podeu utilitzar el mateix de trobar una aplicació en temps real. Si tot funciona com s'esperava, hauríeu de poder obtenir la velocitat en km / hora i la distància coberta en termes de metres, tal com es mostra al vídeo següent.

Espero que us hagi agradat el projecte i que el feu funcionar. Si no, podeu utilitzar la secció de comentaris o el fòrum per publicar el vostre dubte.
