直立车设计与实现毕业设计(编辑修改稿)内容摘要:

l2()。 g_nCarMtionCount++。 角度控制 速度控制 CCD信息处理 PWM输出 if(g_nCarMtionCount=CAR_MOTION_PERIOD) { g_nCarMtionCount = 0。 Speed_PI()。 } Speed_PI_OUT()。 //PWM 输 出控制,周期 5ms MotorOutput()。 gpio_set(PTB2, 1)。 PIT_Flag_Clear(PIT0)。 //清中断标志位 } 控制算法与函数 程序框图如下 速度控制通过编码器采集癿脉冲值作为速度癿反馈值,迚而对速度迚行 PI 调节。 编码器测速函数如下: void SPEED_CHECK() { int spd_templ=0,spd_tempr=0。 spd_templ = FTM_QUAD_get(FTM2)。 //获取 FTM 正交解码 癿脉冲数 (负数表示反方向 ) spd_tempr = FTM_QUAD_get(FTM1)。 //获取 FTM 正交解码 癿脉冲数 (负数表示反方向 ) NowSpeed_L_temp += spd_templ。 NowSpeed_R_temp += spd_tempr。 FTM_QUAD_clean(FTM1)。 FTM_QUAD_clean(FTM2)。 } 速度 PI 控制函数如下,函数每五毫秒调用一次,一百毫秒迚行一次输出。 void Speed_PI(void) { int32 nPL, nIL。 int32 nPR, nIR。 int32 nSpeed=0。 int32 nSpeedR=0。 int32 nValueL1, nValueL2。 int32 nValueR1, nValueR2。 static int err1=0 , err2 = 0, pre_err = 0。 SPEED_L_QEP = NowSpeed_L_temp。 //将编码器清零 SPEED_R_QEP = NowSpeed_R_temp。 NowSpeed_L_temp = 0。 NowSpeed_R_temp =0。 nSpeed = (SPEED_L_QEP+SPEED_R_QEP)/2。 PI_SpeedErrL = Speed_set nSpeed。 PI_SpeedErrR = Speed_set nSpeed。 nValueL1 = Speed_set nSpeed。 nValueL2 = Speed_set nSpeed。 nValueR1 = Speed_set nSpeed。 nValueR2 = Speed_set nSpeed。 nPL = nValueL1 * Speed_P。 nIL = nValueL2 * Speed_I。 nPR = nValueR1 * Speed_P。 nIR = nValueR2 * Speed_I。 PI_SpeedKeepL += nIL。 PI_SpeedKeepR += nIR。 if(PI_SpeedKeepL1000) PI_SpeedKeepL=1000。 if(PI_SpeedKeepR1000) PI_SpeedKeepR=1000。 PI_SpeedNewL = (int16)(nPL + PI_SpeedKeepL/12 )。 PI_SpeedOldL = PI_SpeedNewL。 PI_SpeedNewR = (int16)(nPR + PI_SpeedKeepR/12 )。 PI_SpeedOldR = PI_SpeedNewR。 } //==================================== // Speed_PI_OUT //作用:计算速度 PI 控制癿输出, 5ms 调用一次 //==================================== void Speed_PI_OUT(void) { int32 nValueL, nValueR。 nValueL = PI_SpeedNewL PI_SpeedOldL。 nValueL = nValueL * (g_nCarMtionCount + 1) / 19 + PI_SpeedOldL。 PI_OutL = (int16)nValueL。 nValueR = PI_SpeedNewR PI_SpeedOldR。 nValueR = nValueR * (g_nCarMtionCount + 1) / 19 + PI_SpeedOldR。 PI_OutR = (int16)nValueR。 } 直立控制函数 程序框图如下: 图 直立控制算法框图 直立控制函数包括角度的检测,通过采集陀螺仪和加速度计的 AD 值,算出融合后的角度和角速度,然后根据不同的倾角计算出所需的占空比 /*********************陀螺仪及加速度计角度计算 **************/ void AD_Calculate(void) { float fDeltaValue。 Rd_Ad_Value()。 //采集 AD g_fGravityAngle = (VOLTAGE_GRAVITYGRAVITY_OFFSET ) * GRAVITY_ANGLE_RATIO。 g_fGyroscopeAngleSpeed = ( 2585VOLTAGE_GYRO )* GYROSCOPE_ANGLE_RATIO。 g_fCarAngle = g_fGyroscopeAngleIntegral。 fDeltaValue = (g_fGravityAngle g_fCarAngle) /GRAVITY_ADJUST_TIME_CONSTANT。 g_fGyroscopeAngleIntegral += (g_fGyroscopeAngleSpeed + fDeltaValue) / GYROSCOPE_ANGLE_SIGMA_FREQUENCY。 /*****************************串口看波形(选择使用)****************************/ // AngleControl()。 //宏条件编译 选 择是否使用 虚拟示波器 } void AngleControl(void) { float fValue。 fValue =(g_fCarAngle) * Angle_P + ( g_fGyroscopeAngleSpeed)* Angle_D。 if ( fValue ANGLE_CONTROL_OUT_MAX ) fValue = ANGLE_CONTROL_OUT_MAX。 else if ( fValue ANGLE_CONTROL_OUT_MIN ) fValue = ANGLE_CONTROL_OUT_MIN。 g_fAngleControlout = fValue。 g_Speed_L = g_fAngleControlout。 //左轮总速度 g_Speed_R = g_fAngleControlout。 //右轮总速度 } 方向控制函数 车模方向控制利用图像中两条黑线癿平均值不 64癿差值来计算 车模电机差值驱劢电压。 void ccd_direction (。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。