Ich hab nen Tiny2313 mit zwei Temperatursensoren in meinem Rechner die Lüfter regeln, dort arbeitet ein modifizierter Integrator.
Die Abweichung/der integrierte/addierte Wert ist dabei auf eine kleine Konstante fixiert, ferner wird die Regelung nur relativ langsam durchgeführt, da der Regelkreis recht träge ist.
Ab einer Abweichung vom Zielwert über/unter eine gewisse Grenze wird die Regelgröße in die entsprechende Gegenrichtung verändert.
Im folgenden Mal der "Kern" der Regelung:
Code:
int16_t target_temp_low_offset; // Zwischen Null und diesem Wert wird die Leistung heruntergeregelt
int16_6 target_temp_high_offset; // Definiert die Breite des "neutralen" Bereichs zwischen TARGET_TEMP_LOW_OFFSET und diesem Wert
uint16_t temp1_value; // Temperatur 1 bzw. Messwert
uint16_t temp2_value; // Temperatur 2 bzw. Zieltemperatur
uint8_t integrator; // Die Integrationsvariable
void doSpeedControl(void) {
int16_t delta = temp1_value - temp2_value + target_temp_low_offset;
if (delta > 0) {
delta += target_temp_high_offset;
if (delta > 0) {
if (integrator != 0xFF) {
integrator++;
}
}
} else {
asm volatile (
"subi %[integrator], 0x01" "\n\t"
"brcc end_%=" "\n\t"
"ldi %[integrator], 0x00" "\n\t"
"end_%=:"
: /* Output */
[integrator] "+d" (integrator)
);
}
setFanSpeed(integrator);
}
Meine Regelung arbeitet auf eine Zieldifferenz zwischen den beiden Werten temp1_value und temp2_value hin. Um das ganze zu einer normalen Temperaturregelung zu adaptieren, musst du temp2_value als Zielwert und temp1_value als Messwert verwenden.
Zu den beiden Offset-Variablen:
target_temp_low_offset ist typischerweise kleiner als Null und bestimmt die Schwelle, ab der die Regelung die Regelvariable reduzieren soll.
target_temp_high_offset ist typischerweise größer als Null und bestimmt die Schwelle, ab der die Regelung die Regelvariable erhöhen soll.
Damit ergibt sich folgendes Bild:
-- ] temp2_value + target_temp_low_offset | temp2_value | temp2_value + target_temp_high_offset [ ++
Außerhalb des Bereichs rund um temp2_value wird die Regelvariable angepasst, innerhalb wird sie nicht verändert.
Die Regelgeschwindigkeit kann über die Aufruffrequenz beeinflusst werden, ist sie zu hoch, fährt der Ausgangswert Achterbahn.
mfG
Markus
Edit: Ich rufe bei meiner Steuerung die Funktion ungefähr alle 20 Sekunden einmal auf ...
Lesezeichen