- Materiali richiesti:
- Calcolo della velocità e della distanza percorsa:
- Schema del circuito e configurazione hardware:
- Simulazione:
- Programmazione del PIC16F877A:
- Spiegazione di lavoro:
Misurare la velocità / rpm di un veicolo o di un motore è sempre stato un progetto affascinante da provare. Quindi, in questo progetto ne costruiremo uno utilizzando i microcontrollori PIC pronti per l'industria. Useremo un pezzo di magnete e un sensore Hall per misurare la velocità. Esistono altri modi / sensori per misurare la velocità, ma l'utilizzo di un sensore Hall è economico e può essere utilizzato anche su qualsiasi tipo di motore / veicolo. Facendo questo progetto miglioreremo anche le nostre capacità di apprendimento di PIC16F877A poiché il progetto prevede l'uso di interrupt e timer. Alla fine di questo progetto sarai in grado di calcolare la velocità e le distanze percorse da qualsiasi oggetto rotante e visualizzarle su uno schermo LCD 16x2. Iniziamo con questo tachimetro digitale e circuito contachilometri con PIC.
Materiali richiesti:
- PIC16F877A
- 7805 Regolatore di tensione
- Sensore effetto hall (US1881 / 04E)
- Display LCD 16 * 2
- Un piccolo pezzo di magnete
- Cavi di collegamento
- Condensatori
- Breadboard.
- Alimentazione elettrica
Calcolo della velocità e della distanza percorsa:
Prima di iniziare effettivamente a costruire il circuito, capiamo come utilizzeremo un sensore Hall e un magnete per calcolare la velocità di una ruota. In precedenza abbiamo utilizzato la stessa tecnica per costruire il tachimetro Arduino che visualizza le letture su Android Smart Phone.
Un sensore Hall è un dispositivo in grado di rilevare la presenza di un magnete in base alla sua polarità. Attacchiamo un piccolo pezzo di magnete sulla ruota e posizioniamo il sensore hall vicino ad essa in modo tale che ogni volta che la ruota ruota il sensore hall lo rilevi. Quindi usiamo l'aiuto di timer e interrupt sul nostro microcontrollore PIC per calcolare il tempo impiegato per una rotazione completa della ruota.
Una volta noto il tempo impiegato possiamo calcolare l'RPM utilizzando le formule sottostanti, dove 1000 / tempo impiegato ci darà l'RPS e moltiplicandolo ulteriormente per 60 vi darà l'RPM
rpm = (1000 / tempo impiegato) * 60;
Dove (1000 / timeaken) fornisce i giri al secondo (giri al secondo) e viene moltiplicato per 60 per convertire i giri al minuto (giri al minuto).
Ora per calcolare la velocità del veicolo dobbiamo conoscere il raggio della ruota. Nel nostro progetto abbiamo utilizzato una piccola ruota giocattolo con un raggio di soli 3 cm. Tuttavia, abbiamo ipotizzato che il raggio della ruota sia di 30 cm (0,3 m) in modo da poter visualizzare le letture.
Il valore viene anche moltiplicato per 0,37699 poiché sappiamo che Velocità = (RPM (diametro * Pi) / 60). Le formule sono semplificate fino a
v = radius_of_wheel * rpm * 0,37699;
Una volta calcolata la velocità, possiamo anche calcolare la distanza percorsa utilizzando un metodo simile. Con la nostra disposizione Hall e magnete sappiamo quante volte la ruota ha ruotato. Conosciamo anche il raggio della ruota, usando il quale possiamo trovare la circonferenza della ruota, assumendo che il raggio della ruota sia 0,3 m (R) i valori della circonferenza Pi * R * R saranno 0,2827. Ciò significa che per ogni volta che il sensore Hall incontra il magnete una distanza di 0,2827 metri viene coperta dalla ruota.
Distance_covered = distance_covered + circumference_of_the_circle
Dato che ora sappiamo come funzionerà questo progetto, procediamo al nostro schema circuitale e iniziamo a costruirlo.
Schema del circuito e configurazione hardware:
Lo schema del circuito di questo progetto tachimetro e contachilometri è molto semplice e può essere costruito su una breadboard. Se hai seguito i tutorial PIC, puoi anche riutilizzare l'hardware che abbiamo utilizzato per l'apprendimento dei microcontrollori PIC. Qui abbiamo usato la stessa scheda perf che abbiamo costruito per LED lampeggiante con microcontrollore PIC, come mostrato di seguito:
I collegamenti dei pin per l'MCU PIC16F877A sono riportati nella tabella seguente.
S.No: |
Codice PIN |
Nome pin |
Collegato a |
1 |
21 |
RD2 |
RS di LCD |
2 |
22 |
RD3 |
E di LCD |
3 |
27 |
RD4 |
D4 di LCD |
4 |
28 |
RD5 |
D5 di LCD |
5 |
29 |
RD6 |
D6 di LCD |
6 |
30 |
RD7 |
D7 di LCD |
7 |
33 |
RB0 / INT |
3 ° pin del sensore Hall |
Una volta creato il tuo progetto, dovrebbe essere simile a questo nell'immagine qui sotto
Come puoi vedere ho usato due scatole per posizionare il motore e un sensore di hall in posizione vicina. Puoi fissare il magnete sul tuo oggetto rotante e intattare il sensore hall vicino ad esso in modo tale che possa rilevare il magnete.
Nota: il sensore Hall ha polarità, quindi assicurati di quale polo sta rilevando e posizionalo di conseguenza.
Assicurati inoltre di utilizzare una resistenza pull-up con il pin di uscita del sensore hall.
Simulazione:
La simulazione per questo progetto viene eseguita utilizzando Proteus. Poiché il progetto prevede oggetti in movimento, non è possibile dimostrare il progetto completo utilizzando la simulazione ma è possibile verificare il funzionamento dell'LCD. Basta caricare il file esadecimale nella simulazione e simularlo. Sarai in grado di notare che il display LCD funziona come mostrato di seguito.
Per verificare il funzionamento di tachimetro e contachilometri ho sostituito il sensore Hall con un dispositivo a stati logici. Durante la simulazione è possibile fare clic sul pulsante dello stato logico per attivare l'interruzione e verificare se la velocità e la distanza percorsa vengono aggiornate come mostrato sopra.
Programmazione del PIC16F877A:
Come detto in precedenza, utilizzeremo l'aiuto di timer e interrupt nel microcontrollore PIC16F877A per calcolare il tempo impiegato per una rotazione completa della ruota. Abbiamo già imparato come utilizzare i timer nel nostro tutorial precedente. Ho fornito il codice completo del progetto alla fine di questo articolo. Inoltre ho spiegato di seguito alcune importanti righe.
Le seguenti righe di codice inizializzano la porta D come pin di uscita per l'interfacciamento LCD e RB0 come pin di ingresso per utilizzarla come pin esterno. Inoltre abbiamo abilitato la resistenza pull-up interna usando OPTION_REG e abbiamo anche impostato 64 come prevendita. Quindi abilitiamo gli interrupt globali e periferici per abilitare il timer e gli interrupt esterni. Per definire RB0 come interrupt esterno, il bit INTE dovrebbe essere alto. Il valore Overflow è impostato su 100 in modo che per ogni millisecondo venga attivato il flag di interruzione del timer TMR0IF. Ciò aiuterà a eseguire un timer in millisecondi per determinare il tempo impiegato in millisecondi:
TRISD = 0x00; // PORTD dichiarato come output per interfacciare LCD TRISB0 = 1; // DEfine il pin RB0 come input da utilizzare come pin di interrupt OPTION_REG = 0b00000101; // Timer0 64 come prescalar // Abilita anche PULL UP TMR0 = 100; // Carica il valore del tempo per 1 ms; delayValue può essere compreso tra 0 e 256 solo TMR0IE = 1; // Abilita il bit di interrupt del timer nel registro PIE1 GIE = 1; // Abilita interrupt globale PEIE = 1; // Abilita l'interrupt periferico INTE = 1; // Abilita RB0 come pin di interrupt esterno
La funzione seguente verrà eseguita ogni volta che viene rilevato un interrupt. Possiamo denominare la funzione secondo il nostro desiderio, quindi l'ho chiamata speed_isr (). Questo programma si occupa di due interrupt, uno è Timer Interrupt e l'altro è External Interrupt. Ogni volta che si verifica un interrupt del timer il flag TMR0IF diventa alto, per cancellare e resettare l'interrupt dobbiamo renderlo basso definendo TMR0IF = 0 come mostrato nel codice sottostante.
void interrupt speed_isr () {if (TMR0IF == 1) // Il timer ha superato il limite {TMR0IF = 0; // Cancella flag di interruzione del timer milli_sec ++; } se (INTF == 1) {rpm = (1000 / milli_sec) * 60; velocità = 0,3 * rpm * 0,37699; // (Supponendo che il raggio della ruota sia di 30 cm) INTF = 0; // cancella il flag di interrupt milli_sec = 0; distanza = distanza + 028,2; }}
Allo stesso modo, quando si verifica un interrupt esterno, il flag INTF diventerà alto, anche questo dovrebbe essere cancellato definendo INTF = 0. Il tempo impiegato è tenuto sotto controllo dall'interruzione del timer e l'interruzione esterna determina quando la ruota ha completato una rotazione completa. Con questi dati la velocità e la distanza percorsa dalla ruota vengono calcolate durante ogni Interrupt esterno.
Dopo aver calcolato la velocità e la distanza, è possibile visualizzarle semplicemente sullo schermo LCD utilizzando le nostre funzioni LCD. Se non hai familiarità con gli LCD, fai riferimento al nostro LCD di interfacciamento con il tutorial MCU PIC16F877A.
Spiegazione di lavoro:
Dopo aver preparato l'hardware e il software, carica semplicemente il codice sul tuo PIC16F877A. Se sei completamente nuovo in PIC, dovresti leggere alcuni tutorial su come caricare il programma su un microcontrollore PIC16F877A.
Ho usato un POT variabile per regolare la velocità del motore a scopo dimostrativo. Puoi anche usare lo stesso per trovare un'applicazione in tempo reale. Se tutto funziona come previsto, dovresti essere in grado di ottenere la velocità in Km / ora e la distanza percorsa in termini di metri come mostrato nel video qui sotto.
Spero che il progetto ti sia piaciuto e che funzioni. In caso contrario puoi utilizzare la sezione commenti qui sotto o il forum per pubblicare il tuo dubbio.