搜索
bottom↓
回复: 1

PID数控电源碰到问题了,请高手帮助(附程序)

[复制链接]

出0入0汤圆

发表于 2014-3-12 13:24:58 | 显示全部楼层 |阅读模式
做了一个数控电源,用PID来控制,PID程序如下:
/************************************************
              PIDº¯Êý
*************************************************/
void PIDInit (struct PID *pp)
{
  memset ( pp,0,sizeof(struct PID));
}
/************************************************
              ÔöÁ¿¿ØÖÆPIDº¯ÊýÌå
51µ¥Æ¬»ú×î²»É󤸡µãÊý¼ÆË㣬ת»»³ÉintÐͼÆËã         PVsetΪÉ趨ֵ,NextPointΪÏÖÔÚÖµ
*************************************************/
unsigned int PIDCalc( struct PID *pp,unsigned int PVset,unsigned int NextPoint )
{
  unsigned int dError,Error,pError;
  //ÔöÁ¿·¨¼ÆË㹫ʽ£º
  //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  Error = PVset - NextPoint;       // Æ«²îE(t)
  pError=Error-pp->LastError;         //E(t)-E(t-1)
  dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  pp->PrevError = pp->LastError;
  pp->LastError = Error;
  return (
            pp->Proportion * pError        //±ÈÀý
            + pp->Integral *Error  //»ý·ÖÏî
            + pp->Derivative * dError          // ΢·ÖÏî
                        );  
}

/************************************************
                                PIDº¯Êý³õʼ»¯
*************************************************/
void PIDBEGIN()
{
  PIDInit(&spid); // Initialize Structure
  spid.Proportion = 10; // Set PID Coefficients
  spid.Integral = 5;
  spid.Derivative =4;
}

/***********************************************************
             PIDµçѹ¿ØÖÆ×ö¶¯º¯Êý
***********************************************************/
void compare_voltage(uint Vset)                              //PIDµçѹ¿ØÖÆÊä³öº¯Êý
{
  unsigned char i;
  uint x;  

  if(Vset>Vout)
   {
    if((Vset-Vout)>50)                  //Èç¹û¿ØÖÆÄ¿±êµçѹÓëʵʱµçѹ²î´óÓÚ50mv
     {
      dacshu=dacshu+5;
      if(dacshu>=2000){dacshu=2000;}
          DAC0out(dacshu);
          delay(5000);
     }
        else
    {
     for(i=0;i<10;i++)                   //50mV·¶Î§ÄÚPIDÔöÁ¿¿ØÖÆ£¬10´ÎÖÜÆÚ ¼´PID»ý·ÖʽÖÐT=10
     {
      measurement2 =   ad_start(3);
          Vout = (measurement2*6097)/10000;
          rin=Vout;                         //PIDÊäÈëʵʱµçѹ²ÉÑùÖµ
      rout = PIDCalc ( &spid,Vset,rin ); // PIDÔöÁ¿Êä³ö
          if(rout>2000){rout=0;}
     }                                   //PIDÔöÁ¿Êä³ö·¶Î§£¨0-2000£©ÅäºÏDACÈ¡Öµ·¶Î§
//          mVshuADC();                                                                //¶ÁÈ¡µçѹ¡¢µçÁ÷,ÅжÏÉ趨ÊÇ·ñµÈÓÚÊä³ö
         if(Vset==Vout){rout=0;}         
         dacshu=dacshu+rout;
         if(dacshu>2000){dacshu=2000;}         
     DAC0out(dacshu);
         x=rout;          
    }
   }  
  else if(Vset<Vout)                   //Ä¿±êµçѹСÓÚʵʱÊä³öµçѹ
   {
    if((Vout-Vset)>50)                 //Èç¹û¿ØÖÆʵʱµçѹÓëÄ¿±êµçѹ²î´óÓÚ50mv
     {
          if(dacshu<=5){dacshu=5;}
      dacshu=dacshu-5;
          DAC0out(dacshu);
          delay(5000);
     }
         else
         {
     for(i=0;i<10;i++)                 //50mV·¶Î§ÄÚPIDÔöÁ¿¿ØÖÆ£¬10´ÎÖÜÆÚ ¼´PID»ý·ÖʽÖÐT=10
     {
      measurement2 =   ad_start(3);
          Vout = (measurement2*6097)/10000;
          rin=Vout;                         //PIDÊäÈëʵʱµçѹ²ÉÑùÖµ
      rout = PIDCalc ( &spid,Vset,rin ); // PIDÔöÁ¿Êä³ö
          if(rout<63535){rout=65535;}                 //PIDÒç³öÏÞÖÆ
     }                                   //PIDÔöÁ¿Êä³ö·¶Î§£¨0-2000£©ÅäºÏDACÈ¡Öµ·¶Î§
         if(Vset==Vout){rout=65535;}
         dacshu=dacshu-(65535-rout);
         if(dacshu>63535){dacshu=0;}
     DAC0out(dacshu);
         x=65535-rout;
         }
   }   
          ax1=x/1000;
      ax2=(x-ax1*1000)/100;
      ax3=(x-ax1*1000-ax2*100)/10;
      ax4=(x-ax1*1000-ax2*100-ax3*10);
}
/***********************************************************
现在的问题是每次设定=输出时,PID的输出值(rout)不是零,而是1024,或是2048 ,或是512不知道是什么原因?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-3-12 13:31:15 | 显示全部楼层
为什么注释都看不清楚啊?程序是借用网友的一个温度PID的程序
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 07:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表