【STM32 HAL库】编码器测速

理论

图解编码器结构

编码器本质上还是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,否则读取的是”路程“,而非”速度“
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值