大家好,欢迎来到IT知识分享网。
PID简介
PID(Proportion-Integral-Differential),即比例-积分-微分,是一种常用的闭环控制器。
PID在计算机程序(数字量)中,有传统(位置式)PID和增量式PID两种实现形式。
传统(位置式)PID
示例代码:
typedef struct {
float kp; // 比例系数 float ki; // 积分系数 float kd; // 微分系数 float err; // 误差 float last_err; // 上次误差 float proportion; // 比例项 float integral; // 积分项 float differential; // 微分项 float integral_limit; // 积分限幅 } PID; PID pid = {
.kp = 1, .ki = 1, .kd = 1, .integral_limit = 1023, }; void pid_controler(float target, float feedback, float *output) {
// 更新误差 pid.last_err = pid.err; pid.err = target - feedback; // 计算比例项 pid.proportion = pid.kp * pid.err; // 计算积分项、积分限幅 pid.integral += pid.ki * pid.err; if(pid.integral > pid.integral_limit) pid.integral = pid.integral_limit; if(pid.integral < -pid.integral_limit) pid.integral = -pid.integral_limit; // 计算微分项 pid.differential = pid.kd * (pid.err - pid.last_err); // 计算输出量 *output = pid.proportion + pid.integral + pid.differential; }
增量式PID
从公式上可以看出,增量式PID和传统(位置式)PID可以互相推导,也就意味着增量式PID和传统(位置式)PID只是数据的计算顺序不同,数据的计算结果和控制效果是相同的。增量式PID的优点就是不需要考虑积分饱和问题,也不再需要积分限幅。
示例代码:
typedef struct {
float kp; // 比例系数 float ki; // 积分系数 float kd; // 微分系数 float err; // 误差 float last_err; // 上次误差 float last_last_err; // 上上次误差 float proportion; // 比例项 float integral; // 积分项 float differential; // 微分项 } PID; PID pid = {
.kp = 1, .ki = 1, .kd = 1, }; void pid_controler(float target, float feedback, float *output) {
// 更新误差 pid.last_last_err = pid.last_err; pid.last_err = pid.err; pid.err = target - feedback; // 计算比例项 pid.proportion = pid.kp * (pid.err - pid.last_err); // 计算积分项 pid.integral = pid.ki * pid.err; // 计算微分项 pid.differential = pid.kd * (pid.err - 2 * pid.last_err + pid.last_last_err); // 计算输出量 *output += pid.proportion + pid.integral + pid.differential; }
PID的变种
前馈PID
前馈PID能够让控制系统更快速的达到稳态,减少积分环节消耗的时间。
积分分离PID
积分分离PID的核心思想是,在系统误差较大时暂停积分作用,当误差减小到一定程度时再重新启用积分作用。这样做的目的是,避免因为在误差较大时积分项累积过多而导致的系统超调。
变速积分PID
变速积分PID的核心思想是,在系统误差较大时减小积分累积的速度,而在误差较小时增大积分累积的速度。这样做的目的是,避免因为在误差较大时积分项累积过多而导致的系统超调。变速积分PID可以看成是积分分离PID的升级版。
不完全微分PID
不完全微分PID通过引入一个低通滤波器来平滑微分项的计算结果,从而减少对高频噪声的敏感性。这样做的目的是,防止微分项因为对高频噪声敏感而产生过度调节的问题。
微分先行PID
在传统PID控制器中,微分项是基于误差(即目标量与反馈量之差)的变化率来计算的,而在微分先行PID控制器中,微分项是基于反馈量的变化率来计算的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135726.html