
一、简介1) 应用领域PID控制器广泛应用于各种工业过程控制中比如温度控制、流量控制、压力控制、飞行器的姿态、汽车控制、机械臂的位置控制等多个领域。2) 概念PID控制器是一种广泛应用于过程控制的自动控制器分别代表比例proportional、积分integral、微分derivative主要用于调节系统的输出使反馈值与目标值更接近。其中Kp 是比例系数用于放大偏差信号。Ki 是积分系数用于消除稳态误差。Kd 是微分系数用于预测偏差的变化趋势提前进行控制。二、位置式PIDPID初始化void PID_Init(PID *pid, float Kp , float Ki , float Kd , float Limit_value) { pid-Kp Kp; pid-Ki Ki; pid-Kd Kd; pid-PrevError pid-LastError pid-Error pid-SumError pid-output 0; pid-Integralmax pid-outputmax Limit_value; }PID参数定义及控制输出typedef struct PID { float Kp; // Proportional Const P系数 float Ki; // Integral Const I系数 float Kd; // Derivative Const D系数 float PrevError ; // Error[-2] float LastError; // Error[-1] float Error; // Error[0 ] float DError; //pid-Error - pid-LastError float SumError; // Sums of Errors float output; float Integralmax; //积分项的最大值 float outputmax; //输出项的最大值 } PID; //为了防止积分项过度累积引入积分项的限幅是一种常见的做法。 //限制积分项的幅值可以防止积分项过度增加从而限制了系统的累积误差。这样可以避免系统过度响应或者不稳定。 float abs_limit(float value, float ABS_MAX) //积分限幅设置最大值。 { if(value ABS_MAX) value ABS_MAX; if(value -ABS_MAX) value -ABS_MAX; return value; } //函数里传入指针修改时会修改指针里的值。 float PID_Position_Calc(PID *pid, float Target_val, float Actual_val) //位置式PID { pid-Error Target_val - Actual_val; //与pid P系数相乘。比例误差值 当前差值目标值-实际值 pid-SumError pid-Error; //与pid I系数相乘。稳态误差值 误差相加作为误差总和给积分项 pid-DError pid-Error - pid-LastError; //与pid D系数相乘。 微分项-消除震荡 pid-output pid-Kp* pid-Error abs_limit( pid-Ki* pid-SumError, pid-Integralmax ) pid-Kd* pid-DError ; pid-LastError pid-Error; //更新误差 //限制输出最大值防止出现突发意外。输出outputmax的最大值 if(pid-output pid-outputmax ) pid-output pid-outputmax; if(pid-output - pid-outputmax ) pid-output -pid-outputmax; return pid-output ; //输出为pwm值 }三、调参Kp、Ki、Kd的作用。P增加快速性过大会引起震荡和超调P单独作用会一直有静态误差。I减少静态误差过大会引起震荡。D减小超调过大会使响应速度变慢。1纯Kp调节比例假设有一个高为10m的水桶需要灌满水这里我们假设Kp0.2每次灌水量为剩余灌水量的0.2倍。第一次灌水10×0.2 剩余810-10×0.2。第二次灌水 8×0.2 剩余6.48-8×0.2。第三次灌水6.4×0.2 剩余5.12。…这里我们发现当我们设置Kp后一直会慢慢接近目标值但是永远不会到达目标值这也就是会一直有静态误差。当Kp设置过小时消耗的时间也就会更多。这里我们可以适当的调大Kp使得更快的接近目标值。但是当Kp大于某个定值时就会出现抖动如下假设Kp1.5。则第一次灌水10×1.5剩余 -5。第二次灌水-5×1.5剩余2.5-5 - (-5×1.5)。第三次灌水2.5×1.5剩余 -1.25。…所以要根据实际适当调整p值不要使得Kp过大而出现抖动。2Ki调节积分作用积分时间用于解决系统的稳态误差问题即系统无法完全到达期望值的情况。当存在稳态误差时积分项会不断积累偏差并且在一段时间内持续作用于控制器的输出直到系统到达期望状态为止。水桶例子假设你在使用一个PID控制系统来控制一个水桶的水位。如果水桶的出水口略微大于水龙头的流量那么水位就会慢慢下降形成一个稳态偏差。积分时间就像是一个将稳态偏差中的水慢慢积累起来直到水桶完全满了。如果积分时间设置得太大可能会导致水桶溢出而设置得太小则可能导致水桶永远无法完全填满。3Kd调节微分作用微分时间用于减小系统的超调和提高系统的稳定性。它通过监测偏差的变化速率来预测系统未来的行为并相应地调整控制器的输出以减少振荡和过冲现象。水桶例子继续以水桶控制系统为例微分时间就像是观察水流速度的变化。如果你突然关闭水龙头但是水桶的水位仍然在上升那么微分项会告诉你要逐渐减小输出以避免水位超过期望值。如果微分时间设置得太大可能会导致系统对外部干扰过于敏感反而引起不稳定性而设置得太小则可能无法有效地抑制超调和振荡。