问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32入门教程:TIM编码器接口详解

创作时间:
作者:
@小白创作中心

STM32入门教程:TIM编码器接口详解

引用
CSDN
1.
https://blog.csdn.net/weixin_61733189/article/details/143097233

TIM编码器接口是一种重要的硬件接口,主要用于接收增量(正交)编码器的信号。以下是对TIM编码器接口的详细介绍:

一、功能与作用

TIM编码器接口可以接收由编码器旋转产生的正交信号脉冲。这些信号脉冲被用来自动控制一个计数器(CNT)的自增或自减,从而能够指示编码器的位置、旋转方向和旋转速度。

二、结构与工作原理

  1. 结构
  • 每个高级定时器和通用定时器都拥有一个编码器接口。
  • 编码器接口的两个输入引脚通常借用了输入捕获的通道1和通道2。这意味着通道3和通道4不能用于编码器接口。
  1. 工作原理
  • 编码器旋转时,会产生两个相位相差90°(超前或滞后)的正交信号,分别代表编码器的正转和反转。
  • 当出现某个边沿信号时,编码器接口会根据另一相的状态来确定计数的增减(即计数方向)。
  • 如果对应另一相的状态出现在正转的表中,那么计数值自增;如果出现在反转的表中,那么计数值自减。

三、优势与特点

  1. 高精度:正交信号的频率更高,因为A相和B相都可以用于计次,所以计次频率提高了一倍,从而提高了测量的精度。
  2. 抗噪声:正交信号具有抗噪声的能力。如果一个信号不变,而另一个信号连续跳变(即产生了噪声),那么计次值是不会发生变化的。
  3. 方向控制:编码器接口能够根据编码器的旋转方向,自动控制计数器的计数方向。这使得它能够同时测量旋转速度和旋转方向。

四、应用与实例

TIM编码器接口通常应用于需要测量旋转速度和方向的场景,如电机控制项目。使用PWM驱动电机,并使用编码器测量电机的速度,然后利用PID算法进行闭环控制。通过定时器的编码器接口自动计次,可以节约软件资源,提高系统的效率和稳定性。在具体应用中,可以通过配置定时器的相关寄存器来初始化编码器接口,并设置其工作模式、输入捕获单元的滤波器和极性等参数。然后,通过读取计数器的值来获取编码器的位置和速度信息。

正交编码器:

旋转编码器

用来测量位置、速度或旋转方向的装置当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号和频率和相位信息即可得知旋转轴的速度和方向。

类型:机械触点式、霍尔传感器、光栅式

编码器电机一般有六根线,最左和最右是直接接到电机的靠里一些的两根线是编码器电源,最中间的两根线就是A相和B相的输出了。

参考实验:

编码器接口测速

基本原理

编码器测速本质上是通过测量编码器输出的脉冲信号来确定设备的运动速度。编码器通常与旋转设备的驱动轴或线性运动轴连接,可以检测设备的运动并产生相应的电信号。这些信号包括脉冲序列,每个脉冲代表一定的角度增量或线性位移。

在STM32等微控制器中,通常使用定时器捕获这些脉冲的上升沿或下降沿,通过计数器的增加或减少来计算电机的速度。编码器接口测速就是基于这个原理实现的。

配置步骤

以STM32为例,编码器接口测速的配置步骤通常包括以下几个方面:

  1. RCC开启时钟:首先,需要开启GPIO和定时器的时钟。这是为了确保相关外设能够正常工作。
  2. 配置GPIO:将编码器的输出引脚连接到STM32的GPIO引脚上,并配置这些引脚为输入模式。通常,会选择上拉输入模式以提高抗干扰能力。
  3. 配置时基单元:设置定时器的预分频器、自动重装载寄存器等参数。这些参数决定了计数器的计数范围和计数频率。
  4. 配置输入捕获单元:虽然编码器接口主要使用通道1和通道2的滤波器和极性选择,但仍然需要配置输入捕获单元的相关参数,如滤波器和极性。
  5. 配置编码器接口模式:调用库函数配置编码器接口模式,如选择TI1和TI2作为编码器输入通道,并设置相应的电平极性。
  6. 启动定时器:最后,启动定时器并开始计数。此时,编码器接口的计数器会随着编码器的旋转而自动增加或减少。

接线图

示例代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"
int16_t Speed;			//定义速度变量
int main(void)
{
    /*模块初始化*/
    OLED_Init();		//OLED初始化
    Timer_Init();		//定时器初始化
    Encoder_Init();		//编码器初始化
    
    /*显示静态字符串*/
    OLED_ShowString(1, 1, "Speed:");		//1行1列显示字符串Speed:
    
    while (1)
    {
        OLED_ShowSignedNum(1, 7, Speed, 5);	//不断刷新显示编码器测得的最新速度
    }
}
/**
  * 函    数:TIM2中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断
    {
        Speed = Encoder_Get();								//每隔固定时间段读取一次编码器计数增量值,即为速度值
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位
                                                            //中断标志位必须清除
                                                            //否则中断将连续不断地触发,导致主程序卡死
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号