Ciao a tutti.
Vorrei una delucidazione se riuscite a darmela.
Ho realizzato finalmente il contagiri con un PIC (avevo aperto un post tempo fa sull'argomento) per conoscere il numero di giri di un motore a scoppio monocilindrico di un piccolo mezzo agricolo. Volendo un metodo poco invasivo per poterli visualizzare, ho preso spunto da un contagiri ad induzione che il mio babbo utilizza in campagna su un trattore.
Così ho pensato di sfruttare un PIC per leggere gli impulsi (con una oppurtuna elettronica di acqusizione del segnale) provenienti da un filo avvolto a spirale sul cavo candela.
Ho utilizzato un quarzo da 40kHz ed un prescaler di 128 per avere con buona precisione dal TMR0 una base dei tempi di circa 1s e tramite interrupt ho contanto gli impulsi ricevuti in un secondo e moltiplicato per 60 per avere i giri/min.
Tutto funziona bene se non per l'errore di 60 giri/min (soprattutto a basse velocità) che ottengo durante la visualizzazione dei giri su LCD.
Infatti l'errore è formato da passi di 60 g/min, infatti 60 impulsi al secondo = 3600 al minuto mentre 59 implusi al secondo = 3540 il peso di un'impluso in piu o in meno è sempre di 60 g/min.
Avevo pensato anche di aumentare la base dei tempi, diminuendo così la costante moltiplicativa. Solo che in tal modo ho un ritardo nella visualizzazione dei giri.
E' possibile secondo voi una visualizzazione sempre circa ogni secondo ma con una maggiore precisione, ovvero con un errore piccolo inferiore ai 10 giri/min?
Maggiore precisione con contagiri PIC
Moderatore:
Paolino
44 messaggi
• Pagina 1 di 5 • 1, 2, 3, 4, 5
0
voti
Un paio d'anni fa ebbi lo stresso problema durante la realizzazione di un frequenzimetro (la stessa cosa di un contagiri :) ) ed infatti dovevo scegliere se avere un'adeguata precisione alle basse frequenze oppure avere un maggior fondoscala.
Alla fine ho implementato una sorta di "autorange", sotto una certa soglia il PIC cambia configurazione per poter avere maggior precisione. Potresti provare a fare una cosa del genere.
Per quanto riguarda il refresh dell'LCD dovresti postare il codice per far capire a me ed agli altri come ti sei organizzato.
A che frequenza esegui il campionamento del segnale?
A che frequenza esegui il refresh dell'LCD?
Ciao!
Alla fine ho implementato una sorta di "autorange", sotto una certa soglia il PIC cambia configurazione per poter avere maggior precisione. Potresti provare a fare una cosa del genere.
Per quanto riguarda il refresh dell'LCD dovresti postare il codice per far capire a me ed agli altri come ti sei organizzato.
A che frequenza esegui il campionamento del segnale?
A che frequenza esegui il refresh dell'LCD?
Ciao!

-

AjKDAP
1.255 2 6 9 - Expert EY

- Messaggi: 796
- Iscritto il: 17 mag 2006, 0:13
- Località: nella coda dei pronti
0
voti
Intanto grazie per la risposta.
Allorail funzionamento è abbastanza semplice.
- Imposto una base dei tempi di circa 1secondo conTMR0;
- Setto l'interrupt su RB0 e TMR0;
- Inizializzo TMR0 e azzero la variabile conta_impulsi associata agli interrupt su RB0;
- Accendo il motore e inizio a contare gli impulsi (ogni volta che arriva un impulso disabilito gli interrupte incremento la variabile conta_impulsi e poi riabilito gli interrupt);
- Appena TMR0 va a zero (dopo circa 1s) , prendo il numero di impulsi in un secondo che sono stati rilevati dalla variabile conta_impulsi e li moltiplico per 60 e il risultato lo metto nella variabile risultato=conta_impulsi*60;
- Azzero la variabile conta_impulsi;
- Re-inizializzo TMR0;
- Aggiorno il risultato dell'operazione su LCD.
e il ciclo ricomincia.
Il risultato è buono ma basta una perdita di un impulso per avere un errore di 60 giri/min ad ogni visualizzazione, che su 2000 giri può anche essere meno visibile, ma quando la macchina gira sui 900 giri fa abbastanza ribrezzo.
Allorail funzionamento è abbastanza semplice.
- Imposto una base dei tempi di circa 1secondo conTMR0;
- Setto l'interrupt su RB0 e TMR0;
- Inizializzo TMR0 e azzero la variabile conta_impulsi associata agli interrupt su RB0;
- Accendo il motore e inizio a contare gli impulsi (ogni volta che arriva un impulso disabilito gli interrupte incremento la variabile conta_impulsi e poi riabilito gli interrupt);
- Appena TMR0 va a zero (dopo circa 1s) , prendo il numero di impulsi in un secondo che sono stati rilevati dalla variabile conta_impulsi e li moltiplico per 60 e il risultato lo metto nella variabile risultato=conta_impulsi*60;
- Azzero la variabile conta_impulsi;
- Re-inizializzo TMR0;
- Aggiorno il risultato dell'operazione su LCD.
e il ciclo ricomincia.
Il risultato è buono ma basta una perdita di un impulso per avere un errore di 60 giri/min ad ogni visualizzazione, che su 2000 giri può anche essere meno visibile, ma quando la macchina gira sui 900 giri fa abbastanza ribrezzo.
0
voti
Io usavo il pin T1CLK per incrementare automaticamente il timer1 a 16bit ogni volta che arrivava un impulso esterno. (niente interrupt, solamente incremento del timer1)
Con il timer0 invece creavo una base tempi mediante interrupt per overflow ogni secondo ad esempio.
Ogni volta che volevo campionare la frequenza non dovevo far altro che:
-azzerare il timer1 (conta impulsi)
-azzerare il timer0 (azzerare o impostare il relativo preset)
-aspettare l'interrupt di overflow del timer0
-leggere il timer1 per sapere quanti impulsi ho ricevuto nell'arco di 1sec ad esempio.
Cambiando il preset del timer0 si può facilmente mandarlo in overflow con tempi diversi e quindi cambiare facilmente la base tempi.
Cambiando poi il calcolo della frequenza con la nuova base tempi puoi facilmente calcolarti il nuovo risultato.
Con il timer0 invece creavo una base tempi mediante interrupt per overflow ogni secondo ad esempio.
Ogni volta che volevo campionare la frequenza non dovevo far altro che:
-azzerare il timer1 (conta impulsi)
-azzerare il timer0 (azzerare o impostare il relativo preset)
-aspettare l'interrupt di overflow del timer0
-leggere il timer1 per sapere quanti impulsi ho ricevuto nell'arco di 1sec ad esempio.
Cambiando il preset del timer0 si può facilmente mandarlo in overflow con tempi diversi e quindi cambiare facilmente la base tempi.
Cambiando poi il calcolo della frequenza con la nuova base tempi puoi facilmente calcolarti il nuovo risultato.
-

AjKDAP
1.255 2 6 9 - Expert EY

- Messaggi: 796
- Iscritto il: 17 mag 2006, 0:13
- Località: nella coda dei pronti
0
voti
Si, è quello che in soldoni faccio pure io utilizzando però solo TMR0 come base dei tempi.
Ad ogni interrupt su RB0 conto gli impulsi. Quando TMR0 va in overflow significa che è trascorso 1s.
Quindi prendo il numero di impulsi contati in quel secondo e gli moltiplico per 60. Poi inizializzo ancora tutto e ricomincia il ciclo.
Solo che in tal modo ho sempre un errore di 60. Se aumento la base dei tempi per esempio 2 secondi, riduco la costante moltiplicativa, però di contro aggiorno la misura dei giri/min ogni 2 secondi .
Ad ogni interrupt su RB0 conto gli impulsi. Quando TMR0 va in overflow significa che è trascorso 1s.
Quindi prendo il numero di impulsi contati in quel secondo e gli moltiplico per 60. Poi inizializzo ancora tutto e ricomincia il ciclo.
Solo che in tal modo ho sempre un errore di 60. Se aumento la base dei tempi per esempio 2 secondi, riduco la costante moltiplicativa, però di contro aggiorno la misura dei giri/min ogni 2 secondi .
1
voti
AjKDAP ha scritto:Un paio d'anni fa ebbi lo stresso problema durante la realizzazione di un frequenzimetro (la stessa cosa di un contagiri :) ) ed infatti dovevo scegliere se avere un'adeguata precisione alle basse frequenze oppure avere un maggior fondoscala.
Il modo "giusto" per ovviare a questi problemi è quello di realizzare un frequenzimetro reciproco, che è il modo in cui vengono realizzati tutti i frequenzimetri moderni. Bisogna però gestire due conteggi contemporaneamente.
Per
Edge ha scritto:E' possibile secondo voi una visualizzazione sempre circa ogni secondo ma con una maggiore precisione, ovvero con un errore piccolo inferiore ai 10 giri/min?
Volendo evitare di fare un frequenzimetro reciproco, te la puoi cavare in due modi: i) facendo una misura di periodo, invece che di frequenza (quant'è il massimo numero di giri che devi misurare?); ii) moltiplicando la frequenza da misurare: se hai una ruota dentata potresti utilizzarla come ruota fonica.
It's a sin to write
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
0
voti
DirtyDeeds ha scritto:Il modo "giusto" per ovviare a questi problemi è quello di realizzare un frequenzimetro reciproco, che è il modo in cui vengono realizzati tutti i frequenzimetri moderni.
Mi potresti spiegare a grandi linee come funziona un "frequenzimetro reciproco" ?
(scusa Edge se vado un attimo OT
-

AjKDAP
1.255 2 6 9 - Expert EY

- Messaggi: 796
- Iscritto il: 17 mag 2006, 0:13
- Località: nella coda dei pronti
0
voti
Siccome la storia è un po' lunghetta e non mi piacciono i link che si trovano in giro, cercherò di scrivere qualcosa nei prossimi giorni.
It's a sin to write
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
0
voti
scusa Edge se vado un attimo OT
Macché scuse, l'argomento è interessante e se non si reca troppo disturbo sarebbe molto interessante capire di cosa si tratta.
Volendo evitare di fare un frequenzimetro reciproco, te la puoi cavare in due modi: i) facendo una misura di periodo, invece che di frequenza
Allora, per quanto riguarda la massima frequenza da misurare questa risulta bassa, perché volendo fare un contagiri il cui numero di giri massimo ipotizzati è di 9000 giri/min (in realtà per il motore con cui ho a che fare non supererò mai i 4000 giri/min) la frequenza massima è minore di 200Hz, --> 9000 g/min /60 = 150 giri/sec ovvero 150 Hz.
Quindi tu dici di prendere come riferimento il periodo tra 2 impulsi successivi?
44 messaggi
• Pagina 1 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 5 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
