PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperaturregelung (PWM)



GMB
25.03.2006, 09:06
Hallo zusammen!!

Habe folgendes Problem:

Möchte eine Temperaturregelung implementieren, bei der der angeschlossene Lüfter über PWM gesteuert wird. "Manuell" den Lüfter über PWM zu steuern funktioniert auch einwandfrei (habe schon "ausgelotet", welche Frequenz und welche minimal Pulsbreite möglich ist,etc. also alles schon OK), auch habe ich eine Temperaturmessung schon "integriert", zudem habe ich auch Grundkenntnisse der Regelungstechnik.

Habe mich jetzt mal an den Artikel hier auf Robotornetz gehalten, und erstmal ein kleines Programm geschrieben zur "Simulation":

Hier mal das Programm soweit:

$regfile = "m8def.dat"
$crystal = 3686400

Config Pinb.1 = Output
Config Pinb.2 = Output
Dim Esum As Single
Dim E As Single
Dim Kp As Single
Dim Ki As Single
Dim Ta As Single
Dim X As Word
Dim Y As Single
Dim Z As Single
Dim W As Single

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Internal
Do

W = -25 'Sollwert = -25°
Kp = 18 'Aus Beitrag übernommen
Ki = 60 'Aus Beitrag übernommen
Ta = 0.01 ' Aus Beitrag übernommen
X = Getadc(0) 'Istwert Einlesen
E = W - X 'Vergleich (Regelabweichung)
Esum = Esum + E 'Integration I-Anteil
If Esum < -400 Then
Esum = -400
End If 'Begrenzung I -anteil
If Esum > 400 Then
Esum = 400
End If
Y = Kp * E
Z = 0.6 * Esum
Y = Y + Z
'Reglergleichung
If Y < 0 Then
Y = 0 'Begrenzung Stellgröße
End If
If Y > 255 Then
Y = 255
End If

Pwm1a = Y 'Einfach mal so "fiktiv" gesetzt

Cls
Upperline
Lcd "Y: " ; Y ; "X: " ; X 'Displayausgabe der Werte zur Kontrolle
Lowerline
Lcd "E: " ; E

Loop



So, wenn ich jetzt mal am ADC0 "drehe", bleibt Y immer auf Null!!

Woran liegt das?!?!

Wie kann ich sonst noch die Regelung einbauen?!?!

Ich denke ein PI-Regler sollte reichen, jedoch ist mir nicht ganz klar wie ich ihn noch aufbauen kann mit einem Mikrocontroller..

Danke schonmal für eure Hilfe!

GMB
25.03.2006, 09:13
Ich glaube ich hab meinen Fehler gerade selber gefunden...der Sollwert ist ja kleiner als das was der ADC überhaupt liefern kann, ich darf da ja auch nicht irgendeinen "Temperaturwert" als Sollwert nehmen, sondern den Wert am ADC auf den ich geregelt haben möchte, richtig?!?!

Also wenn mein Temperatursensor mit bei -25°C z.B. eine Spannung von 2.5Volt liefer, ist der ADC-Wert ja 512...

Richtig?!?!

lanic
25.03.2006, 09:20
um deine letzte frage zu beantworten richtig!

und so
Config Adc = Single , Prescaler = Auto , Reference = Avcc

ist dann bei 5 Volt = 512......

aber die haupt sache ist ja es geht! dann werde ich mich in dein prog auch nicht mehr reind enken!

GMB
25.03.2006, 10:06
Ja, genau, war ja auch nur als Beispiel die "512", also halt der "Rohwert" des ADC, weil ich im Programm bislang immer das schon direkt in eine Temperatur umgerechnet hatte...muss man dann aufpassen... ;-)

Was mich nur wundert: ich hab Referenz-Spannung = intern gesetzt, und habe bei 0 Volt am ADC auch eine "Null", bei +5V (also das was Versorgungsspannun gist) habe ich dann 1023, also bei +2.5Volt dann ~512, richtig!?!?!

lanic
25.03.2006, 10:15
ich verste das gerade nicht!

also

Reference = Avcc
1023 = 5V
512 = 2,5V

Reference = intern
1023 = 2,5V
512 = 1,25V

ist es das was du meinst?

GMB
25.03.2006, 10:37
Mmmmh...ich habe doch Reference = intern, und habe bei +5V auch die 1023, und bei 2.5V die 512, und bei 0 V die 0!

Habe ich ja selber gemessen und getestet!?!

Also dann stimmt da wohl was nicht, oder?!?!

Habe zwar an Avcc am mega8 auch die +5V dran, aber inwiefern das jetzt das ganze beeinflusst weiß ich nicht... :-/