kämst = kommen würdest...
Code:
'DIMs for PID
Dim Cc As Integer
Dim C_old As Integer
Dim Drive As Bit ' Regulator on ?
Dim Manual_value As Single ' Output if not regulating
Dim Pulse As Word
Dim Pakt As Word
Dim Sp As Single ' Setpoint
Dim Pv As Single ' Process Value
Dim Cv As Single ' PID output
Dim First_execution As Byte ' First start recognition
Dim Initial_error As Single ' Startup difference
Dim Last_pv As Single ' Last PV
Dim Last_sp As Single ' Last SP
Dim Sum_error As Single ' Summed error value
Dim D_pv As Single ' Derrivated delta PV
Dim Error As Single ' Difference between SP and PV
Dim Pterm As Single ' Proportional calculated part
Dim Iterm As Single ' Integrated calculated part
Dim Dterm As Single
'-----------------------
do
alles mögliche und...
Drive = 1
Pulsein Pulse , Pind , 3 , 0 ' time slices
If Pulse = Pakt Then Goto Aa ' nur rechnen bei neuem Wert
Pakt = Pulse
Incr Etappe
If Pakt = 0 Then Pakt = 38000
Pv = Pakt / 111 'Fahrt start
Gosub Regulator
If C_old = Cc Then Goto Aa 'Servo nur bei neuem Wert stellen
Call Servo(4 , Cc)
C_old = Cc
while
'----------------------------------------------
Regulator:
' -----[ Start of PID Regulator]---------------------------------------------
Const Kp = 0.29 ' Proportional factor Eingang x P
Const Ki = .25 ' Integration factor diff + diff x zeit
Const Kd = .65 ' Derivation factor abweichung x zeit
Sp = Speed
' Derivated calculated part
' -----[ Code ]--------------------------------------------------------------
If Drive = 1 Then
' -------- Regulating modus
Error = Sp - Pv
Sum_error = Sum_error + Error
Iterm = Ki * Sum_error ' Integrated CV part
' -------- First time startup
If First_execution < 2 Then
If First_execution = 0 Then
Sum_error = Manual_value / Ki
First_execution = 1
Initial_error = Error
End If
Pterm = 0
Dterm = 0
If Initial_error > 0 And Error < 0 Then
First_execution = 2
Last_pv = Pv
End If
If Initial_error < 0 And Error > 0 Then
First_execution = 2
Last_pv = Pv
End If
Last_sp = Sp
' -------- Normal calculation loop
Else
D_pv = Last_pv - Pv
Last_pv = Pv
Dterm = Kd * D_pv ' Derivated CV part
If Sp = Last_sp Then
' -------- Normal loop when setpoint not changed
Pterm = Kp * Error ' Proportional CV part
' -------- Loop when setpoint changed
Else
Pterm = 0
Dterm = 0
If Sp > Last_sp And Pv > Sp Then
Last_sp = Sp
Last_pv = Pv
End If
If Sp < Last_sp And Pv < Sp Then
Last_sp = Sp
Last_pv = Pv
End If
End If ' Enf of SP change seperation '
End If ' Enf of first time running seperation '
Cv = Pterm + Iterm ' Summing of the tree
Cv = Cv + Dterm ' calculated terms
' -------- Forced modus
Else ' When running in non regulationg modus
Cv = Manual_value ' Set output to predefined value
First_execution = 0 ' restart bumpless
End If
If Cv < -5000 Then Cv = -5000
If 5000 < Cv Then Cv = 5000
Cc = Cv / 100
Cc = Cc * 2
If Backwards = 0 Then
Cc = 128 + Cc
If Cc < 80 Then Cc = 80
If 128 < Cc Then Cc = 128
Else
Cc = 120 - Cc 'bei Rückwärtsfahrt
If Cc < 128 Then Cc = 128
If 170 < Cc Then Cc = 170
End If
'Print "P_akt:" ; Pakt ; " Cv:" ; Cv ; " CC: " ; Cc ; "Car_bearing" ; Car_bearing
Return
Der Code ist angepasst an einen Modellbauregler. Ich habe nur wenige Eingangsimpulse (10 pro Radumdrehung) und nehme daher die Timerzeit zwischen den abfallenden Flanken bei Pulsein Pulse...
Ich hoffe, alle DIMs mitgegeben zu haben. Übrigens stammt der Code auch aus diesem Forum. Ich finde nur die Stelle nicht mehr.
Lesezeichen