在电机控制领域,精确的速度测量往往是实现闭环控制的第一步。传统的外部中断计数方法不仅代码量大,还容易因信号抖动导致计数误差。STM32的硬件编码器接口配合CubeMX工具,能将原本复杂的脉冲计数逻辑简化为几个可视化配置步骤。本文将带您从零构建一个基于TIMx编码器模式的测速系统,揭秘四倍频的硬件实现原理,并分享实际项目中的参数优化技巧。
光电编码器通过AB两相方波的相位关系传递运动信息。当电机旋转时,编码器会产生两组相位差90°的脉冲信号(A相和B相)。传统软件计数需要捕获每个边沿信号,而STM32的定时器编码器模式将这一过程硬件化。
硬件编码器模式的三大优势:
提示:对于500线编码器,四倍频后每转可获得2000个计数脉冲,理论分辨率达到0.18度
典型编码器信号时序:
code复制正转时相序:A↑→B↑→A↓→B↓
反转时相序:B↑→A↑→B↓→A↓
进入Parameter Settings选项卡:
c复制/* 编码器模式配置示例 */
Slave Mode = Encoder Mode TI1 and TI2
Polarity = Rising Edge
IC1/IC2 Filter = 0xF (最大滤波)
配置陷阱规避:
在main.c中添加硬件初始化:
c复制HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
HAL_TIM_Base_Start_IT(&htim4); // 采样定时器
在stm32fxx_it.c中实现:
c复制void TIM4_IRQHandler(void) {
static int16_t last_count = 0;
int16_t current_count = (int16_t)TIM3->CNT;
int32_t delta = current_count - last_count;
// 处理计数器溢出
if(delta > 32767) delta -= 65536;
else if(delta < -32768) delta += 65536;
float rpm = (delta * 60.0f) / (ENCODER_PPR * 4 * SAMPLE_TIME);
last_count = current_count;
}
速度计算优化技巧:
rpm = 0.2*rpm_new + 0.8*rpm_old| 滤波器值 | 计数误差率 | CPU负载 |
|---|---|---|
| 0x0 | 12.5% | 1% |
| 0x7 | 3.2% | 1% |
| 0xF | 0.8% | 1% |
修改ENCODER_PPR定义:
c复制// 500线编码器(四倍频后2000脉冲/转)
#define ENCODER_PPR 500
// 1000线高精度编码器
// #define ENCODER_PPR 1000
在电机急停时,CNT寄存器可能溢出。解决方案:
c复制int32_t total_count = overflow_cnt * 65536 + current_count;
将速度测量扩展为位置控制:
c复制int32_t position = 0;
position += delta; // 在采样中断中更新
c复制float error = target_position - position;
float output = Kp*error + Ki*error_integral + Kd*(error-last_error);
在机器人项目中,这种方案可实现0.1mm级的位置控制精度。某四轴机械臂实际测试数据显示,采用1000线编码器时,重复定位精度达到±0.05度。