ho cambiato totalmente approccio al problema e ho riscritto tutto per funzionre con pcint e misurare il dutycycle
#include <PinChangeInt.h>
volatile unsigned long previousMillis = 0; //variabile per controllo tempo di scan
long interval = 1000; //intervallo invio letture
boolean Flag;
volatile unsigned long startTimeH;
volatile unsigned long stopTimeH;
volatile unsigned long tdurataHIGH;
volatile unsigned long startTimeL;
volatile unsigned long stopTimeL;
volatile unsigned long tdurataLOW;
volatile unsigned long periodo;
float frequenza;
float dutycycle;
void setup()
{
PCintPort::attachInterrupt(A2, &quicfunc, CHANGE);
Serial.begin(9600);
}
void loop()
{
unsigned long currentMillis = millis(); //prendo il tempo
if(currentMillis - previousMillis > interval) { //se è trascorso l'intervallo impostato
previousMillis = currentMillis; //resetto il tempo
Serial.println();
Serial.print("Durata High (uS)=");
if (stopTimeH > startTimeH){
tdurataHIGH= stopTimeH - startTimeH;
}
else{
tdurataHIGH= startTimeH - stopTimeH;
}
Serial.println(tdurataHIGH);
Serial.print("Durata Low (uS)=");
if (stopTimeL > startTimeL){
tdurataLOW= stopTimeL - startTimeL;
}
else{
tdurataLOW= startTimeL - stopTimeL;
}
Serial.println(tdurataLOW);
Serial.print("Periodo1 (uS)= ");
periodo= tdurataLOW + tdurataHIGH;
Serial.println(periodo);
Serial.print("Frequenza (Hz)= ");
frequenza = (1.0/(periodo));
Serial.println((frequenza*1000000),4);
Serial.print("Duty Cycle (%)= ");
dutycycle =( float(tdurataHIGH) / float( periodo ))*100.0;
Serial.println(dutycycle,4);
Serial.println();
}
}
void quicfunc() {
Leggi_Rapido_A2();
if (Flag==1){
startTimeH=micros()-4; //tolgo i 4 micros che si mangia la funzione
stopTimeL=micros()-4;
;
}
else{
stopTimeH=micros()-4;
startTimeL=micros()-4;
;
}
}
void Leggi_Rapido_A2() //lettura ultrarapida dello stato del pin A2
{
char pincState = 0;
pincState = PINC2;
if ( ((PINC>>PINC2) & 1) ) { Flag = true; } else { Flag = false; }
}
Provatelo se potete