Übergang zwischen Regler und DAC

OP #4192982
Lesenswert?
• ▲
▼
Hi Leute,

ich habe folgenden Beispielcode für eine Regelung geschrieben:
1
previous_output_value = actual_output_value;
2
actual_error = target_value - actual_value;
3
actual_output_value = previous_output_value + r0*actual_error;
Der Wert der Variable actual_output_value soll dann einem 12Bit-DAC 
übergeben werden.

Beim Debuggen stelle ich fest, dass meine Stellgröße manchmal negativ 
ist.

Meine Fragen lauten:
1. Soll ich die untere Grenze der Stellgröße auf 0 setzen, da der DAC 
nur Spannungen im Wertebereich 0...2,5V ausgeben kann ?

2. In einigen Beispielen habe ich gesehen, dass die Stellgröße noch mit 
dem LSB-Wert multipliziert wurde. Warum ?

Die Fragen mögen doof klingen, aber ich schreibe zum ersten Mal ein 
Regelalgorithmus und fühle mich dabei ein bisschen unsicher.

Ich freue mich auf alle Antworte

Jona
#4192998
Lesenswert?
• ▲
▼
Jonathan I. schrieb:

> Beim Debuggen stelle ich fest, dass meine Stellgröße manchmal negativ
> ist.
>
> Meine Fragen lauten:
> 1. Soll ich die untere Grenze der Stellgröße auf 0 setzen, da der DAC
> nur Spannungen im Wertebereich 0...2,5V ausgeben kann ?

Dein DAC wird wohl dann mit negative Zahlen herzlich wenig anfangen 
können. Sehr wahrscheinlich wird der sogar mit unsigned Werten arbeiten. 
D.h. aufgrund des Aufbaus von 2-er Komplement-Zahlen wird der deine 
negativen Werte als sehr grosse positive Zahlen ansehen.

Es ist immer gut, wenn man sich an vorgegebene Grenzen hält. Wenn dein 
DAC nur Werte im Bereich 0 bis sagen wir mal 2048 richtig verarbeiten 
kann, dann wird es eine ziemlich gute Idee sein, dafür zu sorgen, dass 
dieser Wertebereich auch nicht verlassen wird. Es ist zwar schön, wenn 
dein Regelalgorithmus auf eine Temperatur von 3 Millionen Grad aufheizen 
will. Wenn aber der Tauchsieder nicht mehr als 120° hergibt, dann kann 
sich dein Regelalgorithmus Kopf stellen. Mehr als diese 120 wirds nicht.

Daher: ja.
Wenn in deiner Regelschleife negative Zahlen rauskommen, und der DAC 
damit nichts anfangen kann, dann wird es eine ziemlich gute Idee sein 
nicht darauf zu bauen, dass irgendeine magische höhere Instanz eingreift 
und das wieder ausbügelt (es sei denn in der Doku steht, dass das ok 
ist). Kleiner als 0 geht nun mal nicht.

> 2. In einigen Beispielen habe ich gesehen, dass die Stellgröße noch mit
> dem LSB-Wert multipliziert wurde. Warum ?

Kommt eben drauf an, in welchen Einheiten die Regelschleife operiert. 
Arbeitet die direkt mit den Werten, die zb an den DAC gehen oder 
operiert die zum Beispiel in der Einheit 'Grad Celsius'. Dann gibt es 
eben irgendeinen Zusammenhang zwischen dieser Einheit und dem was man an 
den DAC geben muss. Denn der will ja in 'seinen Einheiten' gefüttert 
werden.
In den Beispielen, die du gesehen hast, wird wahlrscheinlich die 
Regelschleife in der Einheit 'Volt' operieren. Wenn also die 
Regelschleife rauskriegt, dass der Ausgang auf 3.38V einzustellen ist, 
dann muss man logischerweise noch mit dem LSB-Wert multiplizieren um dem 
DAC diese 3.38V 'in seinen Einheiten' schmackhaft zu machen.

> zum ersten Mal ein Regelalgorithmus und fühle mich dabei ein
> bisschen unsicher.

Brauchst du nicht. Mit ein bisschen Hausverstand ist das alles kein 
Problem. Du regelst als Mensch dauernd irgendwas und machst das intuitiv 
schon richtig. Wenn ein Heizkörperventil schon komplett zu ist, dann 
versuchst du nicht noch weiter zuzudrehen. Denn erstens bringt das 
nichts und zweitens ruinierst du es damit höchstens. Aber Effekt 
erreichst du damit keinen mehr. Komplett abgedreht ist nun mal komplett 
abgedreht. Noch weniger geht nicht.
Genauso in der umgekehrten Richtung. Ist das Heizkörperventil (im 
Winter) voll aufgedreht, dann bringt es nichts mehr, es noch weiter 
aufdrehen zu wollen. Mehr als 'schon komplett offen' geht nun mal nicht. 
Da spielt es auch keine Rolle mehr, ob der holden Weiblichkeit kalt ist 
oder nicht.

Antwort schreiben

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.

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.