CITAZIONE (iannez, 19/05/2015 13:59:33 )  
Quote:Elettro è possibile via codice automatizzare la lettura 
e quindi il calcolo dell offset dei sensori?
hai un schema semplice di come utilizzare un partitore e/o
un operazionale per creare l'offset che mi pare sia necessario
ad arduino per gestire l intera onda sinusoidale?
tnx 
 
 Certo che è fattibile,ma non ho niente di pronto(ho perso i codici).
Ti spiego a grandi linee come fare.
LINKIl progetto linkato è l'evoluzione del Powermeter.
Come vedi sia la corrente che la tensione hanno un offset di circa 2.5V.
Dico circa perchè è normale che tale valore sia leggermente maggiore o inferiore.
Ad inizio progetto avevo scelto il calcolo software dell'offset ,ma non avevo ottenuto la qualità che mi ero preposto.
Quindi ho scelto una strada ancora più semplice:
-per ogni segnale uso due ingressi analogici,uno sul partitore che genera l'offset e uno all'uscita sensore.
In pratica (metodo semplificato):
-leggo i valori degli offset (basta una volta ad inizio semionda)
-eseguo un ciclo while per un tempo di 20mS (una semionda)
-eseguo misure ripetitive e tengo in memoria il numero di letture
-terminati i 20mS calcolo tutti i valori 
Per una migliore precisione si potrebbe impostare un timer che si preoccupa di campionare con una sequenza costante gli ingressi ,ma non è necessario. 
Codice NON TESTATO 
//---------------------------------------------------
int TensioneOffsetPin = A0; 
int CorrenteOffsetPin = A1;     
int TensionePin = A2;  
int CorrentePin = A3;
int Fattore_Conversione_Tensione = 1; //da calcolare
int Fattore_Conversione_Corrente = 1; //da calcolare
float Tensionemax ;
float Tensionemin ;
float TensioneRMS ;
float CorrenteRMS ;
float PotenzaAttiva;
float PotenzaApparente;
float FattorediPotenza;
float SommaV;
float SommaI;
float SommaP;
void setup() {
  ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 
}
void loop() {
int NumCampionamenti = 0; 
int OffsetTensione = analogRead(TensioneOffsetPin);
int OffsetCorrente = analogRead(CorrenteOffsetPin);
unsigned long start = micros() ;
while (micros() < (start + 20000)){  
float Tensioneinst = (analogRead(TensionePin)-OffsetTensione)*Fattore_Conversione_Tensione; 
float Correnteinst = (analogRead(CorrentePin)-OffsetCorrente)*Fattore_Conversione_Corrente; 
if ( Tensionemax < Tensioneinst ) Tensionemax=Tensioneinst; 
if ( Tensionemin > Tensioneinst ) Tensionemin=Tensioneinst; 
SommaV += pow(Tensioneinst,2); 
SommaI += pow(Correnteinst,2); 
SommaP += (Tensioneinst*Correnteinst); 
NumCampionamenti++; 
}  
TensioneRMS = sqrt(SommaV / NumCampionamenti); 
CorrenteRMS = sqrt(SommaI / NumCampionamenti); 
if (CorrenteRMS < 0.10) {//soglia minima 
CorrenteRMS=0; 
SommaP=0;} 
PotenzaAttiva = SommaP/ NumCampionamenti; 
PotenzaApparente = TensioneRMS * CorrenteRMS; 
FattorediPotenza = PotenzaAttiva/PotenzaApparente;             
}
//------------------------------------------------------
Ciao
Elettro