介绍
编码器(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