Errori di lettura su seriale

Salve, sto sto utilizzando un regolatore di potenza a step utilizzando un modulo allo stato solido della Fotek. Questa regolazione viene attuata tramite l'inserzione di resistenze che fanno variare l'uscita di potenza. A questo semplice progettino che funziona egregiamente ho collegato a monte del regolatore un contatore di energia ad un modulo LEM012SE Link che ha a bordo oltre che un led che segna il consumo in tempo reale anche un'uscita SO che in pratica ripete il segnale per il monitoraggio a distanza. Arriviamo al dunque: su arduino ho caricato questo sketch

long pulseCount = 0;     //Number of pulses, used to measure energy.
unsigned long pulseTime,lastTime;     //Used to measure power.
double power;         //power
int ppwh = 2;          //1000 pulses/kwh = 1 pulse per wh - Number of pulses per wh - found or set on the meter.

void setup()
{
Serial.begin(9600);
attachInterrupt(1, onPulse, FALLING);    // KWH interrupt attached to IRQ 1 = pin3
}


void loop()
{

}

void onPulse()        // The interrupt routine
{
lastTime = pulseTime;      //used to measure time between pulses.
pulseTime = micros();
pulseCount++;      //pulseCounter
power = (3600000000.0 / (pulseTime - lastTime))/ppwh;      //Calculate power
Serial.println(power,2);       //Print the values.
}

che usa un interrupt per calcolare la potenza in base all'uscita SO e la stampa su seriale. Collegata una stufetta con ventilatore e fatto partire il tutto mi si presenta un problema di letture "strane" in maniera abbastanza casuale:

593.41
742.11
731.07
731.07
732.44
732.44

Queste sono le letture corrette che mi appaiono a piena potenza, ciè senza parzializzazione della forma d'onda da parte del regolatore

719.05
525.12
3082191.75
247.70
642.68

in maniera casuale mi appaiono letture fuori misura (terza lettura) Questo accade molto saltuariamente se tutto rimane fermo, ciè non regolo nulla, mentre durante la regolazione questi valori sballati aumentano di numero. Cosa potrebbe essere e come potrei eliminare questo genere di "disturbo" ? Grazie

Provo a dire l’idea che mi sono fatto “al volo” (ossia non ho approfondito il tuo schema, ma ho solo letto la descrizione ed il tuo scketch). Anche se sono un neofita di Arduino (non di software/hardware) il problema mi “intrigava”.

In sostanza “a naso” mi sembra che ci sia qualche problema software, un “impiccio” tra interrupt che lanciano si sovrappongono per cui si sballano le variabili lastTime e pulseTime.
Devi secondo me disabilitare gli interrupt all’interno di onPulse() e forse anche dichiarare “volatile” tutte le variabili usate dall’interrupt:

void onPulse()        // The interrupt routine
{
  noInterrupts();  // Disabilita interrupt per evitare sovrapposizioni
  lastTime = pulseTime;      //used to measure time between pulses.
  pulseTime = micros();
  pulseCount++;      //pulseCounter
  power = (3600000000.0 / (pulseTime - lastTime))/ppwh;      //Calculate power
  Serial.println(power,2);       //Print the values.
  interrupts();  // Riabilita gli interrupt
}

Fammi sapere (così imparo anche io;-)).

ciao.

Di solito si tende a NON mettere all'interno di una ISR tutto quel codice ma si cerca di modificare una variabile che poi viene valutata all'interno del loop.

Il contatore che hai messo (se leggo bene) dà 1000 impulsi per KWh quindi con un assorbimento di 3,5 KW avresti circa 1 impulso al secondo (sempre se ho capito bene); sei sicuro che ti serva usare un interrupt per una frequenza del genere?

ciao pippo72

docdoc: CUT

Fammi sapere (così imparo anche io;-)).

Eccomi qui, ho fatto le modifiche allo sketch che mi avevi consigliato ma il risultato non è cambiato. Dopo svariati tentativi e verifiche penso di aver trovato il problema che di fatto è l'alimentazione : nelle prove avevo collegato l'uscita SO del contatore ad una alimentazione a 5 v separata da quella di Arduino. Di fatto lavoravo con due tensioni a 5v diverse e cioè una su arduino presa dalla USB del PC ed una collegata al contatore, presa da un trafo a 220>5 v. E' bastato prendere l'alimentazione del SO contatore da una uscita a 5 v di Arduino e tutto funziona alla meraviglia senza nessuna lettura sballata. Permane qualche errore quando vado a spegnere/regolare la potenza del carico collegato. Questa reazione penso sia difficilmente filtrabile in quanto appare quando di fatto ci sono spike sull'alimentazione indotti da contatti che si aprono/chiudono. Probabilmente potrei farlo via software verificando ogni nuova lettura che se, rispetto alla prima, supera un certo margine, verrebbe scartata. Esiste forse anche un sistema hardware per farlo ma al momento non mi viene in mente nulla. Idee?