有没有人贡献一个可以用的PID程序,,,,我写的跑起来老出问题

2020-02-08 09:32发布

有没有人贡献一个可以用的PID程序,,,,我写的跑起来老出问题

PWM老在动,,而且,,PID系数方面也没搞过
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
26条回答
pyy1980
2020-02-08 19:06
void PI()                /* PI调节算法 */
{


{   
  ek=1.5-(adc1.Ch1Out/100);
  if( ek<0.1 )
           /* 偏差小于0.1则调整值为0 */
  {
    adjust=0;
  }
  else   
  {     
    uk=Kp*(ek-ek1)+Ki*ek;/* 否则计算控制增量 */
    ek1=ek;  
    uk1=(signed int)uk;
    if(uk>0)
    {
      if(uk-uk1>=0.5)
      {
        uk1=uk1+1;
      }
    }
    if(uk<0)
    {
      if(uk1-uk>=0.5)
      {
        uk1=uk1-1;
      }
    }
    adjust=uk1;  
    XPWM=XPWM+adjust;  
  }   
//  return;
}  
//asm(" NOP ");           /* 请将光标移到此处设置断点,并用debug->Animate监测数据 */  
}




void main(void)
{
   InitSysCtrl();
   
   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();




   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.EPWM1_INT = &EPWM1_Z_ISR;
   EDIS;    // This is needed to disable write to EALLOW protected registers



   IER |= M_INT1;
   IER |= M_INT3;

   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
   PieCtrlRegs.PIEIER9.bit.INTx1 =1;     // PIE Group 9, INT1
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
   PieCtrlRegs.PIEIER5.bit.INTx1 = 1;
   PieCtrlRegs.PIEIER3.all = M_INT1;


   pwmgen.init(&pwmgen);
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
   EDIS;

    adc1.ChSelect = 0x3210;   // for DMC1500 and eZdsp2812/eZdsp2808 boards
        adc1.init(&adc1);


   EINT;   // Enable Global interrupt INTM
   ERTM;   // Enable Global realtime interrupt DBGM




        pwmgen.Close(&pwmgen);
        pwmgen.Open(&pwmgen);

        while(1)
        {

        PI();
        }
         
}         


interrupt void  EPWM1_Z_ISR(void)
{
        static int time_inc=0;
        pwmgen.MfuncC1 =XPWM;


        pwmgen.update(&pwmgen);





        time_inc++;
        if(time_inc&0x3)
        {
        goto exit;

        }
        else
        {
//        GpioDataRegs.GPACLEAR.bit.GPIO9=1;
        }

        adc1.read(&adc1);



exit:
        EPwm1Regs.ETCLR.bit.INT = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

}



这种程序有没有问题????帮我看下


程序很简单,,就是PI算法改变PWM的占空比,,在中断中采样和改变

一周热门 更多>