Forum: Mikrocontroller und Digitale Elektronik Kann ich eine Regelung (PID) mit Hexwerten Rechnen


von Christian Skrypzak (Gast)


Lesenswert?

Hallo zusammen,

Einführung:
{
Programmiersprache: C
Software: Keil µVision3 bzw. Softune Workbench von Fujitsu

µC: Atmel T89C51AC2 bzw. Fujitsu MB90F352

Ich möchte ein Becherglas mit Wasser um 5°K pro Minute erwärmen.
Gemessen wird mit einem PT100 an einem 10bit AD-Wanlder
Geregelt wird Softwäremäßig mit einer PID Formel.
Die Heizung Soll mit einer PWM angesteuert werden.
}


Das heißt ich habe einen SOLL-Wert (nicht sonderlich schwer zu
berechnen)
und einen IST-Wert (AD-Wandlungswert in 10bit).

Meine aufgestellten Formeln für PID sind mit Dezimalzahlen ausgerechnet
und Probiert, da ich diese Formeln ja jetzt in C geschrieben habe und
auf den µC benutze, habe ich als IST-Wert ja nur den 10 bit(2Byte) wert
des AD-Wandlers.

1.Überlegung:
  Umwandeln der 2Byte Hexwerte in Dezimal?
  Habe im Forum gesucht und auch ein paar lösungen für ASM gefunden.
  Da ich aber in C Programmiere diese Lösung erst mal zurückgestellt.
2.Überlegung:
  Ich weiße die 10 bit des AD-Wandlers als Word dem IST-Wert zu und
  benutze diesen zum Rechnen.(was soviel heißt das mein IST-Wert ein
  Hex-Wert ist)

Meine Frage: Funktioniert meine PID Rechnung jetzt trozdem noch da
meine anderen werte in der PID Rechnung ja Dezimal vorliegen oder kommt
da nur mißt rauß.

Vielen Dank für eure Anworten
Christian

von Karl H. (kbuchegg)


Lesenswert?

Du hast einen Grundlegenden Denkfehler.

Hex, Dezimal, Binaer sind alles nur verschiedene Schreibweisen
von immer demselben Ding: einer Zahl.

Im Rechner ist alles einfach nur eine Zahl. Erst wenn
du sie irgendwohin ausgibst, kommt die Frage ins
Spiel: in welcher Form gebe ich sie aus: als Binaerwert, Hexwert,
oder Dezimalzahl.

d.h. wenn du in den ADC ausliest, dann kriegst du einfach nur
eine Zahl. Die verwurschtest du anhand deiner Formel
mit einer anderen Zahl und kriegst als Ergebnis wieder eine
Zahl.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ob Dezimal, Hexadezimal, Oktal oder Binär - das sind alles nur
unterschiedliche Repräsentationen ein und desselben Wertes.

Ob Du nun in einem C-Programm schreibst

  a = 255;

oder

  a = 0xFF;

oder

  a = 0377;

oder

  a = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2) |
(1 << 1) | (1 << 0);

ist inhaltlich exakt dasselbe.

von Christian Skrypzak (Gast)


Lesenswert?

Was soviel heißt.

Ohne Denkfehler ggg

Es ist wurscht ob in meiner Formel Hex, Dez oder Bin steht nur von
einer Sorte oder Gemischt da es sowieso NUR Zahlen sind und dem µC egal
ist was ich eingebe?
Korrekt?

Was bekomme ich dann eigentlich als Ergebnis aus der Rechnung? Weil
deas übergebe ich ja dan an die PWM.

von Karl H. (kbuchegg)


Lesenswert?

> Es ist wurscht ob in meiner Formel Hex, Dez oder Bin steht nur von
> einer Sorte oder Gemischt da es sowieso NUR Zahlen sind und dem µC
> egal ist was ich eingebe?
> Korrekt?

