mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Satz des pythagoras effektiv auf einem Mikrocontroller berechnen


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weiß jemand eine Möglichkeit wie man den
Satz des Pythagoras effektiv auf einem Mikrocontroller
berechnen kann?

Ich muss ihn 8000 mal in der Sekunde berechnen und die
Wurzel braucht einfach zu lange.

Zur Erinnerung

Satz des Pythagoras:

c = sqrt(a*a + b*b)

Gruß
Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermeiden.

Wie lautet denn die Aufgabenstellung, die du meinst mit einem Phytagoras 
berechnen zu müssen. Ev. kann man auf dieser Ebene schon etwas anderes 
finden.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder ein iteratives Verfahren für die Wurzel verwenden. 8000 mal pro 
Sekunde heisst, wenn du die ganze Rechenpower ausnutzen darfst: bis zu 
2000 Takte Zeit, das sollte eigentlich reichen, wenn du nicht noch float 
oder "langbittige" Variablen benutzen musst...
Kannst du ein paar Infos mehr liefern? Wie immer führen viele Wege nach 
Rom, aber du musst uns schon sagen zu welchem Rom du gelangen möchtest.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss bei einer feldorientierten Regelung
die Ständerspannung einer Synchronmaschine berechnen.

Dabei wird der Betrag des Spannungsvektors aus den einzelnen
Spannungskomponenten gebildet.

Die Formel lautet
Us = sqrt(Usd*Usd + Usq*Usq)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Berechnest du die Wurzel in Gleitkomm? Es gibt auch Ganzzahl- bzw.
Festkommaimplementationen, die schneller sind.

Sind a und b völlig vonvorhersagbar, oder gibt es einen Zusammenhang
zwischen den a- und b-Werten in aufeinanderfolgenden
Schleifndurchläufen? Dann kann man evtl. das neue Ergebnis aus dem
vorangegangenen ableiten.

Was mit mit dem Ergebnis c gemacht? Vielleicht brauchst c gar nicht,
sondern c² oder ein anderer von c abhängiger Ausdruck wäre ebenso
ausreichend, so dass du auf die Wurzelberechnung ganz verzichten oder
sie zumindest durch eine einfachere Operation ersetzen kannst.

Wie sieht die Gesamtanwendung aus? Ein Beispiel: Die Berechnung der
Punkte auf einem Kreis zur grafischen Darstellung kann ebenfalls mit
dieser Formel erfolgen, es gibt aber sehr viel effizientere Algorithmen
dafür.

Autor: urgs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst "effizient"!?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein iteratives Verfahren benutze ich schon

Das Problem ist, dass der Rechner noch einiges mehr rechnen
muss und die Wurzel zu viel Zeit braucht.

Ich habe überlegt ob man die Formel nicht irgendwie umstellen kann
so dass die Zahlen kleiner werden und es mit einer Tabelle lösen
kann

Autor: Genmutant (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elm Chan hat da eine ASM Funktion für den den gcc, die das mit ~600 
cycles berechnen kann:
http://elm-chan.org/docs/avrlib/sqrt32.S
Allerdings für 16bit Integer Werte.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Ich muss bei einer feldorientierten Regelung
> die Ständerspannung einer Synchronmaschine berechnen.

Die Spannung geht als IstWert in die Regelung zurück?
Könntest du zb den Sollwert quadrieren und die Regelung quasi 'auf den 
Quadraten laufen lassen' ?

Wenn der Istwert größer als der Sollwert ist, dann ist auch das QUadrat 
des Istwertes größer als das Quadrat des Sollwertes und umgekehrt. Aber: 
Ein Quadrat im Sollwert rechnet sich leichter als die Wurzel im Istwert 
(und der Sollwert ändert sich wahrscheinlich auch nicht so oft)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja Us geht in die Regelung ein.

Hab ich auch schon überlegt.
Beim PI regler würde es gehen müsste
aber anschließend doch die Wurzel ziehen
da sonst der Wert nicht passt.


>Die Spannung geht als IstWert in die Regelung zurück?
>Könntest du zb den Sollwert quadrieren und die Regelung quasi 'auf den
>Quadraten laufen lassen' ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Ja Us geht in die Regelung ein.
>
> Hab ich auch schon überlegt.
> Beim PI regler würde es gehen müsste
> aber anschließend doch die Wurzel ziehen
> da sonst der Wert nicht passt.

Ich glaube nicht, dass du am Ausgang noch die Wurzel ziehen musst.
Der Regler stellt ja eigentlich nur die Stellgröße solange nach, bis 
Istwert und Sollwert übereinstimmen. Der weiß nichts von irgendwelchen 
'Einheiten'. Die Sensitivität des Reglers (keine Ahnung ob man das so 
nennen kann) wird eine andere sein aber das sollte eigentlich mit den 
Regelparametern ausgleichbar sein.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da die Regelabweichung normalerweise klein ist (sonst taugt der Regler
nichts), ist

  Istwert - Sollwert ≈ (Istwert² - Sollwert²) / (2·Sollwert)

Damit ist die Wurzel weg, und etwas anderes brauchst du doch auch nicht,
oder?

Autor: Flipcode (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft dir dieser Artikel weiter:
http://www.flipcode.com/archives/Fast_Approximate_...

Autor: Daniel G. (daniel83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns Zeitkritisch ist und nicht auf 2Mio nachkommastellen genau sein 
muss, und du noch Platz im speicher hast, dann rechne das doch auf 
deinem PC vor und speicher das agnze in einem 2Dim Feld aub, dann musst 
du dir die DAten nur daraus hohlen und damit weiterrechnen. So un vorher 
gesehen sind Ständerspannungen ja nun auch nicht.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Us = sqrt(Usd*Usd + Usq*Usq)

Der Wert von (Usd*Usd + Usq*Usq) wird sich bei 8000 Abtastwerten/s nur 
langsam ändern. Man kann dann das iterative Heron Verfahren heranziehen, 
als Näherung das alte Ergebnis nehmen und mit dem neuen Wert einmal ein 
update durchführen. Ich wette, das funzt. Hatte yalu auch schon oben 
vorgeschlagen.

Cheers
Detlef

Edit:
Oder das Wurzelziehproblem in den Regler mit einbauen: Ein Integrierer, 
der mit seinem quadrierten Ausgangswert rückgekoppelt ist bildet die 
Wurzel on the fly.

Autor: Marko B. (glagnar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.