Salve a tutti. La mia conoscenza scolastica dei trasformatori amperometrici si fermò anni fa (ma anche tanti capelli fa) e da li non è più andata avanti.
Ho visto in qualche post, che non riesco più a trovare, che tra noi avevamo un DIO dei TA, nel senso che li costruiva e li usava, quindi mi sarebbe utile.
Comunque ho comprato queste due "cosine" :
ma se con il tester riesco a vedere qualcosa (una volta raddrizzata con un ponte), quando collego ad arduino leggo pochissimo, quasi zero.
La resistenza che ho messo sul TA 2 è di 330 ohm (quella avevo!) e con 60W leggo 0,8V col tester.
Come faccio ad avere più... energia (per dirla come Star Trek) in modo che il TA non mi si sieda se chi "legge" assorbe troppo?
P.S.
Io odio gli "schemi" (pseudo) fatti con Fritzing, non si capisce nulla.
E non sono un purista, ma se uno è un praticone allora va bene, attacco dei fili qua e la, magari copiando e basta, poi però quando devo rifarlo e non ho davanti il campione sono perso.
E' un po come seguire le istruzioni del GPS (vai a destra per 200 metri, poi a sx per 3 km, poi ...) ma non guardare la mappa di dove ti trovi: se un giorno non hai più le istruzioni ti perdi.
steve-cr:
ma se con il tester riesco a vedere qualcosa (una volta raddrizzata con un ponte), quando collego ad arduino leggo pochissimo, quasi zero.
La bassa tensione alternata va raddrizzata con un diodo ideale (un paio di operazionali) amplificata, e livellata, a questo punto abbiamo un valore di tensione costante proporzionale alla corrente, che è l'unica grandezza sensata da leggere con Arduino.
Claudio_FF:
La bassa tensione alternata va raddrizzata con un diodo ideale (un paio di operazionali) amplificata, e livellata, a questo punto abbiamo un valore di tensione costante proporzionale alla corrente, che è l'unica grandezza sensata da leggere con Arduino.
Secondo me serve anche un carico, il TA lavora in corrente, non dobbiamo misurare la tensione, ma la corrente, e per convertirla serve uno shunt, un carico insomma,
per lo OP, se non puoi mettere il tester in Corrente AC, metti una resistenza e leggi in tensione AC
di che valori stiamo parlando?
per dimensionare il derivatore
Guglielmo, tu che tutto vedi e tutto sai, ho provato il circuitino di esempio del link che mi hai postato, con due resistenze da 10k ed un elettrolitico da 100uF (da 10uF non lo avevo...).
Poi ho provato a leggere l'ingresso analogico: con o senza carico il numero vibra così velocemente che non lo vedo (sarà la 50 hz)
Allora ho caricato la libreria EmonLib e l'esempio allegato: funziona perfettamente!
Ma allora come viene letto l'ingresso analogico? dov'è il trucco?
Dai retta, usa la libreria ... se provi a guardarne i sorgenti ti accorgerai che la cosa NON è affatto così banale come sembra ...
Solo un estratto ...
//--------------------------------------------------------------------------------------
// emon_calc procedure
// Calculates realPower,apparentPower,powerFactor,Vrms,Irms,kWh increment
// From a sample window of the mains AC voltage and current.
// The Sample window length is defined by the number of half wavelengths or crossings we choose to measure.
//--------------------------------------------------------------------------------------
void EnergyMonitor::calcVI(unsigned int crossings, unsigned int timeout)
{
#if defined emonTxV3
int SupplyVoltage=3300;
#else
int SupplyVoltage = readVcc();
#endif
unsigned int crossCount = 0; //Used to measure number of times threshold is crossed.
unsigned int numberOfSamples = 0; //This is now incremented
//-------------------------------------------------------------------------------------------------------------------------
// 1) Waits for the waveform to be close to 'zero' (mid-scale adc) part in sin curve.
//-------------------------------------------------------------------------------------------------------------------------
boolean st=false; //an indicator to exit the while loop
unsigned long start = millis(); //millis()-start makes sure it doesnt get stuck in the loop if there is an error.
while(st==false) //the while loop...
{
startV = analogRead(inPinV); //using the voltage waveform
if ((startV < (ADC_COUNTS*0.55)) && (startV > (ADC_COUNTS*0.45))) st=true; //check its within range
if ((millis()-start)>timeout) st = true;
}
//-------------------------------------------------------------------------------------------------------------------------
// 2) Main measurement loop
//-------------------------------------------------------------------------------------------------------------------------
start = millis();
while ((crossCount < crossings) && ((millis()-start)<timeout))
{
numberOfSamples++; //Count number of times looped.
lastFilteredV = filteredV; //Used for delay/phase compensation
//-----------------------------------------------------------------------------
// A) Read in raw voltage and current samples
//-----------------------------------------------------------------------------
sampleV = analogRead(inPinV); //Read in raw voltage signal
sampleI = analogRead(inPinI); //Read in raw current signal
//-----------------------------------------------------------------------------
// B) Apply digital low pass filters to extract the 2.5 V or 1.65 V dc offset,
// then subtract this - signal is now centred on 0 counts.
//-----------------------------------------------------------------------------
offsetV = offsetV + ((sampleV-offsetV)/1024);
filteredV = sampleV - offsetV;
offsetI = offsetI + ((sampleI-offsetI)/1024);
filteredI = sampleI - offsetI;
//-----------------------------------------------------------------------------
// C) Root-mean-square method voltage
//-----------------------------------------------------------------------------
sqV= filteredV * filteredV; //1) square voltage values
sumV += sqV; //2) sum
//-----------------------------------------------------------------------------
// D) Root-mean-square method current
//-----------------------------------------------------------------------------
sqI = filteredI * filteredI; //1) square current values
sumI += sqI; //2) sum
//-----------------------------------------------------------------------------
// E) Phase calibration
//-----------------------------------------------------------------------------
phaseShiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
//-----------------------------------------------------------------------------
// F) Instantaneous power calc
//-----------------------------------------------------------------------------
instP = phaseShiftedV * filteredI; //Instantaneous Power
sumP +=instP; //Sum
//-----------------------------------------------------------------------------
// G) Find the number of times the voltage has crossed the initial voltage
// - every 2 crosses we will have sampled 1 wavelength
// - so this method allows us to sample an integer number of half wavelengths which increases accuracy
//-----------------------------------------------------------------------------
lastVCross = checkVCross;
if (sampleV > startV) checkVCross = true;
else checkVCross = false;
if (numberOfSamples==1) lastVCross = checkVCross;
if (lastVCross != checkVCross) crossCount++;
}
//-------------------------------------------------------------------------------------------------------------------------
// 3) Post loop calculations
//-------------------------------------------------------------------------------------------------------------------------
//Calculation of the root of the mean of the voltage and current squared (rms)
//Calibration coefficients applied.
double V_RATIO = VCAL *((SupplyVoltage/1000.0) / (ADC_COUNTS));
Vrms = V_RATIO * sqrt(sumV / numberOfSamples);
double I_RATIO = ICAL *((SupplyVoltage/1000.0) / (ADC_COUNTS));
Irms = I_RATIO * sqrt(sumI / numberOfSamples);
//Calculation power values
realPower = V_RATIO * I_RATIO * sumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor=realPower / apparentPower;
//Reset accumulators
sumV = 0;
sumI = 0;
sumP = 0;
//--------------------------------------------------------------------------------------
}
Standardoil:
Secondo me serve anche un carico, il TA lavora in corrente ...
Corretto ... in effetti, buona parte dei TA commerciali per AC hanno una resistenza all'interno, gia in parallelo alla bobina (anche se spesso i venditori non la nominano neppure, tocca cercarsi i datasheet per scoprire se c'e' e di quale valore e') ...
Oppure si dovrebbero usare quelli HALL per AC/DC con alimentazione ... ma li fanno pagare il classico sproposito e mezzo ...
Riprendo questo post perché sto portando avanti un progetto abbastanza pesante sul controllo dei carichi in una abitazione con riscaldamento elettrico a pavimento.
Notavo che Arduino era "bello tranquillo" ma avevo altri problemi da risolvere.
Adesso che sono più tranquillo ho notato che questa riga
Irms = emon1.calcIrms(1480); // Calculate Irms only
mi abbassa drasticamente la velocità di elaborazione di Arduino, e sto parlando di un paio di cicli di programma al secondo !!!!!!
Probabilmente usa la libreria matematica in virgola mobile, bisognerebbe riscrivere la libreria in modo da usare solo le 4 operazioni fondamentali +-/* per sostituire i calcoli in virgola mobile,
ad esempio se devi dividere un numero n/3.2 puoi fare n10/32 cioè: n2(uno shift a sx)+ n*8(altri 2shift a sx) / 32(5shift a dx), quindi in qualche microsecondo si fà...
Purtroppo non sono all'altezza di riscrivermi una libreria.
Mi chiedevo, piuttosto,, se c'è un altro modo per leggere un T.A. da Arduino, e qui Standaroil, Gilberto, Etemenanki e altri magari potrebbero saperlo...
Ma vuoi leggerlo direttamente ? ... credo il sistema migliore sia infilarci in mezzo un'operazionale doppio configurato come raddrizzatore ideale, che gia ti da in uscita il valore medio in continua anche se l'ingresso e' in alternata, alla fine ... svantaggio, per avere una buona risposta richiede alimentazione doppia, ma con un 358 ed un piccolo convertitore DC-DC di quelli a scatolino, si dovrebbe risolvere abbastanza facilmente ...
Oppure ti serve proprio leggere e campionare l'andamento della sinusoide ?