In Fig.6 viene mostrato il circuito di taratura della corrente ideale.
![]() |
Fig.6 |
Di seguito, un possibile codice di misura della corrente al variare dell'alimentazione sul carico.
constexpr uint8_t Sync = 2; |
int sensorValue; |
int cyccnt = 0; |
byte stcur = 1; // stato corrente di fase |
int Volt_pin = A0; |
int MaxVolt = 0; |
long MedVolt = 0; |
double Volt; |
int Amp2_pin=A2; // corrente assorbita |
int MinAmp2 = 1023; |
int MaxAmp2 = 0; |
long MedAmp2 = 0; |
double Amp2 = 0; |
void setup() |
{ |
Serial.begin(9600); |
pinMode(Sync, INPUT); |
while(digitalRead(Sync) == LOW){} // Attende di sincronizzarsi alla fase positiva |
} |
void loop() |
{ |
if(stcur == 0){ |
if (digitalRead(Sync) == HIGH){ // Registra la transizione a fase positiva |
stcur = 1; // fase positiva diventa la fase corrente |
cyccnt = cyccnt + 1; // conta il numero di cicli |
MedVolt = MedVolt + MaxVolt; |
MedAmp2 = MedAmp2 + MaxAmp2 - MinAmp2; |
MaxVolt = 0; |
MinAmp2 = 1023; |
MaxAmp2 = 0; |
if(cyccnt == 50){ // Ha effettuato medie per un secondo |
Volt = 0.004711*double(MedVolt) + 35; // taratura corrente |
Amp2 = 0.0010255*double(MedAmp2) - 0.045; // taratura corrente |
Serial.print("V: "); |
Serial.println(int(Volt + 0.5)); |
Serial.print("A: "); |
Serial.print(MedAmp2); |
Serial.print(" -> "); |
Serial.println(Amp2); |
MedVolt = 0; |
MedAmp2 = 0; |
cyccnt = 0; |
while(digitalRead(Sync) == LOW){ // Risincronizzazione |
} |
stcur = 1; |
} |
} |
} |
else { |
if (digitalRead(Sync) == 0){ |
stcur = 0; |
} |
} |
sensorValue = analogRead(Volt_pin); |
if(sensorValue>MaxVolt) MaxVolt=sensorValue; |
sensorValue = analogRead(Amp2_pin); |
if(sensorValue |
if(sensorValue>MaxAmp2) MaxAmp2=sensorValue; |
} |
Il microcontrollore trasforma il valore di tensione all'ingresso A2 in un numero compreso fra 0 e 1023 (codifica a 10 bits); al numero 0 corrisponde 0 Volt, a 1023 corrisponde VCC.
La taratura consiste nel correlare il valore da 0 a 1023 letto dal microcontrollore al valore della corrente che scorre nell'anello del sensore SCT-013-030.
Con il Variatore di Tensione si impongono valori di tensione in modo da far scorrere correnti diverse nel carico resistivo (misurate con l'Amperometro digitale) e si legge il numero corrispondente dato dal microcontrollore.
Se non si dispone di un Variatore di Tensione, sfruttando la linearità del sistema di misura, può essere sufficiente misurare la corrente a 0 e alla tensione di rete di quel momento.
Una stima della corrente al secondo è senz'altro una precisione temporale più che accettabile: questo significa che occorre produrre un valore di corrente ogni 50 cicli della tensione d'ingresso. Il software di misura calcola su un ciclo (identificato dal segnale di sincronismo Sync) i numeri massimi e minimi letti (si calcola che il microcontrollore effettui qualche decina di misure nei 20 millisecondi di un ciclo) e ne esegue la media della loro differenza, sui 50 cicli che compongono un secondo.
Dopo di che, manda sulla seriale il valore medio calcolato e la stima della corrente che ne segue con dei coefficienti di tentativo. Con successive iterazioni si possono calcolare i coefficienti in maniera soddisfacente.
![]() |
Fig.7 |
Per convenzione si stabilisce che la corrente è positiva se è in fase con la tensione (come nel caso di A1 in Fig.7), è negativa
se in antifase con la tensione (come nel caso di A2 in Fig.7).
Da notare che il verso della corrente si può cambiare anche agganciando l'anello del sensore SCT-013-030 dopo averlo girato di 180 gradi o semplicemente invertendo la spina del Power Controller nella presa di alimentazione.
Se il verso della corrente è rilevante, quindi, va fissata, una volta per tutte, la modalità di aggancio del sensore e il verso di inserzione della spina nella presa.
Di seguito, un possibile codice di misura della corrente con riconoscimento del verso.
constexpr uint8_t Sync = 2; |
int sensorValue; |
int cyccnt = 0; |
byte stcur = 1; // stato corrente di fase |
int Volt_pin = A0; |
int MaxVolt = 0; |
long MedVolt = 0; |
double Volt; |
int Amp2_pin=A2; // corrente assorbita |
int MinAmp2 = 1023; |
int MaxAmp2 = 0; |
long MedAmp2 = 0; |
double Amp2 = 0; |
byte MaxVerso2; |
byte AMax2 = 0; |
void setup() |
{ |
Serial.begin(9600); |
pinMode(Sync, INPUT); |
while(digitalRead(Sync) == LOW){} // Attende di sincronizzarsi alla fase positiva |
} |
void loop() |
{ |
if(stcur == 0){ |
if (digitalRead(Sync) == HIGH){ // Registra la transizione a fase positiva |
stcur = 1; // fase positiva diventa la fase corrente |
cyccnt = cyccnt + 1; // conta il numero di cicli |
MedVolt = MedVolt + MaxVolt; |
MedAmp2 = MedAmp2 + MaxAmp2 - MinAmp2; |
AMax2 = AMax2 + MaxVerso2; |
MaxVolt = 0; |
MinAmp2 = 1023; |
MaxAmp2 = 0; |
if(cyccnt == 50){ // Ha effettuato medie per un secondo |
Volt = 0.004711*double(MedVolt) + 35; // taratura corrente |
Amp2 = 0.0010255*double(MedAmp2) - 0.045; // taratura corrente |
Serial.print("V: "); |
Serial.println(int(Volt + 0.5)); |
Serial.print("A: "); |
Serial.print(MedAmp2); |
Serial.print(" -> "); |
if(AMax2 < 25) display.print(" -"); |
else display.print(" +"); |
Serial.println(Amp2); |
MedVolt = 0; |
MedAmp2 = 0; |
AMax2 = 0; |
cyccnt = 0; |
while(digitalRead(Sync) == LOW){ // Risincronizzazione |
} |
stcur = 1; |
} |
} |
} |
else { |
if (digitalRead(Sync) == 0){ |
stcur = 0; |
} |
} |
sensorValue = analogRead(Volt_pin); |
if(sensorValue>MaxVolt) MaxVolt=sensorValue; |
sensorValue = analogRead(Amp2_pin); |
if(sensorValue |
if(sensorValue>MaxAmp2) { |
MaxAmp2=sensorValue; |
MaxVerso2 = stcur; |
} |
} |