在线时间691 小时
UID150556
注册时间2018-5-11
NXP金币3003

TA的每日心情 | 慵懒 昨天 21:22 |
|---|
签到天数: 1835 天 连续签到: 25 天 [LV.Master]伴坛终老
版主
  
- 积分
- 13666

- 最后登录
- 2026-4-12
|
发表于 2025-12-17 14:27:48
|
显示全部楼层
int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
{
int32_t P,I,D;
int32_t error;
// 1. 计算当前误差:error = 目标值 - 当前值
if (sign == 1)
error = setpoint + current_value_16x;
else
error = setpoint - current_value_16x;
// 2. 计算比例项(放大SCALE倍)
P = pid.Kp * error;
// 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
pid.integral += pid.Ki * error;
if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
I = pid.integral;
// 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
D = pid.Kd * (error - pid.prev_error);
pid.prev_error = error; // 更新上一次误差
// 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
int32_t total = (P + I + D) >> 10;
if (total > pid.output_max) return pid.output_max;
else if (total < pid.output_min) return pid.output_min;
else return (int16_t)total;
} |
|