Satz des pythagoras effektiv auf einem Mikrocontroller berechnen

Gast #1545070
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
Gast
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.
Gast
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)
Gast
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.
Gast
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
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)
Gast
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' ?
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.
Gast
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?
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.
>>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.