Wurzel + Dauer ? [AVR]

OP #533178
Lesenswert?
• ▲
▼
Hi ich habe folgendes Problem.
Ich muss eine Wirkleistungsmesser Programmieren mit ziehmlich hoher 
Auflösung.
Deshalb ist die Rechenzeit recht knapp bemessen.
Meine Frage:
Ich muss die Quadratwurzel aus einer 16 Bit Zahl berechnen kann mir 
jemand vielleicht jemand sagen wieviel Taktzyklen dabei mit der sqrt() 
Funktion drauf gehen.

Danke und Gruß
OP #533190
Lesenswert?
• ▲
▼
Ja das Problem ist nur das ich im moment abwägen muss ob es überhaupt 
mit den ADC's des Controllers geht oder ob ich doch einen IC für die 
Leistungsmessung nehmen muss und ich noch keine Zeit hatte mich in die 
Entwicklungsumgebung von AVR einzuarbeiten.
Deshalb wäre eine kurze abschätzung sehr hilfreich
Gast #533196
Lesenswert?
• ▲
▼
Ich kenne dein Budget nicht, aber auf dem Markt gibt es Leistungsmesser 
in reihenklemmenform (2 bis 700A) von irgendeiner Ami-Firma, die haben 
direkt 0/4..20mA-Ausgang. Sensoren zur Strom und Spannungsmessung gibt's 
auch in Hülle und Fülle. Einfach mal googlen.
OP #533212
Lesenswert?
• ▲
▼
Na ja eigentlich nur 10 Punkte pro Sekunde.
Aber weil damit Elektrowerkzeuge mit Phasenabschnittssteuerung gemessen 
werden sollen wird mit ungefähr 22KHz abgetastet.
Die Spannugs und Strom verläufe sind ziehmlich wild.
Die I und U Werte werden dann quadriert aufsummiert und gemittelt.
Danach wir die Wurzelgezogen das ergibt dann den Effektivwert der 
Spannung oder des Stroms dann ist man auch schon fast fertig.
Gast #533257
Lesenswert?
• ▲
▼
@ Timur Yigit

>werden sollen wird mit ungefähr 22KHz abgetastet.

>Danach wir die Wurzelgezogen das ergibt dann den Effektivwert der
>Spannung oder des Stroms dann ist man auch schon fast fertig.

Aber das endgültige Wurzelziehen musst du doch nciht 22.000 mal Pro 
Sekunde machen, sondern nur so oft wie en Ergbnis benötigt wird. Für ne 
Anzeige max. 2..3 mal pro Sekunde, für eine Aufzeignung bestenfalls 
einmal pro 50 Hz periode (20ms).

MfG
Falk

Gast #533284
Lesenswert?
• ▲
▼
Ist es dann nicht so, dass du z.B. immer 100 Werte quadrierst und 
aufaddierst und erst dann die Wurzel ziehst?
d.H. auf 100 Quadrierungen kommt eine Wurzel? (und fällt somit kaum ins 
Gewicht)

Falls du am Ende gar die Wirkleistung willst, brauchst gar nicht 
"wurzeln" sondern einfach U*I aufsummieren und durch die Anzahl der 
Summanden teilen.

die Wurzel braucht übrigens je nach Input mit rund 3000-6000 Takte
Gruß
Roland
Gast #533299
Lesenswert?
• ▲
▼
Nachtrag:

Abtasten tust du im Timer, wenn 20 mS im Timer um sind kopierst du die 
Werte in eine andere Variable und setzt ein Flag, dass die Main Routine 
die Wurzel ziehen darf:
1
volatile unsigned quadSum;
2
volatile u08 flag;
3

4

5
SIGNAL SIG_<enstpr. Signal für Timer> {
6
   static unsigned sum;
7
   static unsigned count;
8
   sum += irgendwas vom ADC
9
   if (count > 123) {
10
      if (!flag) {  // nicht beim Wurzeln
11
         quadSum = sum / count;
12
         flag=1;
13
      }
14
      count=0;
15
      sum=0;
16
   }
17
   count++
18
}
19

20
int main () {
21
   flag=0;
22
   // setup und starte timer hier
23
   while (!flag);
24
   unsigned res = sqrt(uQuadSum); 
25
   flag = 0;
26
   printf("%d",res); // oder mach sonst was
27

28
}
jetzt nur noch schön aufpassen damit es nirgends einen Überlauf gibt... 
:-)
OP #533300
Lesenswert?
• ▲
▼
Roland Praml wrote:

> Falls du am Ende gar die Wirkleistung willst, brauchst gar nicht
> "wurzeln" sondern einfach U*I aufsummieren und durch die Anzahl der
> Summanden teilen.
>
Hi Roland,
Ja genau ich summiere etwa 360 Punkte auf und ziehe dann die Wurzel.
Aber was ich nicht verstehe ist warum ich mir die Wurzel für den 
Effektivwert sparen kann. Ich muss doch Ueff*Ieff rechnen oder
Angehängte Dateien:
#533461
Lesenswert?
• ▲
▼
Timur Yigit wrote:

> Die I und U Werte werden dann quadriert aufsummiert und gemittelt.
> Danach wir die Wurzelgezogen das ergibt dann den Effektivwert der
> Spannung oder des Stroms dann ist man auch schon fast fertig.


Und was hat das mit der Wirkleistung zu tun ?

Garnichts !

Durch das Quadrieren geht Dir ja das negative Vorzeichen verloren.
Blindkomponenten (Motoren sind induktiv) speisen aber gespeicherte 
Energie zurück.

Du kriegst also irgendwas viel höheres als die Wirkleistung.

Um die Wirkleistung zu ermitteln mußt Du über das Produkt i(t)*u(t) 
integrieren und das geht ganz ohne Wurzel.


Peter
#533492
Lesenswert?
• ▲
▼
Zu Philipp Sªsses Vorschlag zur Wurzelberechnung:

> reicht ein LUT mit 256 16-Bit-Einträgen, also ein halbes kB. Dann bist
> Du mit einer kleinen Schleife schnell am Ziel.

Noch schneller gehts, wenn man die LUT nicht linear, sondern binär 
absucht: Stichwort bsearch.

Damit ist man nach maximal 8 Schritten am Ziel.

Das Problem bei sqrt ist, daß die mit float/double arbeitet und die 
Wandlung von den int-Sensorwerten nach float/double nicht gerade 
kostenlos geht.

Mit Lookup Tables kann man den ganze Datenberechnung mit int machen und 
muß nur am Schluß in ein zur Anzeige kompatibles Format wandeln.
Gast #533749
Lesenswert?
• ▲
▼
Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung, wenn du 
u(t)*i(t) / Anzahl rechnest, dann hast du die WIRK-Leistung.

Je nach dem was du messen willst, brauchst einmal die Wurzel und einmal 
nicht.

Evtl ist dir der Unterschied zwischen Blind und Wirkleistung noch nicht 
klar (->google)
Wenn man aber beides hat, dann kann man noch interessante Sachen wie den 
cos(phi) ausrechnen.

Gruß
Roland
#533924
Lesenswert?
• ▲
▼
> Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung
Jo, stimmt.

Muss man eigendlich jede Periode durchmessen?
Kann man nicht z.B. nur jede 10. erfassen? - Dann hat man Zeit zum
rechnen...
Ist es ungenau den Phasenwinkel zu erfassen als Zeitl. Differenz der 
Nulldurchgänge, wenn man 50Hz vorraussetzt?

Dann könnt man ja z.B. jede 10*n-te Periode die Wirkleistung berechnen 
und updaten und jede 5+10*n-te Periode den Winkel.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren