最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

PID算法程序

来源:动视网 责编:小OO 时间:2025-09-25 03:17:57
文档

PID算法程序

typedefstructPIDValue{   uint32Ek_Uint32[3];        //差值保存,给定和反馈的差值   uint8 EkFlag_Uint8[3];    //符号,1则对应的Ek[i]为负数,0为对应的Ek[i]为正数   uint8  KP_Uint8; uint8  KI_Uint8; uint8  KD_Uint8; uint8  B_Uint8;    //死区电压  uint8  KP;     //显示修改的时候用 uint8  KI;    
推荐度:
导读typedefstructPIDValue{   uint32Ek_Uint32[3];        //差值保存,给定和反馈的差值   uint8 EkFlag_Uint8[3];    //符号,1则对应的Ek[i]为负数,0为对应的Ek[i]为正数   uint8  KP_Uint8; uint8  KI_Uint8; uint8  KD_Uint8; uint8  B_Uint8;    //死区电压  uint8  KP;     //显示修改的时候用 uint8  KI;    
typedef struct PIDValue

{

    uint32 Ek_Uint32[3];         //差值保存,给定和反馈的差值

    uint8  EkFlag_Uint8[3];     //符号,1则对应的Ek[i]为负数,0为对应的Ek[i]为正数

    uint8   KP_Uint8;

 uint8   KI_Uint8;

 uint8   KD_Uint8;

 uint8   B_Uint8;     //死区电压

 

 uint8   KP;      //显示修改的时候用

 uint8   KI;      //

 uint8   KD;      //

 uint8   B;       //

 uint16  Uk_Uint16;    //上一时刻的控制电压

}PIDValueStr;

 

PIDValueStr xdata PID;

/*******************************

PID计算过程

********************************/

void    PIDProcess(void)

{

 uint32 idata Temp[3];  //

 uint32 idata PostSum;  //正数和

 uint32 idata NegSum;   //负数和

 Temp[0] = 0;

    Temp[1] = 0;

    Temp[2] = 0;

 PostSum = 0;

 NegSum = 0;

 if( ADPool.Value_Uint16[UINADCH] > ADPool.Value_Uint16[UFADCH] )  //给定大于反馈,则EK为正数

 {

     Temp[0] = ADPool.Value_Uint16[UINADCH] - ADPool.Value_Uint16[UFADCH];   //计算Ek[0]

        if( Temp[0] > PID.B_Uint8 )

        {

      //数值移位

            PID.Ek_Uint32[2] = PID.Ek_Uint32[1];

            PID.Ek_Uint32[1] = PID.Ek_Uint32[0];

            PID.Ek_Uint32[0] = Temp[0];

            //符号移位

   PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];

   PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];

   PID.EkFlag_Uint8[0] = 0;                       //当前EK为正数

            Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0];    // KP*EK0

            Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1];    // KI*EK1

            Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2];    // KD*EK2

        }

 }

 else   //反馈大于给定

 {

     Temp[0] = ADPool.Value_Uint16[UFADCH] - ADPool.Value_Uint16[UINADCH];   //计算Ek[0]

        if( Temp[0] > PID.B_Uint8 )

        {

      //数值移位

            PID.Ek_Uint32[2] = PID.Ek_Uint32[1];

            PID.Ek_Uint32[1] = PID.Ek_Uint32[0];

            PID.Ek_Uint32[0] = Temp[0];

            //符号移位

   PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];

   PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];

   PID.EkFlag_Uint8[0] = 1;                       //当前EK为负数

            Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0];    // KP*EK0

            Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1];    // KI*EK1

            Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2];    // KD*EK2

        }

 }

 

/*以下部分代码是讲所有的正数项叠加,负数项叠加*/

    if(PID.EkFlag_Uint8[0]==0)

    {

        PostSum += Temp[0];   //正数和

 }

    else

 {

        NegSum += Temp[0];    //负数和

 }                         // KP*EK0

    if(PID.EkFlag_Uint8[1]!=0)     

    {

        PostSum += Temp[1];   //正数和

 }

 else

 {

        NegSum += Temp[1];    //负数和

 }                         // - kI * EK1

    if(PID.EkFlag_Uint8[2]==0)

    {

        PostSum += Temp[2];   //正数和

    }

 else

 {

        NegSum += Temp[2];    //负数和

 }                         // KD * EK2

    PostSum += (uint32)PID.Uk_Uint16;        //

    if( PostSum > NegSum )             // 是否控制量为正数

    {

        Temp[0] = PostSum - NegSum;

        if( Temp[0] < (uint32)ADPool.Value_Uint16[UMAXADCH] )   //小于限幅值则为计算值输出

  {

            PID.Uk_Uint16 = (uint16)Temp[0];

  }

  else

  {

            PID.Uk_Uint16 = ADPool.Value_Uint16[UMAXADCH];    //否则为限幅值输出

     }

    }

    else               //控制量输出为负数,则输出0

    {

        PID.Uk_Uint16 = 0;

    }

}

文档

PID算法程序

typedefstructPIDValue{   uint32Ek_Uint32[3];        //差值保存,给定和反馈的差值   uint8 EkFlag_Uint8[3];    //符号,1则对应的Ek[i]为负数,0为对应的Ek[i]为正数   uint8  KP_Uint8; uint8  KI_Uint8; uint8  KD_Uint8; uint8  B_Uint8;    //死区电压  uint8  KP;     //显示修改的时候用 uint8  KI;    
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top