I conti non mi tornano .... e non sò il perchè ..... help me ....
Chiarito il fatto che sbagliavo il metodo di come leggere la potenza (la teoria dice cosi' e non lo metto in dubbio ) ho voluto mettere in comparazione il vecchio metodo con il nuovo.
Ho interfacciato arduino con i sensori di corrente e per rilevare la tensione ho aggiunto alla tensione alternata (debitamente ridotta) un offset di 2,5V cosi che il microcontrollore potesse leggere tutta la forma d'onda ....
Schema:

Nel firmware ho implementato l'ADC ad alta velocità impostando il prescaler a 16 garantendomi circa 130 campionature per ognuno dei tre input in un periodo letto (20ms) non riscontrando anomalia nelle letture .... (oltre... i valori sballano .... il prescaler a 16 è il limite minimo

,vabbè una campionatura ogni 50microSec è più che accettabile

)
In aggiunta il firmware tara automaticamente gli offset .......
CODICE ARDUINO<div class=spoiler align=center><div class=code_top align=left>
SPOILER (<a href=javascript:spoiler()>clicca per visualizzare)</div><div class=code align=left>const int ProdottaPin = A1;
const int AssorbitaPin = A2;
const int TensionePin = A3;
const int TempoCampionatura = 20; //Scegli i ms da Campionare
const float Fattore_Conversione_Potenza = .055; //Fattore di conversione Potenze
const float Fattore_Conversione_Corrente = .055;
const float Fattore_Conversione_Tensione = 1.6;
long start ;
int i ;
long PotenzaPro;
long PotenzaAss;
float AmperPro;
float AmperAss;
long OffsetPro;
long OffsetAss;
long OffsetTens;
int Tensionemin=1023;
int Tensionemax=0;
void setup() {
//CALCOLO AUTOMATICO OFFSET SENSORI
for (i = 0 ; i <= 1000 ; i++){
OffsetPro+=analogRead(ProdottaPin);
OffsetAss+=analogRead(AssorbitaPin);
int Tensioneinst =analogRead(TensionePin);
if (Tensionemax<tensioneinst)Tensionemax=Tensioneinst;
if (Tensionemin>Tensioneinst)Tensionemin=Tensioneinst;
}
OffsetPro/=1000;
OffsetAss/=1000;
OffsetTens=(Tensionemax+Tensionemin)/2;
//--------------------------------
ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni

Serial.begin(9600) ;
}
void loop() {
PotenzaPro=0;
PotenzaAss=0;
AmperPro=0;
AmperAss=0;
int NumCampionamenti=0;
int Tensionepicco=0;
start = millis() ;
do
{
NumCampionamenti++;
int Tensioneinst = abs (analogRead(TensionePin)-OffsetTens);
int Prodottainst = abs(analogRead(ProdottaPin)-OffsetPro);
int Assorbitainst = abs(analogRead(AssorbitaPin)-OffsetAss);
PotenzaPro += Tensioneinst*Prodottainst;
PotenzaAss += Tensioneinst*Assorbitainst;
AmperPro+=Prodottainst;
AmperAss+=Assorbitainst;
if (Tensionepicco<tensioneinst)Tensionepicco=Tensioneinst;
}while((millis()-start)<tempocampionatura);
int Tempomisura=millis() - start;
PotenzaPro=(PotenzaPro/NumCampionamenti)*Fattore_Conversione_Potenza;
PotenzaAss=(PotenzaAss/NumCampionamenti)*Fattore_Conversione_Potenza;
AmperPro=(AmperPro/NumCampionamenti)*Fattore_Conversione_Corrente;
AmperAss=(AmperAss/NumCampionamenti)*Fattore_Conversione_Corrente;
int TensioneRMS=Tensionepicco*Fattore_Conversione_Tensione;
int PotenzaProCalc=TensioneRMS*AmperPro;
int PotenzaAssCalc=TensioneRMS*AmperAss;
if (Tensionemax>23 && Tensionemin<1000)
Serial.println ("Misurazioni Attendibili");
else
Serial.println ("ERROR");
Serial.print ("Numero Campionamenti = ");
Serial.println(NumCampionamenti);
Serial.print ("Tempo conversione = ");
Serial.print(Tempomisura) ;
Serial.println(" ms") ;
Serial.print ("ADCSRA = ");
Serial.println(ADCSRA) ;
Serial.print ("Tensione RMS = ");
Serial.print(TensioneRMS) ;
Serial.println(" Volt") ;
Serial.print ("Valore Sensore Tensione Max = ");
Serial.println(Tensionemax) ;
Serial.print ("Valore Sensore Tensione Min = ");
Serial.println(Tensionemin) ;
Serial.print ("Offset Sensore Tensione = ");
Serial.println(OffsetTens) ;
Serial.print ("Offset Sensore Produzione = ");
Serial.println(OffsetPro) ;
Serial.print ("Offset Sensore Assorbimento = ");
Serial.println(OffsetAss) ;
Serial.print ("Potenza Prodotta = ");
Serial.print(PotenzaPro) ;
Serial.println(" Watt") ;
Serial.print ("Potenza Prodotta Calcolata= ");
Serial.print(PotenzaProCalc) ;
Serial.println(" Watt") ;
Serial.print ("Potenza Assorbita = ");
Serial.print(PotenzaAss) ;
Serial.println(" Watt") ;
Serial.print ("Potenza Assorbita Calcolata = ");
Serial.print(PotenzaAssCalc) ;
Serial.println(" Watt") ;
Serial.print ("Corrente Prodotta = ");
Serial.print(AmperPro) ;
Serial.println(" Amper") ;
Serial.print ("Corrente Assorbita = ");
Serial.print(AmperAss) ;
Serial.println(" Amper") ;
Serial.println("") ;
Serial.println("") ;
delay(1000);
} [/quote]
e cosa è successo ......
Di seguito le misurazioni :
-
Potenza Assorbita è calcolata sommando i prodotti in ogni singola campionatura per la durata di un periodo (nuovo metodo)
**************************************************
start = millis() ;
do
{
NumCampionamenti++;
int Tensioneinst = abs (analogRead(TensionePin)-OffsetTens);
int Prodottainst = abs(analogRead(ProdottaPin)-OffsetPro);
int Assorbitainst = abs(analogRead(AssorbitaPin)-OffsetAss);
PotenzaPro += Tensioneinst*Prodottainst;
PotenzaAss += Tensioneinst*Assorbitainst;
}while((millis()-start)<tempocampionatura);
PotenzaPro=(PotenzaPro/NumCampionamenti)*Fattore_Conversione_Potenza;
PotenzaAss=(PotenzaAss/NumCampionamenti)*Fattore_Conversione_Potenza;
**************************************************
-
Potenza Assorbita Calcolata è il prodotto della tensione Rms per la corrente media del Periodo (vecchio metodo)
Misurazione lampada ad incandescenza (come previsto valori uguali in entrambi i metodi)

Misurazione Lampada Neon elettronica

Sbaglio o mi sarei dovuto aspettare valori diversi tra i due metodi ?
<div align=center><div class=fancyborder style=margin:4px;padding:4px;width:50%><img align=left style=margin:10px 8px 10px 2px src=http://img.forumfree.net/html/mime_types/text.gif alt=><a href=http://energiaalternativa.forumcommunity.net/?act=Attach&type=post&id=382232409 rel=nofollow target=_blank>Scarica allegato
Powermeter_Enhanced.ino ( Numero download: 12 ) [/quote]