电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
EC11正交增量编码器
分 享
扫描二维码分享
EC11正交增量编码器
STM32
增量编码器
STM32ZET6
关注
发布时间: 2020-11-17
丨
阅读: 1511
本文介绍EC11正交编码器,采用stm32的定时器编码器模式,可以读出编码器正反转和转的个数。 ### 下面是实物图: ![增量编码器实物图](https://cf05.ickimg.com/bbsimages/202011/cc58cc0763273fa50c23acfed3626b74.png "增量编码器实物图") 这种有两个引脚是A,B相,中间是公共端,还有一路开关的两个引脚,可以当按键使用。 在转动的时候会输出一些脉冲。 ### 下面是输出的时序图 ![](https://cf05.ickimg.com/bbsimages/202011/e3db4019346a49c7b57e9c5551cacc46.png) 可以知道: 顺时针旋转时,一个周期输出11 10 00 01 逆时针旋转时,一个周期输出11 01 00 10 所以根据这个可以知道编码器正反转了。 这个是编码器转一小格的输出,然后根据有几个周期推出转动的格数,从而也可以计算出对应角度。因为这个是增量式编码器,所以要人为规定零点,与绝对值编码器一个角度对应一个值不一样。 ### 接下来介绍如何用stm解码: 这里采用stm定时器的编码器模式来解码。用中断模式也可以,配置边沿触发,然后判断电平的值,然后进而推出旋转方向,但是不推荐,因为这样的话,旋转的时候会频繁进入中断,导致主程序就阻塞,太消耗cpu。 ![](https://cf05.ickimg.com/bbsimages/202011/eb0da45fcd5a865c3f46ec6f932eb9ff.png) 我们将A,B两相接入某个定时器的CH1,CH2中,然后公共端接GND ![](https://cf05.ickimg.com/bbsimages/202011/43ad600bf571126e79afcdf21264e607.png) stm32编码器自带毛刺滤除,这点还是很不错的。 ### 第一步:配置GPIO 这里我用的是TIM2的CH1,2,查手册对应的引脚是PA0,1(STM32F10x系列),引脚配置为上拉输入,当然外加硬件上拉电阻也行。 ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //引脚(A、B) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` ### 第二步:配置定时器 ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 0; //预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period = 100; //定时周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ``` 编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMX_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计 数)。所以在开始计数之前必须配置TIMX_ARR。 TIM_TimeBaseStructure.TIM_Period = 100 就是配置ARR的值,可以根据自己编码器旋转一周的脉冲数来选择大小。 ### 第三步:配置编码器模式 stm32提供了一个API,直接调用即可。 ```c TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling); TIM_SetCounter(TIM2, 50); TIM_Cmd(TIM2, ENABLE); ``` TIM_EncoderInterfaceConfig第二个参数是编码器的模式设置,有TIM_EncoderMode_TI1 ,TIM_EncoderMode_TI2 ,TIM_EncoderMode_TI12三种 分别表示:计数器计数TI1FP1边缘取决于TI2FP2电平,计数器计数TI2FP2边缘取决于TI1FP1电平,计数器计数的TI1FP1和TI2FP2边缘。选择前两个是每一个周期计数器加或减2次,第三个是加或减4次。 第三,四个参数是选择上下沿触发方式,都选下降沿即可。 可以先给计数器写个50,就是ARR的一半方便后面处理。 ### 不要忘记使能时钟哦 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ``` ### 读方向和脉冲 编码器的方向可以由TIM的寄存器CR1中DIR位读出,0:计数器向上计数;1:计数器向下计数。 ```c void ENCODER_Read(uint8_t *Dir, uint16_t *Cnt) { *Dir = ((TIM2->CR1) & TIM_CR1_DIR)>>4; *Cnt = TIM_GetCounter(TIM2); } ``` 这里采用指针读出两个数据。 别忘了在主函数调用初始化函数 ```c u8 dir=1; u16 cnt=0; ENCODER_Read( &dir, &cnt); ``` ### 编译下载,在串口调试助手查看状态 ![](https://cf05.ickimg.com/bbsimages/202011/6b11a2ff5638f50f736f9816a89ed6c7.png) 顺时针旋转,dit=1,且每个周期计数器减2,逆时针反之。 ### 逻辑分析仪捕捉的波形: ![](https://cf05.ickimg.com/bbsimages/202011/7eda596220d29bcb06537cc43651b155.png) 与上面分析一致。 我们可以写一个函数判断dir的值,从而去做一些事,比如改变灯的亮度什么的,比用两个按键加或减方便多了,还有一般这种编码器自带一个按键,中间可以按下去的,可以作为确定键来用,当我们调到所需的值后就可以按下确认了。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
STM32ZET6
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交