代码示例框架
- // 定义PID参数和变量
- float Kp = 10.0; // 比例系数 - 需调整
- float Ki = 0.05; // 积分系数 - 需调整
- float Kd = 2.0; // 微分系数 - 需调整
- float dt = 1.0; // 采样时间 (秒) - 需调整
- float setpoint = 45.0; // 目标水温 (°C)
- float prev_error = 0.0;
- float integral = 0.0;
- float max_integral = 100.0; // 积分限幅值 - 需调整
- float min_integral = -100.0; // 积分限幅值 - 需调整
- // 主循环 (由定时器中断触发,间隔 dt 秒)
- void controlLoop() {
- // 1. 读取当前温度 PV
- float pv = readTemperatureSensor(); // 实现此函数
- // 2. 计算误差
- float error = setpoint - pv;
- // 3. 计算积分项 (带限幅)
- integral += error * dt;
- // 抗积分饱和 - 方法1: 积分限幅
- if (integral > max_integral) integral = max_integral;
- if (integral < min_integral) integral = min_integral;
- // 可选:方法2 - 积分分离 (当|error|很大时,integral保持不变)
- // 4. 计算微分项 (近似)
- float derivative = (error - prev_error) / dt;
- prev_error = error; // 保存本次误差用于下次微分
- // 5. 计算PID输出
- float output = Kp * error + Ki * integral + Kd * derivative;
- // 6. 输出限幅 (0 - 100)
- float duty_cycle = output;
- if (duty_cycle > 100.0) duty_cycle = 100.0;
- if (duty_cycle < 0.0) duty_cycle = 0.0;
- // 7. 设置PWM占空比 (假设有 setPWM(duty) 函数)
- setPWM(duty_cycle); // 实现此函数,将duty_cycle(0-100)映射到实际的PWM寄存器值
- // (可选:更高级的抗饱和 - 回算法,当输出饱和时修正integral)
- }
开始实施建议:
搭建好硬件(传感器、控制器、SSR、加热器、电源)。
实现基本的数据读取(PV)和PWM输出功能。
先实现简单的P控制(Ki=0, Kd=0)。调整Kp,观察系统响应(上升速度、是否有稳态误差、是否震荡)。
加入积分控制I(Ki > 0)。务必同时加入积分限幅(max_integral, min_integral)。调整Ki消除稳态误差,注意观察是否会引入超调和震荡。
如果需要抑制超调或增加稳定性,再加入微分控制D(Kd > 0)。调整Kd,注意传感器噪声会被放大,可能需要滤波。
在整个过程中,密切关注安全保护机制!
|