理论
图解编码器结构
编码器本质上还是TIM输入捕获的应用
基本原理
电机转动一圈,通过霍尔编码器的A、B两项输出一定数量的脉冲
我们可以根据一定时间内捕获到的脉冲数,计算出这段时间的平均速度
电机与编码器参数
减速比
齿轮比
也即电机输出轴(主轴 车轮轴)转1圈时,电机的原始驱动轴转10圈
有助于增加输出扭矩,提高车轮驱动力
编码器脉冲数
电机转一圈产生的脉冲数
车轮一圈对应的脉冲数
电机驱动轴转动一圈产生的脉冲数 = 分频数 * 编码器线数(电机一圈产生脉冲数)
车轮转动一圈产生的脉冲数 = 分频数 * 编码器线数* 电机减速比
故,驱动轴转1圈 脉冲数 = 11 * 4 = 44
故,车轮转1圈 脉冲数 = 11 * 10 * 4 = 440
PS:
编码器脉冲数,也即编码器线数,也即电机转一圈会产生的脉冲数
电机减速比,也即齿轮比
分频数,当编码器模式配置为TI1 and TI2时,为"4分频"
应用
CubeMX配置
Keil5代码
编码器初始化代码
由CubeMX自动生成
开启编码器
//开启编码器
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);
注意,根据你具体配置情况传入参数,两个通道都要开启
PS:这个代码可以直接放到TIM的Encoder初始化函数中,在初始化的最后,直接开启编码器
读取计数器的值
//读取计数器的值
int Read_Encoder(void)
{
int Encoder_Cnt;
//读取计数器的值((short)做截断,使得正转为正数,反转为负数
Encoder_Cnt = (short)__HAL_TIM_GET_COUNTER(&htim2);
//清除计数器的值
__HAL_TIM_SET_COUNTER(&htim2,0);
return Encoder_Cnt;
}
中断 读取并打印脉冲数
//每0.5s进一次中断,打印这0.5s内捕获到的脉冲数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim3)
{
printf("%d",Read_Encoder());
}
}
常见错误
计数器值恒为0
- 接线错误,注意编码器电源的正负极之分,编码器电源指示灯需要亮起,否则编码器不工作
- 未调用开启编码器函数,编码器不工作
计数器值异常
- 读取计数器值的函数,最后需置0,否则读取的是”路程“,而非”速度“