现在想用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%。
是我理解有问题还是哪里写错了,请大家指教.
|