Forum: Mikrocontroller und Digitale Elektronik Wurzel + Dauer ? [AVR]


von Timur Y. (smokingslim)


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ß

von Sonic (Gast)


Lesenswert?

Du könntest eine kleine Funktion Schreiben und mit dem Debugger 
(Stoppuhr) die Zeit und die Taktzyklen messen lassen?

von Timur Y. (smokingslim)


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

von Sonic (Gast)


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.

von Rob (Gast)


Lesenswert?

Keine Zeit fuer gar nichts - das ist schwierig. Wieviele Samples pro 
Sekunde sollen's denn sein ? Eine Wurzel kann man auch mit einer Tabelle 
und etwas Interpolation machen.

von Timur Y. (smokingslim)


Lesenswert?

Danke aber im moment haben wir eine Lösung mit IC aber wir wollen davon 
wegkommen. Deshalb der Versuch es mit den ADC es hinzubekommen

von Art. 4020 (Gast)


Lesenswert?

Jede Blume hat auch eine Wurzel.

von Timur Y. (smokingslim)


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.

von Falk (Gast)


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


von Timur Y. (smokingslim)


Lesenswert?

Ja genau eigentlich nur alle 20ms aber das Problem ist das 40microsec 
später schon die nächsten Werte anliegen für die nächste Periode.

von Roland Praml (Gast)


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

von Benedikt K. (benedikt)


Lesenswert?

Die Wurzerlfunktion die ich nutze braucht für 32bit -> 16bit 537-555 
Takte und für 16bit->8bit 184-192 Takte. Gerechnet wird ohne 
Kommazahlen.

von Timur Y. (smokingslim)


Lesenswert?

Benedikt K. wrote:
> Die Wurzerlfunktion die ich nutze
Perfekt Danke für die BlitzInfo aber diese Wurzelfunktion die du meinst 
ist nicht die standart in C oder?

von bluebrother (Gast)


Lesenswert?

du könntest auch einfach mal in die Sourcen zu deiner C-Implementierung 
reingucken -- ich nehme jetzt einfach mal an dass du da dran kommst.

von Roland Praml (Gast)


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... 
:-)

von Timur Y. (smokingslim)


Angehängte Dateien:

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

von Benedikt K. (benedikt)


Lesenswert?

Timur Yigit wrote:
> Benedikt K. wrote:
>> Die Wurzerlfunktion die ich nutze
> Perfekt Danke für die BlitzInfo aber diese Wurzelfunktion die du meinst
> ist nicht die standart in C oder?

Das ist die von http://elm-chan.org/
Schneller und kleiner geht es eigentlich kaum noch.

von Peter D. (peda)


Lesenswert?

Ich denk, Du willst die Wirkleistung, wozu dann die Wurzel ?

Du addierst z.B. 256 mal je Periode das Produkt i(t) * u(t) und schmeißt 
das unterste Byte weg, fertig.

Ist mit nem ATMega (HW-Multiplier) bequem zu schaffen.


Peter

von Philipp S. (philipp)


Lesenswert?

Wenn Du Dir trotzdem Sorgen wegen der Zeit machst: für eine 16->8 Wurzel 
reicht ein LUT mit 256 16-Bit-Einträgen, also ein halbes kB. Dann bist 
Du mit einer kleinen Schleife schnell am Ziel. Hast Du so viel nicht 
vielleicht übrig?

von Uwe Bonnes (Gast)


Lesenswert?

Hast Du Dir schon mal bei Analog Devices die ADE Bausteine angeschaut? 
Kleine  U und I propotionale Signale auf der einen Seite rein, Messwerte 
ueber SPI auf der anderen Seite raus...

von Peter D. (peda)


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

von Uhu U. (uhu)


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.

von Timur Y. (smokingslim)


Lesenswert?

Ha perfekt das ist wohl die Lösung vielen Dank.

von Roland Praml (Gast)


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

von Schorsch (Gast)


Lesenswert?

> Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung

???

von gast (Gast)


Lesenswert?

Ueff * Ieff ist wohl eher die Scheinleistung in VA

von Peter D. (peda)


Lesenswert?

Roland Praml wrote:
> Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung

Timur wollte aber die Wirkleistung haben.


Peter

von X. H. (shadow0815)


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.

von Schorsch (Gast)


Lesenswert?

Ueff * Ieff = Q

Sehr interessant, seit ihr immer noch dieser Meinung?

von Roland Praml (Gast)


Lesenswert?

Schorsch hat natürlich recht,
Ueff * Ieff ist die Scheinleistung, hätte selber erst nachsehen sollen:

http://de.wikipedia.org/wiki/Scheinleistung
http://de.wikipedia.org/wiki/Wirkleistung
http://de.wikipedia.org/wiki/Blindleistung

trotzdem vermute ich das Timur die Wirkleistung messen will und dafür 
braucht man keine Wurzel.

Gruß
Roland

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.