![]() |
|
根据NANO驱动板的原理图,找到两路电机对应的四路编码器接口对应STM32上的IO口,并找到其对应的定时器进行模式配置。如下图所示,使用的两路电机的编码器分别对应到定时器2和定时器3。
在STM32CubeMX中找到定时器2与定时器3,进行模式配置。以下以定时器2为例,定时器3只需进行相同配置即可。选择定时器为编码器模式,设置为不分频,Z大计数值为65535,使能自动重装载,并选择TI1和TI2两路输入,实现四倍频效果。
配置完定时器2和定时器3后,需要再使用一个定时器,利用其产生50ms中断来读取当前的小车速度值,本次例程中采用定时器6产生中断。 周期为50ms,计算方法为 :T=(arr+1)*(psc+1)/Tclk
当然,不要忘记了电机驱动的配置,毕竟还是得先动起来才能更好的检验其测速功能,电机的相关配置和驱动具体可参考上一篇文章。 完成配置后,由STM32CubeMX自动生成初始化代码,选择合适的编译器打开当前功能,进行驱动功能的程序开发。以下主要对编码器测速的相关代码进行解释,其余具体代码可参考例程文件。
hort encoderPulse[2]={0}; /** * @brief 读取定时器2和定时器3的计数值(编码器脉冲值) * @retval None */ void GetEncoderPulse() { encoderPulse[0] = -((short)__HAL_TIM_GET_COUNTER(&htim2)); //配合小车轮子运动方向,进行取反操作 encoderPulse[1] = -((short)__HAL_TIM_GET_COUNTER(&htim3));
__HAL_TIM_GET_COUNTER(&htim2) = 0; //计数值重新清零 __HAL_TIM_GET_COUNTER(&htim3) = 0; } /** * @brief 根据得到的编码器脉冲值计算速度 单位:m/s * @retval 速度值 */ float CalActualSpeed(int pulse) { return (float)(0.003092424 * pulse); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //定时器6中断回调函数,每50ms调用一次 { float c_leftSpeed,c_rightSpeed; if(htim==(&htim6)) { GetEncoderPulse(); c_leftSpeed = CalActualSpeed(encoderPulse[0]); //获得当前的速度值 c_rightSpeed = CalActualSpeed(encoderPulse[1]); } } 将程序下载到STM32机器人控制板上,通过串口与上位机进行通信,使用串口调试助手可观察到在不同PWM值下,小车的运动速度。 通过上述介绍的使用定时器的编码器模式读取编码器的脉冲值,Z终得到实际的小车运行速度。可以看到,在实际运行时,即使控制的PWM信号占空比一致,左右电机的转速仍存在一定的偏差。为了使速度更稳定以及调速效果响应更迅速和顺滑,可以加入PID算法,对电机的转速进行控制。 |
| 推荐信息 |
| »两轮四轮差速及阿克曼移动底盘设计转向机器人/小车 |
| »动手实现一台阿克曼ROS小车 |
| »四轮驱动机器人的转向方式是什么 |
| »全向轮运动模型规律-量化分析三个全向轮转速与移动平台中心点运动速度的关系 |
| »三轮全向轮移动平台坐标系说明示意图 |
| »麦克纳姆轮运动速度分解-麦轮平台运动学模型分析 |
| »麦克纳姆轮受力分析-受力方向为轮毂坐标系y轴正方向 |
| »麦克纳姆轮构型由轮毂和辊子组成 |
| 版权所有 © 北京创泽智慧机器人科技有限公司 地址:北京 清华科技园C座五楼 电话:4006-937-088 京ICP备20010582号-2 |