Egy PID szabályozót szeretnék építeni de nem tudom hogy jó úton járok-e?
Egy max31855 küldi a vezérlőnek az akt. hőmérsékletet aminek a végén egy J hőelem van.
A pwm kimeneten egy szilárdtest van az kapcsolja a fűtést.
A program most igy néz ki.
Kód: Egész kijelölése
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1024 , Compare A Pwm = Clear Down
Config Portb.0 = Output
Config Portb.1 = Output
Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5
Config Portb.2 = Output
Config Portb.5 = Output
Config Pinb.4 = Input
Sck Alias Portb.5
Cs Alias Portb.2
So Alias Pinb.4
Cs = 1
Sck = 0
Dim Maxdata As Long
Dim Setpoint As Single
Dim Pv As Single
Dim Pvlast As Single
Dim Error As Single
Dim Lasterror As Single
Dim Outp As Single
Dim P As Single
Dim I As Single
Dim D As Single
Dim A2 As Word
Dim A3 As Single
Dim Pwm As Word
Dim Dinput As Single
Dim Lasti As Single
Setpoint = 100
Const Kp = 1.6
Const Ki = 1
Const Kd = 0.4
Enable Interrupts
Enable Timer1
Start Timer1
Do
Doit:
Cs = 0
Shiftin So , Sck , Maxdata , 0 , 32 ', 2
Cs = 1
A2 = Highw(maxdata)
Shift A2 , Right , 4
Pv = A2
A3 = Setpoint * 0.8
If Pv => A3 Then Gosub Pid
If Pv < A3 Then Gosub Felez
Pwm1a = Pwm
Print "pwm" ; Outp
Print ; Pv
'Waitms 50
Loop
End
Pid:
Error = Setpoint - Pv
'-----------------p-------------
P = Kp * Error
'-----------------i-------------
I = Ki + Lasti
I = I * Error
'-----------------d--------------
Dinput = Error - Lasterror
D = Kd * 0.01
D = D * Dinput
'----------------pid-------------
Outp = P + I
Outp = Outp + D
If Outp < 0 Then Outp = 0
If Outp > 1000 Then Outp = 1000
Outp = Round(outp)
Pwm = Outp
Lasti = I
Lasterror = Error
Return
Felez:
Pwm = 500
Return
