Salve a tutti, ieri al volo ho provato a fare un semplice frequenzimetro con un pic18F4550. Ho usato il timer0 come base dei tempi in modo tale da far scattare un interrupt ogni secondo e poi il timer1 come contatore di fronti di salita con RC0 come ingresso. Dopo ogni secondo Timer1 conterrà proprio il valore di frequenza.
Funziona, ma non è molto preciso, ad esempio calcola 20072Hz invece di 20000, oppure 10036 invece di 10000, quindi sta sbagliando dello 0,36%.
A frequenze molto basse l'errore è grave ad esempio 8Hz invece di 10, ed inoltre la risoluzione fa pena!
Sicuramente si può fare di meglio, in verità volevo usare il modulo Capture ma non ci sono riuscito.
// File template
#include "p18f4550.h"
#include "p18f4550.c"
#include "display.c"
#include "delay.c"
#include <timers.h>
// DEFINIZIONI
/*------------------------------PROTOTIPI-----------------------------*/
/*--------------------------------MAIN--------------------------------*/
void main(void)
{
TRISD=0;
TRISCbits.TRISC0 = 1; //RC0 COME INGRESSO
Init_LCD();
PulisciLCD();
RCONbits.IPEN = 1; //modalità compatibile
INTCONbits.GIE = 1; //enable global interrupts
RCONbits.IPEN = 1; //enable priority interrupts
OpenTimer0( TIMER_INT_ON &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_256);
OpenTimer1( TIMER_INT_OFF &
T1_16BIT_RW &
T1_SOURCE_EXT &
T1_PS_1_2 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_ON);
while(1){
Scrivistringa("Frequenza:");
Cursor2LINE();
Scrivinumero(Frequenza,5);
Scrivistringa(" [Hz]");
HomeLCD();
}
}
#pragma udata
volatile unsigned int Frequenza;
//These are your actual interrupt handling routines.
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
if(INTCONbits.TMR0IF==1)
{
Frequenza=(ReadTimer1())<<1; //Leggo TIMER1 dopo aver moltiplicato per 2
WriteTimer1(0); //Resetto TIMER1 e lo faccio ripartire da 0
INTCONbits.TMR0IF=0; //Pulisco il flag di
//interruptdiTIMER0
WriteTimer0(18473); //Ricarico TIMER0 per avere un
//interrupt ogni secondo
}
}
Qualcuno ha usato il modulo Capture per misure di frequenza?
Che risoluzione ha ottenuto?
Che incertezza?
Saluti
Paoletto