树莓派5+RS485+固态继电器实现PID温控

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()

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值