您的当前位置:首页正文

PID专题及C语言的实现

2024-03-04 来源:欧得旅游网
PID专题及C语⾔的实现

注意:任何算法使⽤程序表⽰,都得将算法离散化,以下的算法公式及代码都是将连续函数离散化后的表⽰结果。 个⼈鄙见,请多多指导。

问题⼀: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

因篇幅问题不能全部显示,请点此查看更多更全内容