Volevo acquisire un segnale in frequenza con Arduino Micro.
Il segnale è un'onda quadra variabile da 2 Hz a 1,5 kHz con duty cicle del 50%.
Per vedere se il poco codice scritto avesse senso ho collegato l'uscita PWM di un Arduino Uno a 500 Hz con duty cicle del 50% all'ingresso dell'Arduino Micro.
Con la funzione Pulse In il valore letto è quasi costante e si aggira intorno ai 499 Hz quindi con una buona accuratezza e precisione:
long int getFrequency(int pin)
{
long freq = 0;
for(unsigned int j=0; j<SAMPLES; j++)
freq+= 500000/pulseIn(pin, HIGH, 500000);
return freq / SAMPLES;
freq=500000/pulseIn(pin, HIGH, 250000);
}
Il fatto che PulseIn sia bloccante non è che mi piaccia molto quindi volevo usare gli interrupt:
attachInterrupt(0, getFrequency, RISING);
void getFrequency()
{
oldValue=actualValue;
actualValue=micros();
frequenza=1000000/((actualValue-oldValue));
}
Qui i valori letti oscillano molto di più, la media è intorno ai 470 Hz ma un valore ogni 5 è intorno agli 800 Hz.
Cosa sbaglio?
Grazie a tutti