文章目录
- 1、理想PID(Ideal PID)
- 2、并行PID(Parallel PID)
- 3、算法实现与验证
- 3.1 理想PID验证
- 3.2 并行PID验证
1、理想PID(Ideal PID)
理想PID的C语言实现
// 定义PID控制器结构体
typedef struct {double Kvp; // 比例增益double Kvi; // 积分增益double Kvd; // 微分增益double Ts; // 采样周期double integral; // 积分累计值double prev_error; // 上一次误差double output_max; // 输出上限double output_min; // 输出下限
} SeriesPID;// 串联PID控制器更新函数
double pid(SeriesPID *pid, double setpoint, double measurement) {double error = setpoint - measurement; // 计算误差// 临时积分项,乘以 Kvidouble integral_temp = pid->integral + error * pid->Ts;// 微分项计算,乘以 Kvddouble derivative = (error - pid->prev_error) / pid->Ts;// 计算控制器输出(暂时不更新积分项)double output_temp = pid->Kvp * error +pid->Kvp * pid->Kvi*integral_temp +pid->Kvp * pid->Kvd *derivative;// 检查输出是否超出限制if (output_temp > pid->output_max) {output_temp = pid->output_max;} else if (output_temp < pid->output_min) {output_temp = pid->output_min;} else {// 如果输出未饱和,则更新积分项pid->integral = integral_temp;}// 保存当前误差用于下一次计算微分项pid->prev_error = error;return output_temp;
}
2、并行PID(Parallel PID)
并行PID的C语言实现
// 定义PID控制器结构体
typedef struct {double Kp; // 比例增益double Ki; // 积分增益double Kd; // 微分增益double Ts; // 采样周期double integral; // 积分累计值double prev_error; // 上一次误差double output_max; // 输出上限double output_min; // 输出下限
} ParallelPID;// 并联PID控制器更新函数
double pid(ParallelPID *pid, double setpoint, double measurement) {double error = setpoint - measurement; // 计算误差// 临时积分项,乘以 Kidouble integral_temp = pid->integral + error * pid->Ts;// 微分项计算,乘以 Kddouble derivative = (error - pid->prev_error) / pid->Ts;// 计算控制器输出(暂时不更新积分项)double output_temp = pid->Kp * error +pid->Ki*integral_temp +pid->Kd*derivative;// 检查输出是否超出限制if (output_temp > pid->output_max) {output_temp = pid->output_max;} else if (output_temp < pid->output_min) {output_temp = pid->output_min;} else {// 如果输出未饱和,则更新积分项pid->integral = integral_temp;}// 保存当前误差用于下一次计算微分项pid->prev_error = error;return output_temp;
}
3、算法实现与验证
以基于刚性等级的双闭环模型为例,其中速度环就是采用理想PID,电流环采用并行PID。
模型下载地址: 基于刚性等级的双闭环PMSM环路控制模型,其中速度环PI采用串行型PID(理想PID),电流环采用并行PID
3.1 理想PID验证
simulink自带pid配置
自己实现算法:
function [u, prev_e, integral] = pidController(e, Kp, Ki, Kd, Ts, u_min, u_max, prev_e, integral)% PID 控制器实现% 输入:% e: 当前误差% Kp, Ki, Kd: PID 参数% Ts: 采样时间% prev_e: 上一次的误差% integral: 积分项的累积值% u_min: 控制输出下限% u_max: 控制输出上限% 输出:% u: 当前控制输出 (限幅后)% prev_e: 更新后的上一次误差% integral: 更新后的积分项% 比例项P = e;% 积分项integral = integral + e * Ts;I = Ki * integral;% 微分项derivative = (e - prev_e) / Ts;D = Kd * derivative;% 控制输出u = Kp*(P +I+ D);% 限幅u = max(min(u, u_max), u_min);% 更新上一次的误差prev_e = e;
end
者完全重合。
3.2 并行PID验证
simulink自带pid配置
自己实现算法:
function [control_signal,integral_term, prev_error ]= pid_controller(error, Kp, Ki, Kd, dt,max_output,integral_term,prev_error)% PID 控制器实现% 输入:% setpoint: 设定值% measurement: 测量值% Kp: 比例增益% Ki: 积分增益% Kd: 微分增益% dt: 采样时间% 输出:% control_signal: 控制信号% % persistent integral_term prev_error% if isempty(integral_term)% integral_term = 0; % 初始化积分项% prev_error = 0; % 初始化前一次误差% end% 计算积分项%integral_term = integral_term + error * dt;%使用梯形法计算积分项integral_term = integral_term + (error + prev_error) * dt / 2;% 计算微分项derivative_term = (error - prev_error) / dt;% 计算控制信号control_signal = Kp * error + Ki * integral_term + Kd * derivative_term;% 积分抗饱和if control_signal > max_outputcontrol_signal = max_output;integral_term = integral_term - (error + prev_error) * dt / 2; % 回退积分elseif control_signal < -max_outputcontrol_signal = -max_output;integral_term = integral_term - (error + prev_error) * dt / 2; % 回退积分end% 更新前一次误差prev_error = error;
end
两者完全重合。