erstmal herzlichen Dank für die Antworten.

mein Fehler war selbsgemacht, der Teil, der den Initialisierungswert für den I-Anteil ausrechnet wurde immer durchgeführt, nicht nur ausserhalb der Schwelle wo der Regler arbeiten soll.

Dies hab ich nun geändert und die Initialisierung für "beide" Regler mit reingenommen und nun gehts.

die Funktion schaut nun so aus:

Code:
Function Pid_regler(byval _text As String) As Byte
Local _y As Single , _x As Single , _e As Single , _pid As Single , _pwm As Byte
Local _kp As Single , _ki As Single , _kd As Single
Local _proportionalteil As Single , _integralteil As Single , _differentialteil As Single
Local _esum As Single , _ealt As Single
Local _betrag_e As Word
Local _schwelle As Word
Local _pwm_max As Byte
Local _p_typ As Byte
Local _t_typ As Word
Local _m As Single , _n As Single
Const _ta = 1                                               'Abtastintervall

   Select Case _text
      Case "L":
                    Sreg.7 = 0
                    _pwm = Ocr1a
                    _y = T_ist_luft
                    Sreg.7 = 1
                    _x = Prog_temperatur_luft
                    _kp = Kp_l
                    _ki = Ki_l
                    _kd = Kd_l
                    _esum = Esum_luft
                    _ealt = Ealt_luft
                    _schwelle = Schwelle_l
                    _pwm_max = P_l_ueberw

                    _p_typ = P_l_typ                        'typische Heizleistung bezogen auf
                    _t_typ = T_l_typ                        'typische Lufttemperatur


      Case "K":
                    Sreg.7 = 0
                    _pwm = Ocr1b
                    _y = T_ist_kondensat
                    Sreg.7 = 1
                    _x = Prog_temperatur_kondensat
                    _kp = Kp_k
                    _ki = Ki_k
                    _kd = Kd_k
                    _esum = Esum_kondensat
                    _ealt = Ealt_kondensat
                    _schwelle = Schwelle_k
                    _pwm_max = P_k_hzg_max

                    _p_typ = P_k_typ                        'typische Heizleistung bezogen auf
                    _t_typ = T_k_typ                        'typische Kondensattemperatur


   End Select

   _e = _x - _y                                             'Regelfehler
   _betrag_e = Abs(_e)

   If _betrag_e > _schwelle Then
         Help_single = _t_typ - 2000                        'delta T
         _m = _p_typ / Help_single                          'Anstieg Heizsteuerung

         Help_single = _m * _t_typ
         _n = _p_typ - Help_single                          'Abschnitt Heizsteuerung

         _integralteil = _m * _x
         _integralteil = _integralteil + _n

         If _integralteil < 0 Then _integralteil = 0
         _esum = _integralteil / _ki                        'Vorgabe I-Anteil

         If _e > 0 Then _pwm = 255 Else _pwm = 0            'Vollaussteuerung

      Else

         If _pwm > 0 And _pwm < _pwm_max Then _esum = _esum + _e

         _proportionalteil = _kp * _e                       'Proportionalteil berechnen

         _integralteil = _ki * _ta                          'Integralteil berechnen
         _integralteil = _integralteil * _esum

         _differentialteil = _e - _ealt                     'Differentialglied berechnen
         _differentialteil = _differentialteil * _kd
         _differentialteil = _differentialteil / _ta

         _pid = _proportionalteil + _integralteil           'Alle Glieder zusammenfassen
         _pid = _pid + _differentialteil

         _ealt = _e

         If _pid <= 255 And _pid >= 0 Then
              _pid = Round(_pid)
              _pwm = _pid
            Else
              If _pid > 255 Then _pwm = 255 Else _pwm = 0
         End If
   End If

   Select Case _text
      Case "L":
                  Esum_luft = _esum
                  Ealt_luft = _ealt
      Case "K":
                  Esum_kondensat = _esum
                  Ealt_kondensat = _ealt
   End Select
   Pid_regler = _pwm
End Function
das Subtrahieren bei Integralteil kommt aus der Kennlinie.
Ich möchte ja erst bei einer Solltemperatur über 20°C losheizen - also geht die Heizleistungskurve nicht durch Null, sondern hat einen Achsenabschnitt.


Gruß BoGe-Ro