mikrocontroller.net

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


Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Sonic (Gast)
Datum:

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

Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Art. 4020 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jede Blume hat auch eine Wurzel.

Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: bluebrother (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
volatile unsigned quadSum;
volatile u08 flag;


SIGNAL SIG_<enstpr. Signal für Timer> {
   static unsigned sum;
   static unsigned count;
   sum += irgendwas vom ADC
   if (count > 123) {
      if (!flag) {  // nicht beim Wurzeln
         quadSum = sum / count;
         flag=1;
      }
      count=0;
      sum=0;
   }
   count++
}

int main () {
   flag=0;
   // setup und starte timer hier
   while (!flag);
   unsigned res = sqrt(uQuadSum); 
   flag = 0;
   printf("%d",res); // oder mach sonst was

}
jetzt nur noch schön aufpassen damit es nirgends einen Überlauf gibt... 
:-)

Autor: Timur Yigit (smokingslim)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Sªsse (philipp)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Uwe Bonnes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timur Yigit (smokingslim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha perfekt das ist wohl die Lösung vielen Dank.

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn du Ueff*Ieff rechnest, dann hast du die BLIND-leistung

???

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ueff * Ieff ist wohl eher die Scheinleistung in VA

Autor: Peter Dannegger (peda)
Datum:

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

Timur wollte aber die Wirkleistung haben.


Peter

Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ueff * Ieff = Q

Sehr interessant, seit ihr immer noch dieser Meinung?

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.