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 ...