代码改变世界

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