高级会员
- 积分
- 673
- 威望
- 385
- 贡献
- 198
- 兑换币
- 252
- 注册时间
- 2013-9-12
- 在线时间
- 45 小时
- 毕业学校
- 武汉长江工商学院
|
参考官方资料将代码加进去,没有出现错误,可是在调节速度PID的时候,基本没有反应,,,,这个是什么原因?下面是我的代码void SpeedControl(int bmq_l,int bmq_r) {
float fDelta;
float fDelta_cha;
float fDelta_old,fD;
float fP, fI;
g_fCarSpeed = (bmq_l + bmq_r) / 2;
g_fCarSpeed *= CAR_SPEED_CONSTANT; //计算出电机转速
fDelta = CAR_SPEED_SETfDelta - g_fCarSpeed; //给定速-电机实际转
fP = fDelta * SPEED_CONTROL_P; //计算p
fI = fDelta * SPEED_CONTROL_I; //计算I
g_fSpeedControlIntegral += fI;
/* if(g_fSpeedControlIntegral>=10)
{g_fSpeedControlIntegral=10;}
if(g_fSpeedControlIntegral<=-10)
{g_fSpeedControlIntegral=-10;}
if(fP>=1000)
{fP=100;}
if(fP<=-1000)
{fP=-1000;} */
fDelta_cha = fDelta - fDelta_old;
fD = fDelta_cha * SPEED_CONTROL_D;
// if(fD>=220)
//{fD=220;}
// if(fD<=-220)
//{fD=-220;}
g_fSpeedControlOutOld = g_fSpeedControlOutNew;
g_fSpeedControlOutNew = fP +fD+ g_fSpeedControlIntegral;
fDelta_old=fDelta;
}
/************速度输出函数(编码器)**********/
void SpeedControlOutput(void)
{
float fValue;
fValue=g_fSpeedControlOutNew - g_fSpeedControlOutOld;
g_fSpeedControlOut=fValue*(g_nSpeedControlPeriod)/100+g_fSpeedControlOutOld;
g_nSpeedControlPeriod++;
}
/***********************************************************************/
/*
* 功能说明:直立速度计算
* 参数说明:angle 融合后最终角度
* angle_dot 陀螺仪角速度
*
* 函数返回:无符号结果值
* 修改时间:2013-2-10
* 备注:参考清华源码
*/
/**************************速度闭环程序****************************************/
void MotorOutput(void)
{
g_fLeftMotorOut = speed_Start - g_fSpeedControlOut;
g_fRightMotorOut = speed_Start - g_fSpeedControlOut;
}
/******************************************************************************/
void Speed_Calculate(float angle,float angle_dot)
{
/***********************************速度计算************************************/
speed_Start = angle * P_ANGLE + angle_dot * D_ANGLE ; //直立时所要的速度
// printf("\n转速:%d",speed_Start);
MotorOutput();
//P_ANGLE P_GYRO 宏定义 直立所需要的PD参数
Speed_L =g_fLeftMotorOut;//speed_Start;//左轮总速度
// printf("\n左轮R:%d",Speed_L);
Speed_R =g_fRightMotorOut;//speed_Start;//右轮总速度
// printf("\n右轮R:%d",Speed_R);
/***********************将最大速度限制在985个PWM内******************************/
if(Speed_L > 985) Speed_L = 985;
if(Speed_L < -985) Speed_L = -985;
if(Speed_R > 985) Speed_R = 985;
if(Speed_R < -985) Speed_R = -985;
/***************因为驱动部分加了反相器,所以需对速度进行一个最终的处理******************/
if(Speed_L > 0) //因为加了反相器,所以PWM要反过来添加
Speed_L_Last = Speed_L;
else
Speed_L_Last = Speed_L;
if(Speed_R > 0) //因为加了反相器,所以PWM要反过来添加
Speed_R_Last = Speed_R;
else
Speed_R_Last = Speed_R;
/*************用所得到的对应角度的速度进行PWM控制********************/
if(Speed_L >= 0) //angle大于0,向前,小于0,向后
{
FTM_PWM_Duty(FTM0,FTM_CH3,(uint32)(Speed_L_Last-MOTOR_DEAD_VAL_L)); //加入死区电压
FTM_PWM_Duty(FTM0,FTM_CH4,0);
}
else
{
FTM_PWM_Duty(FTM0,FTM_CH3,0);
FTM_PWM_Duty(FTM0,FTM_CH4,(uint32)(-Speed_L_Last-MOTOR_DEAD_VAL_L)); //加入死区电压
}
if(Speed_R >= 0) //angle大于0,向前,小于0,向后
{
FTM_PWM_Duty(FTM0,FTM_CH6,0);
FTM_PWM_Duty(FTM0,FTM_CH5,(uint32)(Speed_R_Last-MOTOR_DEAD_VAL_R)); //加入死区电压
}
else
{
FTM_PWM_Duty(FTM0,FTM_CH5,0);
FTM_PWM_Duty(FTM0,FTM_CH6,(uint32)(-Speed_R_Last-MOTOR_DEAD_VAL_R)); //加入死区电压
}
}
|
|