当前位置:底盘 >> 行业资讯    

STM32CubeMX配置及测速驱动代码

编辑:创泽底盘      发布时间:2022/9/1      来源:COONEO

根据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