Hallo Ich soll einen Temperaturregler aufbauen. Die Genauigkeit der Temperaturmessung soll mindestens 0,1 Grad sein. Deswegen verwende ich einen PT1000 mit einem Konstantstrom von 1mA, den ich mit einem 24 Bit AD-Wandler auswerte. Als Stellgröße verwende ich ein PWM Signal mit dem ich eine Heizfolie betreibe. Da ich einen ATmega16 verwende und der 16 Bit Timer belegt ist bleibt mir nur noch ein 8 Bit Timer. Als Regelalgorithmus habe ich den Software PI Regler aus www.roboternetz.de verwendet. e = w - x; //Vergleich esum = esum + e; //Integration I-Anteil if (esum < -400) {esum = -400;} //Begrenzung I-Anteil if (esum > 400) {esum = 400;} y = Kp*e + Ki*Ta*esum; //Reglergleichung if (y < 0) {y = 0;} //Begrenzung Stellgröße if (y > 255) {y = 255;} PWM = y; So und das ist jetzt auch mein Problem ich habe eine Regelgröße mit 24 Bit und einen Stellgröße mit 8 Bit Auflösung. Wie kann ich die Regelgröße y an die Stellgröße PWM anpassen? Die Werte für Y sind sehr groß und durch die Begrenzung auf 255 entsteht kein befriedigendes Regelverhalten. vielen Dank für eure Hilfe
Hi, Du bist doch bei den AVR`s nicht auf die 8 Bit beschränkt. Nimm ein register mehr und du hast 16 Bit verarbeitung.. noch eins mehr und du hast 24 Bit.. usw... Die beschränkung liegt lediglich darin dass diese 8 bit Prozessoren 16... 32 ...64...bit operationen nicht mit einem Takt erledigen können...
>if (y < 0) {y = 0;} //Begrenzung Stellgröße >if (y > 255) {y = 255;} >PWM = y; Das ist zu einfach gestrickt, das gibt ja fast nur einen 2-Punkt-Regler? Das Stichwort heißt hier nicht Begrenzung, sondern Skalierung. Wie groß wird denn dein y? Welcher Skalierungsfaktor ist zwischen y und den Grenzen der 8-Bit-PWM? BTW: >PT1000 >Konstantstrom von 1mA Du machst dir selbst deine Messung ungenau. Stichwort Eigenerwärmung.
Hallo lkmiller ja so etwas in der art habe ich mir auch vorgestellt, aber in welchem Verhältnis skaliere ich? es muss ja schon mit dem Verhältnis 24/8 zutun haben, da mein y ja auch von der Regeldifferents abhängt. Eigenerwärmungs Effekte sollten minimal sein, das der PT1000 auf einem Kupferblock montiert ist, und die wärme direckt abgeleitet wird.
Hallo Andy ich wusste nicht das das möglich ist. und habe im Datenbaltt auch nichts gefunden. Der Timer0 hat doch nur das OCR0 Compare Register.
1 | e = w - x; //Vergleich |
2 | esum = esum + e; //Integration I-Anteil |
3 | if (esum < -400) {esum = -400;} //Begrenzung I-Anteil |
4 | if (esum > 400) {esum = 400;} |
5 | y = Kp*e + Ki*Ta*esum; //Reglergleichung |
Was hast du denn für Wertebereiche? e, w, x, y, esum, Kp, Ki, Ta sind char, short, long, float, double? Also: Wie groß wird dein y? Diese Frage musst du beantworten. Erst dann kannst du skalieren.
Hallo Ilkmiller Die Variablen e,x,w und esum sind Variablen von typ long. Kp, Ki und Ta sind floats. Daher muss Y dann auch ein float sein. wie groß mein Y ist weiß ich gerade leider nicht, da ich den aufbau leider gerade nicht vor mir habe. aber wie würde es denn funktionieren wenn ich den wert habe. vielen dank für deine hilfe
Hi, PWM ist nicht auf die Timer beschränkt, sondern lässt sich auch per software an jedem I/O Pin des AVR ausgeben. PWM per Timer hat nur den Vorteil, dass sie schneller ist, da sie zum grössten Teil per Hardware, unabhängig vom restlichen Programm erzeugt wird und den eigentlichen Programmablauf nicht beeinträchtigt.
@ Karl Kunze (lekai) >Ich soll einen Temperaturregler aufbauen. Die Genauigkeit der >Temperaturmessung soll mindestens 0,1 Grad sein. Deswegen verwende ich Wirklich? Oder meinst du nur die Auflösung von 0,1K? Aufloesung und Genauigkeit >einen PT1000 mit einem Konstantstrom von 1mA, den ich mit einem 24 Bit >AD-Wandler auswerte. Noebel geht die Welt zu GRunde. Wozu wird diese Temperaturmessung gebraucht? >So und das ist jetzt auch mein Problem ich habe eine Regelgröße mit 24 >Bit und einen Stellgröße mit 8 Bit Auflösung. >Wie kann ich die Regelgröße y an die Stellgröße PWM anpassen? Einfach divivdieren bzw. rechtschschieben? Womit aber bisweilen der Sinn der Regelung mit 24Bit ein wenig in Frage gestellt wird. MFG Falk
Lass doch den Regler mal ganz ohne I-Anteil rennen (Ki=0). Regelt der überhaupt noch? Welchen Wertebereich (min. Temp. bis max. temp.) hat dein Soll- und Ist-Wert? Was macht deine Heizfolie mit PWM=0 und PWM=255? Annahme: PWM=0 --> kalt PWM=255 --> heiß Mehr als ausschalten kannst du nicht --> Wenn y<=0 --> PWM = aus wenn y> 0 --> PWM = y*255/maxy // das ist die Skalierung auf maxy Ein Dreisatz: wenn y=maxy ist, dann ist die PWM=255 (voll heizen) wenn y<=0 ist, dann ist die PWM=0 (aus)
Ok ich habe verstanden das ich die Stellgröße y skalieren muss, aber verändere ich da nicht mein Verstärkungsfaktor?
Sage mal, du musst doch irgendein regelungstechnisches Ersatzschaltbild haben, welches du realisieren willst? Oder prgorammierst du einfach drauf los? >Ok ich habe verstanden das ich die Stellgröße y skalieren muss, aber >verändere ich da nicht mein Verstärkungsfaktor? Ja.
@ ikmiller Ok das habe ich verstanden, alles klar. Aus meiner maximal anzunehmenden Regeldifferenz errechne ich mein ymax. Und das skaliere ich dann auf 255. vielen Dank.
@lippy Was verstehst du unter regelungstechnisches Ersatzschaltbild? eine Operationsverstärkerschaltung? Ich möchte direkt einen software PI Regler realisieren und habe ihn mit den Einstellregeln nach Takahshi "berechnet". Zur Identifikation der Regelstrecke habe ich eine Sprungantwort aufgenommen.
@ Karl Kunze (lekai)
>Was verstehst du unter regelungstechnisches Ersatzschaltbild?
Ein Blockschaltbild, wo der P/D/I Anteil als Block dargestellt sind, das
Stellgleid sowie die Regelstrecke, Differenzierpunkt (Subtrahierer),
idealerweise incl. Zeitkonstanten und Formel für jeden Block.
MFG
Falk
Ich hab mal eins gemalt. Und alle Informationen aus deinem Post eingetragen, die ich entnehmen konnte. Hier kannst du erstmal dran rum rechnen und sehen, was du wo für Variablen und Wertebereiche brauchst, usw... Sowas bracust du zuerst, natürlcih komplett ausgefüllt und berechnet. (Evtl sogar simuliert). Erst danach macht es doch Sinn, etwas (also das) zu programmieren. Oder bevorzugst du den Entwicklungsalgorithmus TryAndError ?
OK Eine Sprungantwort habe ich aufgenommen. Es ist ein PT1, mit einer Totzeit Tt=5 s. und Ts=725 s. Bei dem Ks bin ich mir nicht ganz sicher. Meine Sprung verläuft von 23,5 bis 35,6 Grad Celsius und die Stellgröße springt von 20 auf 115. Ks=Istwertänderung/Stellgrößenänderung Für die Istwertänderung habe ich die Spannungsänderung von 23,5 auf 35,6 genommen. also U(23,5)=1,0915 V und U(35,6)=1,1384 V das macht klägliche 0,047 V. Und für die Stellgrößenänderung habe ich den Spannungsmittelwert durch das PWM Signal berechnet. Die Heizfolien hat 13,8 Ohm und wird mit 12 V betrieben. Also macht das PWM=20 => 0,94 V und PWM=115 => 5,41. macht 4,47 V. Für Ks ergibt sich dann 0,01. Das ist gefühlt sehr wenig. Ist das so richtig? Es kommt mir sehr klein vor. vielen dank für eure geduld
>Es ist ein PT1, mit einer Totzeit Tt=5 s. und Ts=725 s. Ein PT1 hat keine Totzeit. Wie hast du die Totzeit festgestellt? >das macht klägliche 0,047 V. Wenn dann 0,047V/12,1K = 3,88mV/K. >indestens 0,1 Grad sein. Bist du sicher, dass du 388µV messen kannst? Also nicht nur 5V/2^24=300nV, sondern auch die Leiterbahnführung, Schaltungsmannse...? >Die Heizfolien hat 13,8 W ... >PWM=20 => 0,94 V und PWM=115 => 5,41. Heizt du mit Spannung deine Strecke auf, oder mit Watt (=U*I) =>Annahme Ohmsch: P = Ueff²/R = P0*WURZEL(d) P = 13,8W * (duty/256)² duty=[0..255] >23,5 bis 35,6 Grad Celsius >Spannungsänderung von 23,5 auf 35,6 genommen. ??? Was ist denn das für ein Teil, was du dort erwärmst? Wie ist der Sensor angebracht?
> Ein PT1 hat keine Totzeit. Ok es ist ein PT2 mit Totzeit Tt und Zeitkonstante Ts. Ich habe die Sprungantwort mit dem verwendeten PT1000 und AD-Wandler aufgenommen. Einmal pro sekunde habe ich dann über Uart einen Wert geschickt. Aus dem enstandenen Datensatz kann ich die Totzeit ablesen. also die Zeit von Sprungbeginn bis zur ersten Temperatur Änderung. Zum Aufbau: Es wird eine Kupferschiene geheizt. Auf der Kupferschiene ist die Heizfolien ( 13,8 Ohm 12V ) aufgeklebt. Der Temperatursensor ist direkt neben der Heizfolie auf das Kupfer geklebt, und ist über 4 leitertechnik an dem AD Wandler angeschlossen. Ich kann 388µV messen das geht! >das macht klägliche 0,047 V. >>Wenn dann 0,047V/12,1K = 3,88mV/K. Ich heize mit P ( ich hatte mich verschrieben es sind 13,8 Ohm ), da hast du natürlich recht. Mein Gedanke dabei war - da ich ja einen Faktor haben will müssen sich ja auch die Einheiten wegkürzen. Wie kann ich denn nun das Ks berechnen??
Aaaaahhhhh, schmeiss Float in die Tonne. Das bringt nichts. Mach die Rechnung in 32bit signed, dh longinteger. Und am Schluss runterskalieren, zb nur das hoechstwertige byte verwenden. Musst dir die Zwischenergebnisse mal ausgeben lassen und dass etwas kreativ sein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.