Wie programmiert man eine stetige Reglung in ANSI C?

Gast #120198
Wie programmiert man eine stetige Reglung in ANSI C? Der Microcontroller
ist ein 80C535
Folgendes Problem ich habe über einen Analogeingang eine Spannung von
6,75V, diese soll konstant über ein PWM Signal gehalten werden. Sobald
die Spannung über oder unter 6,75 V ist soll das PWM Signal die
Spannung wieder auf 6,75 V bringen. Das Programm für die PWM Ausgabe
habe ich schon nur das für die Regelung noch nicht. Über jeden Tipp bin
ich dankbar.
Gast #120199
Hallo

Ich kann zwar kein ANSI C  abre vielleicht kann ich dir Helfen.

Ich würde dies so machen


if (Spannung > 6.75)
{
  PWM = PWM -1
}

if (Spannung < 6.75)
{
  PWM = PWM +1
}

Gruss

Weihnachtsmann
Gast #120200
Je nach Anwendung kannst du auch noch die Abweichung ausrechnen und
diese dann als Faktor für die Stärke der Korrektur nehmen.

So:
Abweichung = Spannung - 6.75;
PWM = PWM - (Abweichung * 1);

Wenn die Abweichung negativ ist, ist der Wert zu gering, ergo wird in
der zweiten Anweisung was dazuaddiert. Entsprechend umgekehrt. Die 1
kannst du durch einen ausprobierten/ausgerechneten/geschätzten Faktor
ersetzen. So hast du die Änderung immer abhängig von der Abweichung.
Die beiden Befehle kannst du dann als Loop durchlaufen lassen.
Gast #120201
Da muss man allerdings aufpassen, dass man da keine Schwinung
reinbekommt.
Das Gegenteil zu Christians Vorschlag wäre es einen Mittelwert zu
speichern, in den der neue Wert immer mit einem kleinen Gewicht
eingeht. So würde z.B. eine leicht erhöhte Spannung, die vielleicht nur
paar Mikrosekunden andauert, keine Nachregelung auslösen, wenn sie
danach wieder auf den Sollwert fällt.
Ansonsten könnte es sein, dass man sich dumm und dämlich regelt.
Gast #120202
Also einen einfachen P-Regler hab ich mal so geschrieben:

int kp = 4;         // Verstärkungsfaktor
int yo = 116;       //
w = Wandlung(0);    // A/D-Wandlung Sollwertgeber (Poti)
x = Wandlung(1);    // A/D-Wandlung Motortacho

/*** P-Regler ****/
a = kp * (w - x) + yo;
      if (a < 0) y = 0;
  else if (a > 255) y = 255;
  else y = a;
  CCL2 = y;    // PWM-Wert laden

Die Regeldifferenz bleibt natürlich nur 0, wenn der Motor sich auf der
Kennlinie für den Wert y9 befindet.
Ein PI-Regler ist aber auch nicht schwerer, wird nur ein Timerinterrupt
benötigt und die Formel entsprechend ändern.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.