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ß
Du könntest eine kleine Funktion Schreiben und mit dem Debugger (Stoppuhr) die Zeit und die Taktzyklen messen lassen?
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
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.
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.
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
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.
@ 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
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.
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
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.
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?
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.
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... :-)
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
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.
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
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?
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...
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
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.
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
Roland Praml wrote:
> Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung
Timur wollte aber die Wirkleistung haben.
Peter
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.