Sida 1 av 2

Mäta True RMS värde med ADC

Postat: 23 juli 2012, 15:56:02
av jimmieh
Hej
Jag vill mäta en ström som går genom en AC motor så noggrant som möjligt och har valt att använda en current transductor som jag läser av med en MCU som har en 12bitars ADC.
Har gjort en RMS algoritm där jag först läser in 80 värden under en period till en array. Sedan kör jag följande RMS algoritm på den arrayen och får ut ett ganska bra värde.

Kod: Markera allt

long Calculate_rms_value( long *array , int numberOfSamples )
{
     long tempValue = 0;
     long tempMeanValue = 0;
     int k;

     for( k = 0; k < numberOfSamples; k++ ) // Get DC offset
     {
       tempMeanValue = tempMeanValue + array[k];
     }
      tempMeanValue = tempMeanValue/numberOfSamples;

    for( k = 0; k < numberOfSamples; k++ )
     {
       tempValue = tempValue + ( ( array[k] - tempMeanValue ) * ( array[k] - tempMeanValue ) ) ;
     }
     
      return ( long ) sqrt( tempValue / numberOfSamples );
}
Programet fungerar bra förutom när det blir förändringar i frekvensen på insignalen. RMS algoritmen bygger ju på att jag samplar 80 värden under exakt en period av sinusvågen och skulle frekvensen förändras stämmer inte värdet.

Min fråga är nu mur man på bästa sätt bestämmer hur lång en period är utifrån en array som innehåller en sinusvåg?
Det skulle antagligen vara ganska lätt att bar a leta efter två maxvärden och sedan köra en RMS beräkning däremellan. Men det lär inte bli rätt om man får in lite störningar på sinusvågen.

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 15:59:41
av blueint
RMS = (nuvarande värde)² - (föregående värde)²

Om jag minns rätt, kan vara tokfel. Men då skulle du kunna mäta kontinuerligt och utan att behöva fundera på var i vågformen du mäter.

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 16:38:27
av jesse
Ja, det bör kunna vara helt oberoende av eventuell "period". Du ska i princip kunna köra in brus.

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 19:16:43
av 4kTRB
Här är 2st pdf som beskriver effektmätning med PIC och där
ingår att mäta RMS vilket också beskrivs.

http://www.electro-tech-online.com/cust ... 00220a.pdf
http://www.electro-tech-online.com/cust ... 00939a.pdf

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 21:54:55
av jimmieh
Tack
Men förstår inte riktigt hur den matematiska formeln ser ut för att få ut ett RMS värde utan att veta perioden.

Ut från transduktorn har jag en dc offset och den räknar jag ut genom att räkna ut medelvärdet under en period. Dc offseten subtraherar jag sedan från varje sampel innan jag räknar ur RMS värdet. Finns det något annat matematiskt sätt att bli av med offseten?

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 22:32:31
av 4kTRB
Du samplar väl in kurvformen under en period och
kvadrerar. Då har du en ny kurvform med enbart
positiva värden, typ en kamelpuckel, den beräknar
du arean under och dividerar resultatet med periodtiden.
Sedan är det bara att dra roten ur alltihop och vips så har du RMS.

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 23:09:55
av jimmieh
Jo, fast vad händer när frekvensen fluktuerar, typ blir 51Hz? Jag vet ju inget bra sätt att mäta vad frekvensen är just vid mättillfället.

Jag har dessutom en dc offset ut från transduktorn. Transduktorn ger ut en signal på 2.5v när ingen ström går igenom. Jag måste på något sätt räkna ut denna offset(om den skulle ändra sig) också och det gjorde jag genom att räkna ut ett medelvärde på alla sampel under en period. Och samma problem blir det även här när frekvensen fluktuerar blir det ett mätfel.

Re: Mäta True RMS värde med ADC

Postat: 23 juli 2012, 23:40:55
av labmaster
jimmieh, räkna fram vad mätfelet blir då frekvensen ändrar sig. Det är först då du får en uppfattning om ifall det har någon betydelse.

Re: Mäta True RMS värde med ADC

Postat: 24 juli 2012, 00:21:01
av 4kTRB
Du ser till att börja sampla vid första nollgenomgång
och avslutar vid 3:dje nollgenomgången. Du vet
samplingsintervallen och därmed har du periodtiden
på den samplade perioden.

Offset får du bort genom att använda en kondensator.

Re: Mäta True RMS värde med ADC

