定时器编码器接口

前言:在我们需要用单片机来测量外部编码器接口或者外部的霍尔电机的旋转速度与方向时,如果使用中断来使得每转过一定角度就进中断来告诉单片机转过角度的时间,这样未免太过麻烦,占用了单片机很多的算力。所以外部的编码器接口就解决了这个问题。

一、编码器接口简介

编码器接口可接收增量编码器信号,根据正交编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的伪装,旋转方向和速度。每个高级定时器和通用定时器都拥有一个编码器接口,编码器接口的两个输入引脚借用了输入捕获的通道一和通道二。

图片来源江协科技

二、正交编码器的原理

 编码器旋转时会产生两个相位相差90度的正交信号,如上图,A相的频率可以推出旋转速度,AB相结合看可以推出旋转方向。

三、编码器接口的模式

一般使用在TI1和TI2上计数

手册里的实例

当TI1上升沿时,TI2是低电平,查表得知当前编码器为向上计数模式,为正转。

在毛刺之后,TI2是上升沿,TI1是低电平,查表得知编码器为向下计数模式,为反转。

### 使用 STM32 HAL 库初始化定时器编码器接口 为了使用 STM32 HAL 库初始化定时器编码器接口,需遵循特定的配置流程。这涉及多个组件之间的协调工作,包括从模式控制器、编码器接口以及触发控制器[^1]。 #### 初始化过程中的关键要素 - **硬件资源准备** 需要预先设定好与编码器连接的具体 GPIO 口,并确保这些端口已经正确映射到所选定时器通道上。 - **结构体定义** 创建 `TIM_HandleTypeDef` 类型变量来保存定时器句柄信息,该句柄将在后续操作中频繁用到。 ```c TIM_HandleTypeDef htim2; ``` - **参数配置** 对于编码器模式下的定时器而言,主要关注的是其输入捕捉功能及时基单元设置。通过修改对应寄存器值实现对增量式编码器A/B相脉冲信号的有效识别并计算位置变化量。 ```c htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK) { Error_Handler(); } ``` 上述代码片段展示了如何利用 `HAL_TIM_Encoder_Init()` 函数完成基本初始化工作。这里需要注意传递给此函数第二个参数应是指向 `TIM_Encoder_InitTypeDef` 结构体实例化后的指针,在其中指定编码方式(如四倍频)、滤波周期等细节属性[^2]。 #### 启动编码器模式 一旦完成了必要的初始化步骤之后,则可以通过调用如下所示的方法开启实际的数据采集活动: ```c HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); ``` 这段语句会激活关联定时器的所有相关中断服务程序(ISR),从而允许设备持续监测来自外部传感器的变化情况,并据此更新内部计数器状态。 #### 获取当前计数值和旋转方向 当应用程序逻辑需要获取最新的位移数据时,可以直接访问相应的API: ```c int16_t ecValue = __HAL_TIM_GET_COUNTER(&htim3); uint8_t direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); ``` 以上两行分别实现了读取当前位置偏移量(`ecValue`)及检测转动趋势(`direction`)的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Young member

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值