当前位置: 首页 > news >正文

高级定时器的解码器模式

解码器模式(Encoder Interface Mode)

 是高级定时器的一种功能,用于直接读取正交编码器(如旋转编码器)的输出信号,自动跟踪脉冲变化并计算方向与计数值,无需CPU频繁干预,适用于电机控制、位置检测等场景。

1. 配置编码器输入的GPIO引脚,设置为输入模式,并映射到定时器的通道。

2. 配置定时器为编码器模式,选择编码器接口的工作方式(例如,仅在TI1的边沿计数,或者TI1和TI2的边沿都计数)。

3. 设置自动重装载值,确定计数器的范围。

4. 启用定时器,开始计数。

5. 通过读取计数器的值来获取位置信息,或者结合溢出中断来计算速度。

联想解释

想象你有一个旋转编码器(类似自行车码表)

它通过两个信号线(A相和B相)告诉你转了多少圈、往哪边转。
高级定时器的解码器模式就像一个“自动计步器”

  • 自动数步子:每转一步(一个脉冲),定时器自动加减计数。
  • 判断方向:根据A、B相信号的先后顺序,自动判断是正转还是反转。
  • 实时更新:CPU不用一直盯着,定时器自己默默计数,你随时可以问它:“现在走到哪了?”

STM32 HAL库配置 

步骤1:配置编码器输入引脚

// 配置编码器A相(TI1)和B相(TI2)的GPIO为输入模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;  // 假设PA8(TI1)、PA9(TI2)
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;        // 复用推挽模式
GPIO_InitStruct.Pull = GPIO_PULLUP;            // 上拉电阻防干扰
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;     // 映射到TIM1
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

步骤2:配置定时器为编码器模式

TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;  // 使用高级定时器TIM1
htim1.Init.Prescaler = 0;           // 不分频(直接计数)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 实际方向由编码器信号决定
htim1.Init.Period = 65535;          // 自动重装载值(最大计数范围)
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

// 配置编码器接口
TIM_Encoder_InitTypeDef sEncoderConfig;
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;  // 同时使用TI1和TI2边沿
sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // A相上升沿触发
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // A相映射到TI1
sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;       // 无分频
sEncoderConfig.IC1Filter = 0x0;                     // 无滤波

sEncoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING; // B相上升沿触发
sEncoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; // B相映射到TI2
sEncoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC2Filter = 0x0;

HAL_TIM_Encoder_Init(&htim1, &sEncoderConfig);

步骤3:启动编码器接口

HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);  // 开启TIM1的编码器模式

步骤4:读取计数值

int32_t current_count = __HAL_TIM_GET_COUNTER(&htim1); // 获取当前计数值

步骤5(可选):处理溢出

// 开启溢出中断
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);

// 在中断回调函数中处理溢出
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM1) {
        // 记录溢出次数,扩展计数范围
        overflow_count++;
    }
}

关键参数说明

参数作用
EncoderMode编码器模式:TIM_ENCODERMODE_TI1(仅A相)、TIM_ENCODERMODE_TI2(仅B相)、TIM_ENCODERMODE_TI12(双相)
IC1PolarityA相信号触发边沿(上升沿/下降沿)
IC1Filter输入滤波值(0~15),用于去抖动
Period自动重装载值,决定计数范围(如65535对应16位计数器)

相关文章:

  • upload-labs-靶场(1-19关)通关攻略
  • python-leetcode 50.岛屿数量
  • 颤抖:quiver,shiver,tremble的区别
  • 火绒终端安全管理系统V2.0--分层防御之行为拦截层
  • Benewake(北醒) 快速实现TF-NOVA IIC接口与电脑通信的操作说明
  • 电子文档安全管理系统 V6.0 resources/backup存在任意文件下载漏洞(DVB-2025-8794)
  • 数据结构与算法:归并排序
  • AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静
  • 2025-03-12 学习记录--C/C++-PTA 习题10-11 有序表的增删改查操作
  • 论数组去重之高效方法
  • ai讲angular rxjs
  • [023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级
  • C++ 中的 static_assert 编译期断言使用
  • AnythingLLM的局域网发布
  • CLR中的marshal_as 介绍
  • MPAndroidChart的MarkerView和CursorLineChartRenderer同步显示当前触摸的数据点
  • JavaScript泄露浏览器插件信息引发的安全漏洞及防护措施
  • Android内存泄漏检测与优化
  • 【AI学习】关于Kimi的MoBA
  • L1-054 福到了
  • 男子不满和睦家医院手术效果还遇到了“冒牌医生”?院方回应
  • 哲学新书联合书单|远离苏格拉底
  • 中国创面修复学科发起者之一陆树良教授病逝,享年64岁
  • 对话郑永年:我们谈判也是为世界争公义
  • 商务部召开外贸企业圆桌会:全力为外贸企业纾困解难,提供更多支持
  • 何立峰:中方坚定支持多边主义和自由贸易,支持世贸组织在全球经济治理中发挥更大作用