[mw_shl_code=c,true]这是我的PID算法部分,Pitch是DMP的俯仰角,Gyro_y是DMP的角速度,调速占空比宽度为0---1000;请教各位大神[/mw_shl_code]
[mw_shl_code=c,true]第一:我没有加码盘,MCU为stm32f103[/mw_shl_code]
[mw_shl_code=c,true]第二:平衡控制的扫描时间为5ms,我的蓝牙发来的控制数为200ms每次,请教各位如何吧前进和后退结合起来[/mw_shl_code]
[mw_shl_code=c,true]第三:我试过手动修改平衡点,让他主动修正达到向前进的效果,但是由于KI的存在导致惯性太大无法改正[/mw_shl_code]
[mw_shl_code=c,true]   ID.Kp=98.6;//68.6--98.6--118--168.6---188.6
PID.Kd=4;//6---4.2--5
PID.Ki=1.8;//0.5---0.8--1.0[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
id PID_Calcu(void)/
{
static float sum=0;
float need_yaw;
float offset;
static float left=0,right=0;
Speed_Calcu();
sum+=Pitch;
if(Pitch>50||Pitch<-50)/*俯仰角大于50都关闭电机*/
{
Hold;
return;
}
PWM_L=(long)((Pitch*PID.Kp+PID.Kd*Gyro_y+sum*PID.Ki));
PWM_R=(long)((Pitch*PID.Kp+PID.Kd*Gyro_y+sum*PID.Ki));
if(PWM_L<0)
{
PWM_L=-PWM_L;
Left_Back;
}
else
{
Left_Foward;
}
if(PWM_R<0)
{
PWM_R=-PWM_R;
Right_Back;
}
else
{
Right_Foward;
}
PWM_L=PWM_L<1000?PWM_L:1000;
PWM_R=PWM_R<1000?PWM_R:1000;
TIM3->CCR3 = PWM_L;
TIM3->CCR4 = PWM_R;[/mw_shl_code]
|