首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

PID算法实现(C语言),该如何解决

2012-02-19 
PID算法实现(C语言)这是一个PID算法的C语言实现程序: doublesensor(void),voidactuator(doublerDelta,dou

PID算法实现(C语言)
这是一个PID算法的C语言实现程序: "double   sensor   (void),void   actuator(double   rDelta,double   LastrDelta   )各函数的功能及语句的作用,   以及主函数里的变量j和数值a[]的设置的作用,以及for循环语句的作用, "望大家再分享的同时,给份详细注释,在线等待,大家帮助大家,^_^.
#include   <string.h>
#include   <stdio.h>
typedef   struct   PID   {                           /*K1=实际放大倍数,T1=实际积分时间,T2=实际微分时
间,T=采样周期*/

        double     SetPoint;           /*定义PID结构体*/      

        double     K1;
        double     T1;                                
        double     T2;
                double     T;
                double     Err1;               /*前一时刻误差,E(K-1)*/      
}   PID;
double   PIDCalc(   PID   *pp,   double   NextPoint,double   Ud1,double   Ui1)     /*PID计算
*/        
{
      double   Ti,Td,Kp,Ki,Kd,Ud,Up,Ui,Err;                
        Ti   =   pp-> T1   +   pp-> T2;                                                       /*积分时间*/  
        Td   =   (pp-> T1   *   pp-> T2)   /   (pp-> T1   +   pp-> T2);           /*微分时间*/  
        Kp   =   pp-> K1   *   ((pp-> T1   +   pp-> T2)   /   pp-> T1);             /*比例系数*/  
        Ki   =pp-> T   /   Ti   *   Kp;                                                           /*积分系数*/  
        Kd   =   Td   /   pp-> T   *   Kp;                                                         /*微分系数*/      

          Err   =   pp-> SetPoint-NextPoint;                                         /*当前误差*/  
        Ud   =   pp-> T2   /   ((Kd   *   pp-> T)   +   pp-> T2)   *   Ud1+   Kd   *   (pp-> T2   +   pp-> T)   /   (Kd   *  
pp-> T   +   pp-> T2)   *   Err   -   Kd   *   pp-> T2   /   (Kd   *   pp-> T   +   pp-> T2)   *pp-> Err1;       /*微分
作用*/
        Ui   =   Ui1   +   pp-> K1   *   (pp-> T   /   pp-> T1)   *   Ud;                   /*积分作用*/          


        Up   =   pp-> K1   *   Ud;                                                                     /*比例作用*/  
        Ud1=Ud;                                                                                     /*UD1=ud(k-1),ui1=ui(k-1)
*/  
        Ui1=Ui;
return   (Ud   +   Up   +   Ui);                                                               /*y(k)*/
}
void   PIDInit   (PID   *pp)
{
        memset   (   pp,0,sizeof(PID));                                      
}


/*double   sensor   (void)                                                                            
{
        return   1.0;
}*/                                                                                                         /*输入口*/  

void   actuator(double   rDelta,double   LastrDelta   )                           /*输出口*/  
{
    double   n;                                                                                                
    n=rDelta-LastrDelta;                                                                       /*y(k)-y(k-1)*/  
    LastrDelta=rDelta;                                                                  
    printf   ( "%f\n ",n);
    }

void   main(void)                                                
{
  int   j,a[]=
{15,14,12.5,10.5,5.5,6.7,9.5,11.3,9.6,10.2,10.035,9.2356,10.2356,9.3654,10.01101


};
        PID                   sPID;
        double             rOut;
        double             LastrOut=0;                                                           /*y(k-1)*/  
        double             rIn;
        double               Ud1   =   1;
        double               Ui1   =   1;
        PIDInit   (   &sPID   );                                                                         /*PID初始化*/  
        sPID.K1   =   1;
        sPID.T1   =   1;
        sPID.T2   =   1;
        sPID.T     =   1;
        sPID.SetPoint   =   10.0;                                                                       /*设定值*/  
        sPID.Err1   =   1;


        for   (j=0;j <15;j++)
          {
        rIn   =   a[j];     /*sensor   ();*/                                           /*输入*/  
        rOut=   PIDCalc   (   &sPID,rIn,Ud1,Ui1   );                                  
        actuator   (   rOut,   LastrOut   );                      
  }
}

[解决办法]
这应该是个仿真程序.
sensor原来是个输入函数,后来注释掉了,用数组代替了.
actuator输出函数,这里现示跟踪情况.
j,是15个点的循环变量.
a[j],是个模拟的输入.

热点排行