Se volete un esempio "porchereccio" di questo tipo di approccio, io sto provando a fare qualcosa di simie...
Ecco il codice iniziale per le prove:
volatile unsigned long stateh = 0; //tick alti
volatile unsigned long statel = 0; //tick bassi
long previousMillis = 0; //variabile per controllo tempo di scan
unsigned long htime=0; //tempo High
unsigned long ltime=0; //tempo Low
unsigned long phtime=0; // tempo precedente High
unsigned long pltime=0; // tempo precedente Low
unsigned long freq=0; // frequenza
long interval = 1000; //intervallo invio letture
float offset=3.00; //offset empirico
void setup()
{
Serial.begin(9600); //inizializzo la seriale
attachInterrupt(0, hitime, HIGH); //iniziamo da un livello alto
}
void loop()
{
unsigned long currentMillis = millis(); //prendo il tempo
if(currentMillis - previousMillis > interval) { //se è trascorso l'intervallo impostato
previousMillis = currentMillis; //reetto il tempo
//stampo i valori calcolati
Serial.print("Hi= ");
Serial.println(stateh);
Serial.print("lo= ");
Serial.println(statel);
Serial.print("frequenza(Hz)= ");
freq=((stateh + statel)/2)-offset; //presunto dutycycle a 50%
Serial.println(freq,9);
Serial.print("periodo(ms)= ");
Serial.println(((1.00/freq)*1000000.00),4);
Serial.print("Htime(uS)= ");
Serial.println(htime);
Serial.print("Ltime(uS)= ");
Serial.println(ltime);
// azzeriamo tutto... si riparte
stateh=0;
statel=0;
freq=0;
phtime=0;
htime=0;
pltime=0;
ltime=0;
}
}
void hitime() //interrupt per livello alto
{
ltime=pltime-micros();
stateh = stateh + 1; //incremento numero tick alti
detachInterrupt(0);
attachInterrupt(0, lotime, LOW); //aspettiamo l'evento low
phtime=micros();
}
void lotime() //interrupt per livello basso
{
htime=phtime-micros();
statel =statel + 1; //incremento numero tick bassi
detachInterrupt(0);
attachInterrupt(0, hitime, HIGH); //aspettiamo l'evento high
pltime=micros();
}
non badate allo stile ma segnalatemi eventuali errorazzi
lo sto provando con un generatore di onda quadra (autocostruito) che mi spara fuori 57Hz collegato sul pin 2 e che il programmillo legge correttamente, ripeto è un inizio... anche se i DSO mi dice che funziona.