PID专题及C语言的实现
2019-06-12 16:40 斑鸠,一生。 阅读(3943) 评论(2) 编辑 收藏 举报注意:任何算法使用程序表示,都得将算法离散化,以下的算法公式及代码都是将连续函数离散化后的表示结果。
个人鄙见,请多多指导。
问题一:PID计算结果与实际信号的对应关系[5]?
位置式PID计算结果表示信号量的多少,
增量式PID计算结果表示信号量的增多或减少多少。
一般来说:
位置式PID计算结果用0~1来表示控制信号的绝对大小,
而增量式PID计算结果用-1~1来表示控制信号的相对大小。
例如:
工业设备通常采用4mA~20mA控制信号,PID计算结果用0~1来表示。
对于位置式PID来说:
0来表示应该向设备输如4mA的控制信号,
0.5则表示向设备输如12mA的控制信号,
1则表示向设备输如20mA的控制信号。
对于增量式PID来说:
若当前控制信号大小为6mA,而增量式PID的计算结果为0.2,
则表示控制信号应该从6mA增大到6mA+(20mA-4mA)*20%=9.2mA;
若当前控制信号大小为16mA,而增量式PID的计算结果为-0.2,
则表示控制信号应该从16mA减小到16mA-(20mA-4mA)*20%=12.8mA。
问题二:位置式pid与增量式pid有何区别和联系?
(1)位置式pid将误差累加,增量式pid与当前及前两次误差有关,增量式pid是位置式pid的微分。
(2)位置式pid计算结果直接作用于执行机构,增量式pid计算结果只是上次控制量的增量。
(3)位置式pid需要积分限幅和输出限幅,增量式pid只需要输出限幅。
(4)从计算公式来看,位置式pid的P参数对应增量式pid的I参数,位置式pid的D参数对应增量式pid的P参数。
(5) 位置式pid应用于不带记忆功能的执行机构,增量式pid应用于带记忆功能的执行机构。
//DC-DC数字电源可以设置成带记忆功能的执行机构,也可以设置成不带记忆功能的执行机构。带PFC的Boost电路,好像是不带记忆功能的执行机构。目前,对于Boost PFC,增量式pid还没成功调试出来过。
问题三:位置式PID计算公式是什么?
问题四:增量式PID计算公式是什么?
由问题二的位置式的PID计算公式可知,u(k)和u(k-1)的计算公式。将二者做差,即得到增量式PID的计算公式。
PID控制器增量式算法的差分方程还可以写成:
另,
则,差分方程可以表示为;
问题五:为什么位置式pid需要积分限幅和输出限幅,增量式pid只需要输出限幅?
位置式pid存在误差积分环节,容易产生积分饱和现象,因此需要积分限幅。
增量式pid与当前误差,上次误差,上上次误差有关,但不存在误差的积分。
问题六:位置式PID实现C语言代码?
typedef struct{ float kp,ki,kd; float ek,ek1,ek2; //ek1 是 ek 的前一次误差 float eSUM; float Limit; }PID;
PID pid = {1.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f, 10.0f};
float PID_Loc(float SetValue, float ActualValue, PID *pid){ float PIDLoc; pid->ek = SetValue - ActualValue; pid->eSUM += pid->ki * pid->ek; //累计误差 pid->eSUM = pid->eSUM > pid->Limit? pid->Limit:pid->eSUM; //积分限幅,上限 pid->eSUM = pid->eSUM < - pid->Limit? - pid->Limit:pid->eSUM; //积分限幅,下限
//这里的积分限幅,需要根据实际的需要设置上限和下限,没有统一的规则。
PIDLoc = (pid->kp*pid->ek) + pid->eSUM + pid->kd*(pid->ek1 - pid->ek); pid->ek1 = pid->ek; return PIDLoc; }
问题七:增量式PID的实现代码?该pid计算结果如何使用?
float PID_Inc(float SetValue, float ActualValue, PID *pid){
float PIDInc; pid->ek = SetValue - ActualValue; PIDInc = pid->kp * (pid->ek - pid->ek1) + (pid->ki * pid->ek) + pid->kd * (pid->ek - 2*pid->ek1 + pid->ek2); /*注意:可以将公式化简,这是一种思维,不要简单的将下面化简的kp,ki,kd。
理解为书上的PID。这里是提了公因式的 PIDInc = (pid->kp * pid->ek) - (pid->ki * pid->ek1) + (pid->kd * pid->ek2)
这里的kp、ki、kd、等同于问题四的a0、a1、a2参数,具体转化见参考文献【6】
*/ pid->ek2 = pid->ek1; pid->ek1 = pid->ek; return PIDInc; }
备注:由于计算结果是属于增量,那么计算后,该PIDInc需要叠加到原PWM的占空比上面,具体是加还是减看具体情况。
问题七:为什么在使用增量式PID的时候,反馈的调节现象是正反馈?
增量式的pid,在实际的应用上,需要根据具体的情况判断是加还是减,弄错了就成为了正反馈。
问题八:P、I参数的取值范围?
答:
对于数字电源,输入变化量经过硬件电路的衰减,模拟采样的变化范围在0~3.3V;
对于目前的ADC技术,将很小的模拟变化量用10位、12位等的数字量来表示。
对于目前的高频PWM模块,PWM的分辨率一般不会太高,9~13位左右。
对于变换器处于稳态时,占空比也不需要大幅度的波动。
因此,
根据上面三个原因,P、I参数一般都是零点几的小数。
ADC的分辨率越高,PWM分辨率越低。实现同样效果的P、I参数越小。
问题九:针对问题八提到的P、I参数都是小数。运算能力有限的单片机如何表示?
答:如果单片机支持浮点运算且运算能力足够,使用float表示并进行运算即可。
如果单片机的CPU计算能力有限,使用乘以一个整形然后右移一定位数表示小数。
参考文献:
[1] 何俊龙,杜封.微缩智能车路径跟踪的增量式PID控制[J].天津职业技术师范大学学报.2018,28(2):5-9
[2] 王祎晨. 增量式 PID 和位置式 PID 算法的整定比较与研究[J].工业控制与计算机.2018,31(5):123-124
[3] https://blog.csdn.net/as480133937/article/details/89508034
[4] https://blog.csdn.net/qlexcel/article/details/103651072
[5] https://zhidao.baidu.com/question/1951756084352155348.html
[6] PID控制器的数字实现及C语法讲解.https://www.cnblogs.com/cjq0301/p/5184808.html