Übergang Gleitkomma zu Integer beim PID

Gast #4150581
Lesenswert?

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.
Gast #4150637
Lesenswert?

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.
#4150669
Lesenswert?

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
Gast #4150690
Lesenswert?

>>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.
Gast #4181723
Lesenswert?

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.
Gast #4183598
Lesenswert?

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.
Gast #4183905
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren