AB相增量式编码器以及STM32定时器编码器模式测速/测距离(HAL库)

本文详细介绍了STM32微控制器如何支持编码器,尤其是增量编码器的工作原理,涉及计数器、信号捕获、编码器模式以及STM32配置示例。同时讨论了不同编码器类型和处理方法,如滤波、中断处理与DMA的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

编码器(Encoder)是一种用于测量旋转运动或位置的设备。编码器通常与定时器模块一起使用,以便在微控制器中获取和计算旋转的脉冲数量,从而确定物体的运动方向和距离。编码器在许多应用中都很有用,例如机器人运动控制、电机位置反馈和位置传感。
STM32微控制器提供了多种类型的编码器支持,其中一种常见的编码器类型是增量编码器。增量编码器基于两个脉冲信号通道,通常称为A相和B相。当旋转发生时,这两个信号通道的相位关系会发生变化,从而可以计算出旋转方向和旋转的步数。STM32提供了硬件支持,使您可以使用定时器模块来捕获和计数编码器信号。以下是一些与STM32编码器相关的重要概念:
计数器值(Counter Value):这是定时器模块中的计数器,它记录了编码器信号的脉冲数量。计数器的增加和减少取决于编码器信号的变化。
计数方向(Counter Direction):计数器可以递增或递减,具体取决于编码器信号的变化。计数方向可以用于确定物体的旋转方向。
捕获:定时器可以配置为捕获编码器信号的状态,以便在脉冲信号变化时记录计数器的值。捕获允许您测量脉冲的时间间隔,从而用于速度和位置计算。
编码器模式(Encoder Mode):这是定时器模块的一个设置,用于指定它将用作编码器。编码器模式配置定时器的输入通道,使其能够捕获编码器信号。
编码器计数器(Encoder Counter):某些STM32型号提供了特殊的硬件编码器计数器,可直接处理编码器的信号和计数。

AB相编码器

AB相编码器,也称为正交编码器或增量式编码器,是一种常用于测量旋转位置和方向的设备。它基于两个输出信号通道,通常称为A相和B相,这两个信号在相位上相差90度,用于确定旋转方向和计数。

!!网上好多人这些编码器区分不出来 下面是总结!!

增量式编码器:

增量式编码器通常有两个输出通道,分别称为A相和B相,以及一个索引信号通道(有时可能没有)。
当旋转运动发生时,A相和B相信号的脉冲数量发生变化。这两个信号相位差90度,可以通过监测它们的变化来确定旋转方向和计数值。
增量式编码器的输出是增量脉冲,需要进行计数和积分以获得位置信息。可以使用两个通道的信号来测量速度。

正交编码器:

正交编码器也有A相和B相两个输出通道,这两个通道的信号脉冲相位差90度,就像增量式编码器一样。
与增量式编码器不同的是,正交编码器的输出已经是经过积分的位置信息,因此可以直接获取旋转位置。
正交编码器还可以提供一个Z相或索引信号,用于标记一个完整的旋转周期。

原理介绍:
在这里插入图片描述

在这里插入图片描述
可以通过判断其中一相上升/下降沿时,另一相是高或者低电平判断转动方向
在这里插入图片描述
常用最后一个,这里面的内容就是对应AB相的判断。比如图中FP1上升 FP2高电平,若1为A相2为B相,即A在上升时B在高电平,对应反转,因此向下计数。
在这里插入图片描述
编码器接口判断是正反转,控制CNT++或–。ARR设置为65535,这样CNT=0时一自减就变为65535,也可以转为有符号型直接折半变为正负65535/2。

STM32配置

主要配置:
在这里插入图片描述
几个重要参数:
预分配 :可以设置编码器输出脉冲是否分频
滤波:滤波消除毛刺,越大效果越好,看需求
下面是示例代码

#include "tim.h"

// 声明外部的 TIM_HandleTypeDef 结构体变量,该结构体变量在其他文件中定义
extern TIM_HandleTypeDef htim2;

// 初始化 TIM2 编码器
void MX_TIM2_Init(void)
{
   
   
  // 定义 TIM_Encoder_InitTypeDef 结构体变量,并初始化为 0
  TIM_Encoder_InitTypeDef sConfig = {
   
   0};
  // 定义 TIM_MasterConfigTypeDef 结构体变量,并初始化为 0
  TIM_MasterConfigTypeDef sMasterConfig = {
   
   0};

  // 设置 htim2 结构体的相关参数
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 2;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 65536;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  // 设置编码器模式和输入捕获相关参数
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 15;
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值