Forum: Digitale Signalverarbeitung / DSP / Machine Learning Übergang Gleitkomma zu Integer beim PID


von Regeling (Gast)


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.

von Malefiz (Gast)


Lesenswert?

Du bekommst auch nur endliche Werte ob jetzt 50,05 oder 5050 alles das 
selbe

von Regeling (Gast)


Lesenswert?

Hm... aber von 50.1 bis 50.9 würde immer nur 50 an den Motor übertragen 
werden.

von PittyJ (Gast)


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.

von Regeling (Gast)


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?

von Pandur S. (jetztnicht)


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

: Bearbeitet durch User
von PittyJ (Gast)


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.

von Zylinder (Gast)


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.

von W.S. (Gast)


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.

von lrep (Gast)


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.

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
Noch kein Account? Hier anmelden.