int Position_PID (int shiji,int Target)
{
// float Position_KP=-80,Position_KI=0,Position_KD=-170;
float Position_KP=-40,Position_KI=0,Position_KD=-50;
static float Bias,Pwm,Integral_bias,Last_Bias;
Bias=shiji-Target; //计算偏差
Integral_bias+=Bias; //求出偏差的积分
Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); //位置式PID控制器
Last_Bias=Bias; //保存上一次偏差
if(Pwm>7200) Pwm=7200;
else if(Pwm<-7200) Pwm=-7200;
return Pwm; //增量输出
}
int coder;
// int speed;
int speed_s=0;
int speed_po=0;
int SET_Pos=0;
int pwm_out=0;
void TIM1_UP_IRQHandler(void)
{
// 检查更新中断标志位
if (TIM_GetITStatus(TIM1, TIM_IT_Update) == SET)
{
// 执行定时器中断处理操作
coder=Encoder_Get();
speed_po=Position_PID(coder,SET_Pos);
//speed_s=pid_speed(coder,10);
//pwm_out=speed_s+speed_po;
if(pwm_out>7200) pwm_out=7200;
else if(pwm_out<-7200) pwm_out=-7200;
if(pwm_out>0) motorA_stata (fan,speed_po,enable);
else if(pwm_out<=0) motorA_stata (zhen,-speed_po,enable);
// 清除更新中断标志位
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
}
}
以上是我实现速度环的电机控制, 脉冲数是一直累计的,获取后不清零处理,,,后面我该这么加入速度环呢? 我直接把速度环计算出的PWM和位置环输出的PWM相加输出给电机,这样没有成功.
该这么才能实现控制位置环和速度环串级PID呢? (小白求助,谢谢回复,谢谢你~)
|