"""
在上面的代码中,我们首先定义了PID控制器的参数,包括比例系数kp、积分系数ki、微分系数kd、采样时间dt以及输出范围pid_min和pid_max。
接着初始化了一个GPIO和PWM对象,用于控制电热丝。
然后创建了一个ADC对象,用于读取热敏电阻的阻值。
接着定义了一个PIDController类,用于实现PID控制器的逻辑。
在控制循环中,我们设置了一个目标温度setpoint,并不断读取当前温度并计算PID输出,然后通过PWM信号控制电热丝的加热功率。
最后,我们输出调试信息并等待一段时间。
需要注意的是,由于PID控制器的运算需要一定的时间,因此控制循环的采样时间dt应该足够短,一般为几百毫秒到几秒之间。
"""
from machine import Pin, PWM, ADC
import time
import math
# PID参数
kp = 2.0
ki = 0.1
kd = 0.1
dt = 0.1
pid_min = 0
pid_max = 100
# 热敏电阻参数
R0 = 10000
T0 = 298.15
B = 3950
# 初始化GPIO和PWM
heater_pin = Pin(5, Pin.OUT)
heater_pwm = PWM(heater_pin, freq=1000, duty=0)
# 初始化ADC
adc = ADC(Pin(17))
adc.atten(ADC.ATTN_11DB)
# 定义PID控制器
class PIDController:
def __init__(self, kp, ki, kd, dt, pid_min, pid_max):
self.kp = kp
self.ki = ki
self.kd = kd
self.dt = dt
self.pid_min = pid_min
self.pid_max = pid_max
self.last_error = None
self.integral = 0.0
def update(self, setpoint, feedback):
error = setpoint - feedback
if self.last_error is None:
self.last_error = error
self.integral += error * self.dt
derivative = (error - self.last_error) / self.dt
output = self.kp * error + self.ki * self.integral + self.kd * derivative
output = max(min(output, self.pid_max), self.pid_min)
self.last_error = error
return output
# 创建PID控制器
pid = PIDController(kp, ki, kd, dt, pid_min, pid_max)
# 控制温度
setpoint = 60.0
def test(setpoint,temperature):
while 1:
output = pid.update(setpoint, temperature)
pwm=int(output /100 * 1023)
print(pwm)
time.sleep(0.2)
def main():
while True:
# 读取温度
adc_value = adc.read()
voltage = adc_value / 4095 * 3.3
resistance = (3.3 - voltage) * R0 / voltage
temperature = 1 / (1/T0 + B*math.log(resistance/R0)) - 273.15
# 如果温度超过设定值,则不输出PWM控制电热丝
if temperature >= setpoint:
heater_pwm.duty(0)
else:
# 计算PID输出
output = pid.update(setpoint, temperature)
# 控制电热丝
heater_pwm.duty(int(output / 100 * 1023))
# 输出调试信息
print("Temperature: {:.1f}°C, Output: {:.1f}".format(temperature, output if temperature < setpoint else 0))
# 等待一段时间
time.sleep(dt)