打印
[STM32F1]

STM32定时器编码器模式应用

[复制链接]
658|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.正交编码器原理什么是正交?如果两个信号相位相差90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向。如下图所示。编码器输出两个脉冲信号TI1和TI2,TI1超前TI2 90度时,向上计数;TI2超前TI1 90度时,向下计数。
  
编码器的应用很多,最常用的就是电机测速,以及各种仪器上的旋钮等。

2.STM32CubeMX配置
以STM32F103C8T6为例,该单片机有4个定时器,每个定时器都可以配置为编码器模式,用于编码器计数。以TIM1为例,配置如下:

配置成定时器模式 Combined Channels为Encoder Mode,可以看到,配置后定时器的通道1和通道2已经被禁用,因为编码器模式使用的就是通道1和通道2,这个是固定的,通道3和通道4不可配置为编码器模式,硬件设计时要注意。
分频系数Prescaler为0,计数周期Counter Period为65535,下面的Encoder Mode 可以是TI1、TI2或者TI1 and TI2,TI1 and TI2 就是两个脉冲都计数,结果是前两种配置的两倍。
另外需要注意的是,有的编码器是OC/OD输出的,没有上拉电阻,因此硬件上外加上拉电阻,或者在软件上使能编码器引脚的内部上拉。


3.程序编写
配置完成后点击生成代码即可,编码器的使用方式也很简单,在初始化后开启编码器:
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
调用__HAL_TIM_IS_TIM_COUNTING_DOWN 函数可以获得编码器的转向 0为正、1为负
Dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1);
调用 __HAL_TIM_GET_COUNTER函数可获取编码器的脉冲数。
Count1 = __HAL_TIM_GET_COUNTER(&htim1);
如果是电机测速的应用,根据获取的脉冲数、编码器的参数以及两次脉冲数的时间差,即可判断出电机的转速。需要注意的是,定时器为16位,存在溢出的可能,用户要根据自己需求开启定时器溢出中断,在中断中再进行软件计数。

4.总结
相比如没有编码器模式的单片机,需要自己编写程序,STM32定时器的编码器模式使用非常简单,唯一不足的是16位定时器,在某些要求高的应用时显得不是那么方便。
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。




使用特权

评论回复
沙发
yangjiaxu| | 2021-2-19 10:39 | 只看该作者
还是hal 开发比较快呀

使用特权

评论回复
板凳
zhang062061|  楼主 | 2021-2-19 10:55 | 只看该作者
yangjiaxu 发表于 2021-2-19 10:39
还是hal 开发比较快呀

是的  很方便

使用特权

评论回复
地板
xiaoqizi| | 2021-3-2 23:19 | 只看该作者
何种定时器可以实现啊

使用特权

评论回复
5
木木guainv| | 2021-3-2 23:21 | 只看该作者
只有高级定时器可以实现吧

使用特权

评论回复
6
磨砂| | 2021-3-2 23:24 | 只看该作者
这是一个研究群吗

使用特权

评论回复
7
晓伍| | 2021-3-2 23:26 | 只看该作者
介绍的还是非常详细的

使用特权

评论回复
8
八层楼| | 2021-3-2 23:30 | 只看该作者
用这个工具配置还是非常省事的

使用特权

评论回复
9
zhang062061|  楼主 | 2021-3-3 20:38 | 只看该作者
xiaoqizi 发表于 2021-3-2 23:19
何种定时器可以实现啊

通用定时器就行

使用特权

评论回复
10
zhang062061|  楼主 | 2021-3-3 20:38 | 只看该作者
木木guainv 发表于 2021-3-2 23:21
只有高级定时器可以实现吧

通用定时器就能实现

使用特权

评论回复
11
zhang062061|  楼主 | 2021-3-4 11:17 | 只看该作者
磨砂 发表于 2021-3-2 23:24
这是一个研究群吗

这是我的微信公众号,欢迎关注

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

41

帖子

0

粉丝