打印

关于PI问题

[复制链接]
984|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jwwhy|  楼主 | 2014-12-18 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在想用PI恒定功率大小,自己写了个,但是感觉不对,请大家指教

10位ADC,8位PWM

//==================================================


#define     AIM           151229     //恒定功率值
#define     PCONST         2      //比例常数
#define     ICONST        0.05   //积分常数
#define     IMIN          0.01
#define     IMAX           2

void    PI(void)    //18V/0.5A        738*205
{
    static INT32U  Vnew =  0;  
    static INT32S  ErrorSum = 0;
     
    static INT32S error = 0;   //误差=目标速度 - 当前速度
    static INT32S pTerm = 0;   //比例项
    static double iTerm = 0;   //积分项
   
    static INT8U  i = 0;
   
    Vnew =  Solar_AUX();      //先取当前的功率值
    error = AIM - Vnew;       //误差 = 目标功率 - 当前功率
    pTerm = error*PCONST;    //比例项的值就是误差乘上比例常量
   
    ErrorSum += error            //每一次的功率误差累计起来
    if(ErrorSum>IMAX)         ErrorSum = IMAX;         
    else if(ErrorSum<IMIN)    ErrorSum = IMIN;

    iTerm = ErrorSum *ICONST;                //误差和乘上积分常量
   
    i = (iTerm+pTerm)/4;
   
    Motor(i);             //让电机根据得出的值工作 */

}

INT32U   Solar_AUX(void)    //ADC采样  计算产品的功率  (18V/0.5A) 电压通过120和30K分压,电流通过0.2R电阻采样然后放到10倍,10位AD
{
    static INT16U   i = 0;
    static INT16U   j = 0;
    static INT32U   POWER = 0;
     i =  Solar_Voltage_Ad_Det();
     j =  Solar_Charge_Ad_Det();
     
     POWER  = i*j;
     
     return POWER;
}

现在的问题是,如果更加上面的公式
  error = AIM - Vnew;       //误差 = 目标功率 - 当前功率 ,如果误差相差500,

   pTerm = error*PCONST;    // 计算得出1000

ErrorSum += error            //刚开始,计算得500

  iTerm = ErrorSum *ICONST;           //计算得25

  i = (iTerm+pTerm)/4;   //(1000+25)/4 >255

也就是说如果误差 ( error = AIM - Vnew;       //误差 = 目标功率 - 当前功率)大于500的时候,就会出现最后pWM占空比为100%。

是我理解有问题还是哪里写错了,请大家指教.




相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

281

帖子

0

粉丝