Exakt. Hex, Dezimal, Binär interessiert dich nur an den Schnittstellen
nach aussen. Wenn Du willst kannst Du Zahlen ja auch durch
  * unterschiedliche Tonhöhen
  * Anzahl Händeklatschen
  * Blinkimpulse
  * Wasserstand in einer Röhre
  * ausgestreckte Finger an einer Hand
  * was auch immer (denk dir was aus)
symbolisieren.
Alles was du brauchst ist eine Ausgabefunktion die die Zahl
(die Rechnerintern als Bitmuster vorliegt) in die gewünschte
Form bringt, bzw. im umgekehrten Fall von der gewünschten
Form in die Zahl (also in das rechnerintern benutzte Bitmuster)
'übersetzt'.

> Was bekomme ich dann eigentlich als Ergebnis aus der Rechnung? Weil
> deas übergebe ich ja dan an die PWM.

Das weiss ich doch nicht. Aber ich würde mal sagen: Einen
Wert für die zu regelnde Größe. zb. soll die PWM eine bestimmte
Spannung erzeugen, mit der dann das Heizelement beheizt wird
oder auch nicht. Was hängt dann an der PWM dran? Eine PWM
für sich alleine ist ja ziemlich sinnleer.

von Christian Skrypzak (Gast)


Lesenswert?

Ich benutze z.B. beim Fujitsu µC ein PPG Register,
an diesem Ausgang möchte dan ein Solid-State-Relais (SSR) betreiben um
daran die Heizung anzuschließen.
Somit kann ich ja über die PulsPause die Leistung der Heizung
beeinflussen. (verbessert mich wenn ich mir Irre).

Beim Atmel hab ich mir noch keine gedanken gemacht wie ich eine PWM an
einem Ausgang Realisiere.

von Karl H. (kbuchegg)


Lesenswert?

> Somit kann ich ja über die PulsPause die Leistung der Heizung
> beeinflussen. (verbessert mich wenn ich mir Irre).

Nein, das ist schon richtig so.

von Rahul (Gast)


Lesenswert?

> Somit kann ich ja über die PulsPause die Leistung der Heizung
> beeinflussen. (verbessert mich wenn ich mir Irre).

Sollte das nicht nicht am besten netzsynchron passieren?
(Ich habe keine Ahnung von Wechselstrom-Leistungselektronik, deswegen
frage ich das.)

von Christian Skrypzak (Gast)


Lesenswert?

Ei Wunderbar.

Zum entgültigen abschluss.

Meine Rechnung der PID Regelung hat bei Tests Werte zwischen 0,0000
und maximal ca. 1,0000

Um einen Anständigen wert für ein 8bit PPG zu bekommen habe ich den
wert mit 256 Multipliziert.

Nach dem verstehen der oberen Postings gehe ich mal davon aus das sich
da nix geändert hat. (natürlich Kappe ich wert über 1 und unter 0 mit
einer entscheidung ab).

Ansonsten habe ich die Berechnung der PID Regelung absolut nicht
verstanden. (die war hier aus dem Forum).

von Christian Skrypzak (Gast)


Lesenswert?

@Rahul

Das Puls Pause sollte schon mit angemessen Hoher Frequenz laufen.

Wenn meine Gesamtperiode zu lang ist kann ich ja auch mit der Hand ein
und ausschalten.

von Wolfram (Gast)


Lesenswert?

das wird nichts:

denn 1*256=256 bei 8bit(unsigned) =0 oberstes Bit wird abgeschnitten
wertebereich 0..255
wenn du die PID Regelung aus dem Forum hast wird es wahrscheinlich auch
nichts da du die Regelparameter deiner Regelstrecke anpassen musst!
sonst schwingt sie oder hat Abweichungen oder funktioniert...

von Karl H. (kbuchegg)


Lesenswert?

> Ansonsten habe ich die Berechnung der PID Regelung absolut nicht
> verstanden. (die war hier aus dem Forum).

Ich kenn zwar die Berechnung aus dem Forum nicht, aber
das klingt so als ob Du Dir mal ein bischen Theorie
reinziehen solltest. So nach dem Motto: Wie funktioniert
eigentlich ein PID Regler und was macht der eigentlich?