Postat: 24 juli 2012, 02:55:22
av kimmen
Det vanliga sättet som multimetrar och sånt använder (som går att göra analogt relativt enkelt!) är att kvadrera momentanvärdet och sedan skicka resultatet till ett lågpassfilter. Utvärdet från lågpassfiltret drar man sedan roten ur och visar.

Om lågpassfiltret då har en brytfrekvens betydligt under pulsationen från kvadreraren fås ett bra resultat. Det är ju medelvärdesbildning efter kvadrering och före roturdragning man vill ha.

Skulle det gå att göra något sådant?

Re: Mäta True RMS värde med ADC

Postat: 24 juli 2012, 03:33:32
av thebolt
Alternativ till ovanstående är att tillämpa lite matematik och på så sätt få ett exakt svar, samtidigt som mängden beräkningar och datamängd blir hanterbart.

Det du vill beräkna är "AC TrueRMS", dvs RMS i förhållande till ett medelvärde, för att bli av med ev DC-offset. Låt mig införa lite notation för att underlätta skrivandet. x_n är din insignal vid tidpunkt n (n = 1,2,3...), u är medelvärdet av den, r är "direkt" rms och s "AC rms" (varför det är s kommer framgå senare).

Då gäller ju att r = sqrt(sum(|x_n|^2)/n) eller enklare r^2 = sum(|x_n|^2)/n, samt s^2 = sum(|x_n-u|^2)/n = sum(|x_n|^2)/n - |u|^2, dvs r^2 = u^2 + s^2. Anledningen till att vi kallar "AC rms" för s ses om man läst lite statisitk, s är standardavvikelsen (och s^2 därmed variansen). Så det du vill beräkna är inte RMS utan standardavvikelsen, och det finns effektiva metoder att göra det utan att ens behöva spara alla värden.

Det bästa sättet (så vitt jag vet) när det gäller avrundingsfel osv är följande:

Initialt:
A_0 = 0
Q_0 = 0
För varje nytt sample x_n beräkna:
A_n = A_(n-1) + (x_n - A_(n-1)) / n (A är då medelvärdet över sample 1 till n)
Q_n = Q_(n-1) + (n-1)/n * (x_n - A_(n-1))^2 = Q_(n-1) + (x_n - A_(n-1))*(x_n - A_n)
Standardavvikelsen efter n steg är då s^2 = Q_n/n (eller s = sqrt(Q_n/n))

Då du inte vet din sampel-period, och du inte heller har indikerat exakt vilken vågform etc det handlar om skulle jag sampla över ett par perioder. Som 4kTRB säger, börja vid en nollgenomgång, sätt A, Q och n till 0, sen för varje sampel kör ovanstående tills du fått tillräckligt många (jämnt antal till) nollgenomgångar, och så beräknar du s.

Blev lite långt, men hoppas det hjälper.

Re: Mäta True RMS värde med ADC

Postat: 24 juli 2012, 14:40:49
av jimmieh
Oj, nu blev det jobbigt.
Tror jag nöjer mig med min nuvarande algoritm men gör som ni säger och samplar över fler perioder då de ju blir mindre fel då om jag slutar sampla en halv period fel. Verkar dessutom bli ganska hyfsade värden även om frekvensen sjunker eller stiger med 5Hz från 50Hz.

Vet inte hur mycket frekvensen få fluktuera i elnätet men det borde väll bara vara +- någon Hz.

Har valt att sampla värden direkt ut från en transduktor eftersom jag tänkte att det borde bli minst fel då. Jämförelsevis med om man lägger till massa OP förstärkare och passiva komponenter som inte är helt linjära och ändrar sina egenskaper beroende på ålder och temperatur.
Är detta rätt tänkt?

Re: Mäta True RMS värde med ADC

Postat: 24 juli 2012, 15:14:46
av jesse
RMS handlar ju om medelvärdet. Och som alla medelvärden måste det gälla under en viss tid. Hur snabbt måste det vara? Du kan ju sampla en sekund åt gången. Bry dig inte om perioderna - om det är 50 eller 75 Hz ska inte spela någon roll.

Re: Mäta True RMS värde med ADC

Postat: 25 juli 2012, 08:56:48
av jimmieh
Vill kunna plocka ut 10 mätvärden per sekund.

Re: Mäta True RMS värde med ADC

Postat: 25 juli 2012, 17:41:43
av kimmen
Då blir det väl ganska så lagom att integrera/medelvärdesbilda över 100 ms som är 5 cykler av insignalen, om det nu går att göra det.

Nätfrekvensen är kortsiktigt 50 +- 0,2 Hz om jag förstått det rätt så variationen är ännu mindre än du skrev tidigare, vilket är bra!