- Messaggi: 128
- Ringraziamenti ricevuti 6
Precisione timer su PIC.
9 Anni 5 Mesi fa - 9 Anni 5 Mesi fa #1
da Nutshell
Precisione timer su PIC. è stato creato da Nutshell
Salve a tutti, sto cercando di realizzare una specie di metronomo, e sto usando un PIC12F1840. Il problema che incontro è legato alla precisione. Ho fatto diversi tentativi, sia con oscillatore interno a 8MHZ, sia con PLL attivato lavorando a 32MHZ, sia con quarzo esterno da 20MHZ. Sto facendo il confronto con un metronomo digitale che ho, per verificare la precisione e mi accorgo che il mio sistema è in ritardo di alcuni millisecondi. Certo... potrebbe essere in anticipo il metronomo digitale direte! E invece no. Ho collegato all'oscilloscopio il pic e ho scritto le seguenti righe di codice nella routine di interrupt del Timer0, dove OSCOUT l'ho definito come un pin libero impostato come output collegato all'oscilloscopio.
*************************
If (OSCOUT)
OSCOUT=0;
else
OSCOUT=1;
**************************
Quello che vedo sull'oscilloscopio è un periodo più lungo di quello calcolato.
Per rendere la lettura più veritiera, ho eliminato tutto il codice rimanente nella routine di interrupt, perchè effettivamente quel codice genera un ritardo, tuttavia togliendo tutto quanto il periodo resta comunque più lungo dei 50uS che avevo calcolato. Secondo l'oscilloscopio siamo intorno a 53uS
Per capirci... Frequenza di oscillazione 20MHZ, prescaler 1:2, preload di TMR0 a 131, per ottenere una frequenza di 20Khz.
A questo punto ho pensato: Aumentiamo il preload finchè non raggiungo la giusta frequenza, e infatti portandolo a 138 finalmente ho ottenuto un periodo di 50uS perfetti. Ovviamente nel momento in cui inserirò altro codice all'interno della routine di interrupt dovrò nuovamente fare degli aggiustamenti per compensare, tuttavia, per applicazioni di precisione, come si fa? E in ogni caso perchè in assenza di codice ottenevo quel ritardo? Saranno forse sufficienti quelle 3 righe che ho scritto sopra per generare 3uS di ritardo? Ovviamente mi rendo conto che aumentando la velocità di calcolo, eventuali righe di codice in più saranno sempre meno influenti, ma sto già lavorando a velocità abbastanza elevate probabilmente.
Ovviamente ho verificato con l'oscilloscopio la frequenza di oscillazione ed è sempre perfetta, quindi l'errore non è lì.
Attendo Vostri pareri e commenti grazie!
*************************
If (OSCOUT)
OSCOUT=0;
else
OSCOUT=1;
**************************
Quello che vedo sull'oscilloscopio è un periodo più lungo di quello calcolato.
Per rendere la lettura più veritiera, ho eliminato tutto il codice rimanente nella routine di interrupt, perchè effettivamente quel codice genera un ritardo, tuttavia togliendo tutto quanto il periodo resta comunque più lungo dei 50uS che avevo calcolato. Secondo l'oscilloscopio siamo intorno a 53uS
Per capirci... Frequenza di oscillazione 20MHZ, prescaler 1:2, preload di TMR0 a 131, per ottenere una frequenza di 20Khz.
A questo punto ho pensato: Aumentiamo il preload finchè non raggiungo la giusta frequenza, e infatti portandolo a 138 finalmente ho ottenuto un periodo di 50uS perfetti. Ovviamente nel momento in cui inserirò altro codice all'interno della routine di interrupt dovrò nuovamente fare degli aggiustamenti per compensare, tuttavia, per applicazioni di precisione, come si fa? E in ogni caso perchè in assenza di codice ottenevo quel ritardo? Saranno forse sufficienti quelle 3 righe che ho scritto sopra per generare 3uS di ritardo? Ovviamente mi rendo conto che aumentando la velocità di calcolo, eventuali righe di codice in più saranno sempre meno influenti, ma sto già lavorando a velocità abbastanza elevate probabilmente.
Ovviamente ho verificato con l'oscilloscopio la frequenza di oscillazione ed è sempre perfetta, quindi l'errore non è lì.
Attendo Vostri pareri e commenti grazie!
Ultima Modifica 9 Anni 5 Mesi fa da Nutshell.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
9 Anni 5 Mesi fa #2
da alfa75
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da alfa75 al topic Precisione timer su PIC.
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 5 Mesi fa #3
da Nutshell
Risposta da Nutshell al topic Precisione timer su PIC.
Ti ringrazio, avevo provato anche questa sintassi ma era addirittura più lenta.
Voglio provare ad alzare un semplice flag nella routine di interrupt per scandire un timing costante e indipendente dalle operazioni che svolgo al suo interno, e operare in polling ogni volta che viene sollevato il flag.
Voglio provare ad alzare un semplice flag nella routine di interrupt per scandire un timing costante e indipendente dalle operazioni che svolgo al suo interno, e operare in polling ogni volta che viene sollevato il flag.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
9 Anni 5 Mesi fa #4
da Nutshell
Risposta da Nutshell al topic Precisione timer su PIC.
Ho risolto. Ho usato un oscillatore esterno invece del Timer interno del pic. Più precisamente l'oscillatore l'ho usato per chiamare eccitare l' INT PIN e chiamare quindi la routine di interrupt con la quale faccio tutto quello che voglio senza curarmi dei tempi, perchè tanto l'oscillatore richiamerà nuovamente l'interrupt sempre con lo stesso ritardo senza essere influenzato dal codice. Provato, funziona. Tra l'altro questo sistema mi ha fatto venire un' idea ancora più bella per la mia applicazione... ma questa la tengo per me ah ah!!
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
9 Anni 5 Mesi fa #5
da embedded
Risposta da embedded al topic Precisione timer su PIC.
ciao Nutshell
non avevi già usato un oscillatore esterno a 20 Mhz senza risultato.
puoi postare la configurazione del pic ed un frammento di codice del main
e dell'ISR?.
Che compilatore usi.
Grazie
non avevi già usato un oscillatore esterno a 20 Mhz senza risultato.
puoi postare la configurazione del pic ed un frammento di codice del main
e dell'ISR?.
Che compilatore usi.
Grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- embedded
- New Member
Riduci
Di più
- Messaggi: 2
- Ringraziamenti ricevuti 0
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024