-
Temperaturregelung (PWM)
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!
-
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?!?!
-
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!
-
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!?!?!
-
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?
-
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... :-/