kämst = kommen würdest...
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...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
Ich hoffe, alle DIMs mitgegeben zu haben. Übrigens stammt der Code auch aus diesem Forum. Ich finde nur die Stelle nicht mehr.






Zitieren

Lesezeichen