Hallo zusammen,
ich möchte in C eine Regelsoftware schreiben die anhand eines
eingelesenen Temperaturwertes ein PWM zur Regelung eines Lüfters
erzeugt. Ich habe bisher in meinem Quellcode leider keine Hysterese
sondern eine harte Regelung:
if (AD_value <80) {CCPR1L = 64;} // 25% PWM unter
40°C
if (AD_value >=80) {CCPR1L = 64;} // 40°C --> 25% PWM
if (AD_value >=128) {CCPR1L = 128;} // 50°C --> 50% PWM
if (AD_value >=153) {CCPR1L = 192;} // 60°C --> 75%
PWM
if (AD_value >=179) {CCPR1L = 255;} // 70°C --> 100%
PWM
if (AD_value >=192) {CCPR1L = 255; LED_Temp_Error = 1;}
// 75°C --> Overheating
if (AD_value <192) {LED_Temp_Error = 0;} // Kein
Fehler festgestellt
Wie kann ich das ganze jetzt so umprogrammieren das ich eine Hysterese
erstelle die ich sag mal bei -5Kelvin unter vorherigem Wert
runterregelt?
Würde mich sehr über eine Anregung freuen, werde da nicht so recht
schlau draus
1 | if (AD_value <80) {CCPR1L = 64;} // 25% PWM unter |
2 | 40°C |
3 | if (AD_value >=80) {CCPR1L = 64;} // 40°C --> 25% PWM |
4 | if (AD_value >=128) {CCPR1L = 128;} // 50°C --> 50% PWM |
kannst du eigentlich auch einfacher machen:
1 | CCPR1L = 64; // 25% PWM unter 50° |
2 | if (AD_value >=128) {CCPR1L = 128;} // 50°C --> 50% PWM |
Hysterese: Aus deinen Programmwerten ergibt sich, dass dein Sensor ca. 3,2 ADC Schritte pro Kelvin ergibt (ist wohl auch einigermaßen linear), 5K wären also ziemlich genau 16 ADC Werte. Die PWM müsstest du eigentlich auch nicht in Stufen regeln, sondern die kann sich ja sanft anpassen. PWM / ADC ist in deinem obigen Code auch etwa im Verhältnis 2:1 mit einem Offset von -96 Vorschlag:
1 | int calculate_pwm(int AD_value) |
2 | {
|
3 | int pwm_value; |
4 | |
5 | pwm_value = 2 * AD_value - 96; |
6 | |
7 | if (pwm_value < 64) |
8 | pwm_value = 64; // minimum |
9 | |
10 | if (pwm_value > 255) |
11 | pwm_value = 255; // maximum |
12 | |
13 | return(pwm_value); |
14 | }
|
15 | |
16 | (...)
|
17 | |
18 | int hyst = 16; |
19 | int AD_value; |
20 | |
21 | while (1) |
22 | {
|
23 | AD_value = get_adc_value(); |
24 | |
25 | if ( (AD_value >= AD_value_buf + hyst) || |
26 | (AD_value <= AD_value_buf - hyst) ) |
27 | {
|
28 | CCPR1L = calculate_pwm(AD_value); |
29 | |
30 | if (AD_value >=192) |
31 | LED_Temp_Error = 1; |
32 | else
|
33 | LED_Temp_Error = 0; |
34 | |
35 | AD_value_buf = AD_value; |
36 | }
|
37 | |
38 | (...)
|
39 | |
40 | }
|
AD_value_buf solltest du natürlich noch initialisieren, z.B mit 0.
Danke Easylife, ich habe deinen Vorschlag angenommen und eine lineare Regelung gebaut. Klappt alles wundervoll Danke schön!
Könntest auch den PID alg. Aus der Sammlung benutzen
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.
