Hallo zusammen, Eine Frage zur Regler Programmierung: Ich bin dabei einen PID Regler in Software zu programmieren. Dabei ist mir aufgefallen, dass alle Regelgrößen als Gleitkommazahlen vorliegen. Also z.B. Soll, Ist und Stellgröße. Die Stellgröße wird an einen Motorontroller gesendet. Der versteht allerdings nur ganzzahlige Werte. Kann das zum Problem werden? Da es ja ein paar Abtastzyklen dauern wird bis das Zehntel der Stellgröße überläuft und der Motor überhaupt erst reagieren wird. Muss das in der Regler Parametrisierung als Totzeit oder Totglied (bin kein Regler Experte) berücksichtigt werden? Oder sollte ich besser den ganzen Regler in Integer ausführen? Aber dann verpasse ich auf die gleiche Weise Infos von den Sensoren oder? Danke schon mal für eure Hinweise.
Du bekommst auch nur endliche Werte ob jetzt 50,05 oder 5050 alles das selbe
Hm... aber von 50.1 bis 50.9 würde immer nur 50 an den Motor übertragen werden.
Schon der C64 konnte damals mit Gleitkommazahlen umgehen. Und das war ein 8-bitter mit knapp 1 MHz. So ein Prozessor braucht dann eben etwas mehr Zeit, weil er alles in Software machen muss. Wenn die Regelgeschwindigkeit damit immer noch ausreicht, warum auf die Floats verzichten? Die Stellgröße wird vor dem Senden auf Integer zurückgerechnet, das sollte reichen.
>vor dem Senden auf Integer zurückgerechnet
Und dabei geht der Nachkommateil als Information flöten. Meine
eigentliche Frage ist, ob das vernachlässigt werden kann?
Ich verwend jeweils 32 bit integer, und kann so zB 16 Vorkomma und 16 Nachkomma bit definieren. Schliesslich kommen die Werte vom ADC als Ganzzahlen, und ein Stellglied will auch Gaznzahlen. Dazwischen kann man machen was man will. eine multiplikation mit 1.01 kann man als multiplikation mit 66191 dividiert durch 65536 machen. Wobei die zweite operation ein shift rechts 16 bedeutet
:
Bearbeitet durch User
>>vor dem Senden auf Integer zurückgerechnet >Und dabei geht der Nachkommateil als Information flöten. Meine >eigentliche Frage ist, ob das vernachlässigt werden kann? Da der Motor nur Integer zu verstehen scheint, bleibt dir nichts anders möglich, als kurz vorher in das Integer-Format des Motorreglers umzurechnen.
Es hilft sich die Begriffe "Auflösung" und "Wertebereich" auseinanderzuhalten. Dass Motor, Regler und Übertagungskanal/Feldbus mit unterschiedlichen Datentypen rechnen ist normal und macht auch Sinn. Bsp.: Ein 32bit-Integer Wert hat eine Auflösung von 32bit. Ein 32bit-Float Wert hat keine Auflösung von 32bit, sondern weniger. Die "Kunst" liegt darin, Datentypen zu finden, welche eine hinreichend große Auflösung haben und dann die Wertebereiche so zu wählen, dass diese Auflösung auch ausgenutzt wird. Ansonsten geht Genauigkeit verloren. Ja, Datentypkonvertierungen brauchen Rechenzeit. Aber diese wird meistens durch einfachere Rechenalgorithmen und größere Übersichtlichkeit im Quelltext wieder Wett gemacht.
Regeling schrieb: > Ich bin dabei einen PID Regler in Software zu programmieren. Dabei ist > mir aufgefallen, dass alle Regelgrößen als Gleitkommazahlen vorliegen. > Also z.B. Soll, Ist und Stellgröße. Ja. Denke mal drüber nach, was passiert, wenn irgend eine dieser Größen als Integer gerechnet wird und dabei an einen Anschlag (Maximalwert) kommt. Dann kommt es zu unsinnigem Regelverhalten, weil ja danach so etwas wie der I-Anteil anschließend falsch gehen. Deshalb Gleitkomma. Alternativ muß man sich heftige Gedanken machen, um beim Auftreten solcher Zustände den ganzen Regler wieder auf den richtigen Pfad zu bringen. Natürlich kann der Motor oder DAC oder so nur einen begrenzten Wertebereich bedienen, aber das ist ja extrem harmlos im Vergleich zu einem Aus-den-Fugen-Kommen des eigentlichen Regelalgorithmus. W.S.
Regeling schrieb: > Der versteht allerdings nur ganzzahlige Werte. Dann kommt es sehr auf die Wertebereiche an, welche die Gleitkommazahlen haben können und welche Werte der Motorregler versteht. Vermutlich wirst du die Gleitkommazahlen mit einer Multiplikation an den Wertebereich des Reglers anpassen müssen, damit der nicht nur 0 oder 1 bekommt, oder Werte, die weit ausserhalb seines Bereichs liegen. Rechnerintern liegen Gleitkommazahen meist in einem Format der Art "(Vorzeichen) 0.1234567 mal 2 hoch N" vor. Da vereinbarungsgemäß der erste Teil, die so genannte Mantisse, stets kleiner als 1 ist, kann man die erste Null und den Punkt auch weglassen, auch die Basis 2 muss man sich nicht merken, und so wird das dann auch im Speicher des Rechners abgelegt. Wenn du z.B. diese Zahl durch zwei dividieren willst, brauchst du nur den Exponenten N um 1 herabzählen. Das ist jetzt allerdings ein sehr einfach gewähltes Beispiel gewesen, denn im allgemeinen Fall ist bei Gleitkommaarithmetik sogar schon eine simple Addition eine relativ komplizierte Angelegenheit.
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.