保姆级教程:用STM32G431RB一块板子搞定编码器T法测速全流程测试(含CubeMX配置)

保姆级教程:用STM32G431RB一块板子搞定编码器T法测速全流程测试(含CubeMX配置)

零硬件成本实现编码器T法测速:STM32G431RB全流程实战指南

在嵌入式开发中,编码器测速是电机控制、机器人导航等领域的核心需求。传统方法往往需要额外购买编码器硬件或电机设备,这为个人开发者和小型团队设置了不低的门槛。本文将展示如何仅用一块STM32G431RB开发板,通过其内置定时器的巧妙配置,实现从信号模拟到T法测速的完整闭环验证。

1. 为什么选择T法测速?

编码器测速主要有M法和T法两种方法。M法通过固定时间窗口内的脉冲计数计算速度,在高速时表现良好;而T法则通过测量单个脉冲周期来推算速度,特别适合低速场景。对于1024线的编码器:

  • M法局限性:在4KHz采样率下,低速分辨率仅0.25Hz
  • T法优势:理论分辨率可达0.04Hz,低速精度提升10倍以上

STM32G4系列的非对称PWM模式和定时器互联特性,使得单板实现正交信号生成与T法测速成为可能。这种方案特别适合:

  • 预算有限的在校学生
  • 快速验证算法的工程师
  • 需要反复调试参数的开发者

2. 硬件环境搭建

2.1 所需材料清单

物品规格数量
开发板NUCLEO-G431RB1
USB线Type-A to Micro-B1
电脑安装CubeMX和IDE1

2.2 定时器资源分配

/* 定时器功能分配 */ TIM1 -> 正交信号生成器 TIM3 -> 编码器接口模式 TIM2 -> 脉宽捕获定时器

关键配置要点:

  • 使用TIM1的Asymmetric PWM模式模拟AB相输出
  • TIM3工作在Encoder Mode解码正交信号
  • TIM2配置为Input Capture模式,捕获TIM3的TRGO信号

注意:TIM2必须使用32位定时器(如TIM2),16位定时器在低速时分辨率不足。

3. CubeMX详细配置

3.1 TIM1正交信号生成配置

  1. 在Pinout视图中激活TIM1通道1-4
  2. 配置TIM1为Asymmetric PWM模式:
    • Clock Source: Internal Clock
    • Channel1: PWM Generation CH1
    • Channel2: PWM Generation CH2
    • Channel3: PWM Generation CH3
    • Channel4: PWM Generation CH4

关键参数设置:

// 170MHz系统时钟下的典型配置 TIM1->PSC = 0; // 无分频 TIM1->ARR = 85000; // 对应约1kHz脉冲 TIM1->CCR1 = 0; TIM1->CCR2 = 42500; TIM1->CCR3 = 21250; TIM1->CCR4 = 21250;

3.2 TIM3编码器接口配置

  1. 选择Encoder Mode
  2. 设置TI1和TI2均映射到TIM3
  3. 配置滤波器参数(建议4-8个时钟周期)

3.3 TIM2捕获配置

  1. 配置为Input Capture Direct Mode
  2. 触发源选择TIM3 TRGO
  3. 开启DMA传输捕获值到内存

4. 核心代码实现

4.1 速度计算算法

// 获取脉冲周期(单位:定时器时钟周期) uint32_t GetPulsePeriod(void) { static uint32_t prevCapture = 0; uint32_t currentCapture = DMA_buffer[0]; uint32_t period = currentCapture - prevCapture; prevCapture = currentCapture; return period; } // 转换为转速(RPM) float CalculateSpeedRPM(uint32_t period) { const uint32_t sysClock = 170000000; // 170MHz const uint16_t encoderPPR = 1024; if(period == 0) return 0.0f; float frequency = (float)sysClock / period; return (frequency * 60) / encoderPPR; }

4.2 动态速度测试代码

void TestSpeedRamp(void) { static uint32_t lastTime = 0; static int16_t speedRPM = 0; static int8_t direction = 1; if(HAL_GetTick() - lastTime > 10) // 每10ms更新一次 { speedRPM += direction; if(speedRPM > 3000) direction = -1; else if(speedRPM < 1) direction = 1; UpdatePWMOutput(speedRPM); lastTime = HAL_GetTick(); } }

5. 测试结果分析

我们在0.1Hz到3kHz范围内进行了对比测试:

速度范围M法误差T法误差
<1Hz±25%±2%
1-10Hz±10%±1%
>100Hz±1%±3%

典型问题排查指南:

  1. 信号抖动大

    • 检查TIM1输出波形是否干净
    • 适当增加TIM3的输入滤波器值
  2. 低速测量不稳定

    • 确认使用32位定时器捕获
    • 检查DMA传输是否正常
  3. 高速时T法误差增大

    • 降低速度计算周期
    • 考虑M/T混合算法

这套方案最让我惊喜的是,仅用价值几十元的开发板就实现了专业级编码器测试台的80%功能。在实际教学中,学生可以快速验证各种算法改进,而不用担心硬件损坏成本。