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