import time
import serial
from gpiozero import PWMLED
import matplotlib.pyplot as plt
import modbus_tk.modbus_rtu as modbus_rtu
class Pid:
def __init__(self, exp_val, kp, ki, kd):
self.KP = kp
self.KI = ki
self.KD = kd
self.exp_val = exp_val
self.now_val = 0
self.sum_err = 0
self.now_err = 0
self.last_err = 0
def cmd_pid(self, now_err):
self.last_err = self.now_err
self.now_err = self.exp_val - now_err # self.exp_val - self.now_val
self.sum_err += self.now_err
self.now_val = self.KP * self.now_err \
+ self.KI * self.sum_err + self.KD * (self.now_err - self.last_err)
return self.now_val
#在这里设置温度
set = 120
kp = 20
ki = 50
kd = 8
if __name__ == '__main__':
pid_val = []
ser = serial.Serial("/dev/serial0", 9600, 8, 'N', 1)
master = modbus_rtu.RtuMaster(ser)
master.set_timeout(1.0)
result = 0
pwm_out = PWMLED(21)
pwm_out.frequency = 50
while True:
time.sleep(0.1)
try:
result = master.execute(1, 0x03, 0X1000, 1)
my_Pid = Pid(set, kp, ki, kd)
Temp = result[0] / 10
pid_val.append(Temp)
out = my_Pid.cmd_pid(Temp)
if out > 300:
out = 1
elif out < 0:
out = 0
else:
out = round(out / 300, 2)
print(str(out*100)+"%,"+str(Temp))
pwm_out.value = out
except:
print("失败")
plt.plot(pid_val)
plt.show()
pwm_out.close()
exit()
树莓派5+RS485+固态继电器实现PID温控
于 2024-01-24 16:29:03 首次发布