http://de.wikipedia.org/wiki/Regler

von Christian Skrypzak (Gast)


Lesenswert?

@Wolfram

Logischerweiße habe ich schonn eigene P,I und D Werte benutz. Aus dem
Forum habe ich nur die Berechnung, in die ich die P,I und D Werte
einsetze.

>1*256=256 bei 8bit(unsigned) =0 oberstes Bit wird abgeschnitten
>wertebereich 0..255

OK war rechen fehler von mir Multiplizieren wir mit 255 da sollte es ja
gehen.

Zum besseren verständis da Hier ja eine Diskussion um die PID Regelung
entstanden ist (was ich sehr Begrüße) hier meine Formel.

P=150      in meinem Fall spielt aber für die Diskussion ja keine
I=6        Rolle
D=15


void Regelung (void)
{
KP  = (P*(Soll-Ist))/100;
KD  = (D*((Soll-Ist)-Diffalt))/10;
KIn = KIa+((I*(Soll-Ist))/50);

RegelAusg = KP + KD + (KIn/10);

RegelPWM = RegelAusg * 255;             //da 8bit PPG ergibt 255 Steps


  if (RegelPWM >= 255)
    {
      PWM = 255;
    }
  else if (RegelPWM <= 0)
    {
      PWM = 0;
    }
  else
    {
      PWM = RegelPWM;
    }


KIa = KIn;
Diffalt = (Soll-Ist);
}

von Christian Skrypzak (Gast)


Lesenswert?

@kbuchegg

Deinen Link von Wiki bringt mich in meiner Frage net so weiter den
kenne ich schonn. Ich habe mich schon Informiert befor ich hier Poste
Ich lese seit gut 3 Monaten hier im Forum bevor ich Heute das erste mal
was selbst geschrieben habe. Aber trozedem Danke für den Link.

Was so ein PID Regler oder die einzel Regler machen ist Theoretisch
denke ich schon verstanden aber das ganze in die Praxis umzusetzen und
auch noch in eine Hochsprache zu Quetschen ist mir schon recht
schwergefallen. Ich hab auch schon Lehrgänge über Regelung besucht (ist
schonn ne weile her aber immerhin) war aber alles nur Theorie.

von Karl H. (kbuchegg)


Lesenswert?

OK.
Also was an der Berechnung verstehst du jetzt nicht?
Schaut eigentlich straightforward aus:

PID

   P    tatsächliche Abweichung
   I    Integration der Abweichungen (also: Summe)
   D    Ableitung der Abweichung (also: Steigung der Tangente,
             Stichwort: Differenzenquotient)

Das alles findet sich doch sehr schön im Code.

von Christian Skrypzak (Gast)


Lesenswert?

Mit der Berechnung hab ich ja jetzt auch kein Problem mehr.
War ja nur eine Vermutung das ich was falsch mache, bin ja nicht
unfehlbar.

So wie es bis jetzt aus den Antworten von euch hervorgeht siehts ja gar
nicht so Schlecht aus.

Da ich ja Probegerechnet habe, hat mich eigentlich nur interessiert ob
ich jetzt immer noch wert zischen 0,0000 und 1,0000 herausbekomme.

Da wie oben beschrieben ja egal ist ob ich mit Hex oder Dez rechne
sollte als ergebniss ja immer noch 0,0000 - 1,0000 herauskommen (als
Dez Zahl betrachtet).

von Dirk Dörr (Gast)


Lesenswert?

Mal eine Frage:

Von welchem Typ sind eigentlich Deine Variablen?
(KP,  KD, KIn, KIa usw.)

von Christian Skrypzak (Gast)


Lesenswert?

@Dirk Dörr

unsigned int  seconds,valueH,valueL,status,empfang,P,I,D,PWM;
unsigned long KP,KD,KIn,KIa;
float  Soll,Ist,Diffalt,RegelPWM,RegelAusg;

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.