闭环控制系统
PID算法
增量式PID
E(t) = 设定值-t时刻采样值
增量d计算公式
- d = KP*[E(t)-E(t-1)]+KI*E(t)+KD*[E(t)-2E(t-1)+E(t-2)]
micropython程序实现
参考2011年电子设计大赛 风板控制系统(F题)
角度检测采用精密导电塑料电位器
使用microbit作为主控系统,仅用做PID程序测试。
1、风板垂直时,ADC采样值为730.
2、例程中设置目标值为760,约25~30度
程序实现:
# 在这里写上你的代码 :-)
from microbit import *
class PID_Inc:
"""增量式PID"""
def __init__(self, KP=1, KI=1, KD=0.5):
self.Kp = KP
self.Ki = KI
self.Kd = KD
self.PreError = 0
self.PreDerror = 0
self.error = 0
self.d_drror = 0
self.dd_error = 0
self.dcalc = 0
def setKp(self,KP):
self.Kp=KP
def setKi(self,KI):
self.Ki=KI
def setKd(self,KD):
self.Kd=KD
def update(self, Target, Current):
self.error = Target - Current
self.d_error = self.error - self.PreError
self.dd_error = self.d_error - self.PreDerror
self.PreError = self.error
self.PreDerror = self.d_error
self.dcalc = (
self.Kp * self.d_error + self.Ki * self.error + self.Kd * self.dd_error
)
return self.dcalc
if __name__ == "__main__":
pid = PID_Inc()
pwm = 0
adc_set = 770
while True:
if button_a.was_pressed():
while True:
sample = pin0.read_analog()
d = pid.update(adc_set, sample)
pwm = int(pwm + d)
if pwm > 1023:
pwm = 1023
if pwm < 0:
pwm = 0
pin1.write_analog(int(pwm))
print("{},{},{}".format(adc_set, sample, pwm))
sleep(100)
打印函数主要用于SerialPlot软件绘制曲线观察。
适当调整kp ki kd的值,可以实现系统稳定。