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.