共计 1955 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 FOC(Field Oriented Control,磁场定向控制)系统中,电机转子的位置和转速反馈精度直接影响控制性能。传统的光电编码器虽然成本较低,但在实际应用中常遇到以下问题:

- 信号易受电磁干扰(EMI)影响,导致位置反馈异常
- 简单的脉冲计数方法会累积误差,长期运行可能导致控制失稳
- 高速旋转时容易出现脉冲丢失现象
这些问题对于新手来说尤其棘手,因为需要同时考虑硬件设计和软件算法的配合。
编码器选型
常见的旋转编码器主要有三种接口类型,它们的对比见下表:
| 参数 | ABZ 编码器 | SPI 编码器 | 绝对值编码器 |
|---|---|---|---|
| 接口复杂度 | 低 | 中 | 高 |
| 成本 | 低 | 中 | 高 |
| 抗干扰能力 | 中 | 高 | 高 |
| 分辨率 | 中等 | 高 | 很高 |
| 掉电保持 | 无 | 有 | 有 |
对于大多数 FOC 应用,ABZ 编码器在成本和实现复杂度上具有明显优势,是新手入门的理想选择。
硬件设计
正交解码电路
ABZ 编码器输出两路相位差 90 度的方波信号(A 相和 B 相),以及一个零位信号(Z 相)。在 STM32 上,我们可以使用定时器的编码器接口模式来解码这些信号。
- 连接 A 相和 B 相信号到定时器的 CH1 和 CH2 引脚
- 配置 TIM_EncoderInterfaceConfig 选择 TI1 和 TI2 模式
- 设置合适的滤波参数(TIM_EncoderMode_TI12)
消抖滤波电路
编码器信号可能因机械振动产生抖动,需要在硬件和软件上双重滤波:
- 硬件 RC 滤波:通常使用 100Ω 电阻和 100nF 电容构成低通滤波器,截止频率约 16kHz
- 软件滤波:在捕获中断中实现数字滤波算法
PCB 布局建议
- 编码器信号线应尽量短,并远离功率线路
- 使用差分走线方式(如果编码器支持差分输出)
- 在信号线附近布置良好的接地平面
核心算法
四倍频计数实现
// 使用 TIM3 作为编码器接口
void Encoder_Configuration(void)
{
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_SetAutoreload(TIM3, 65535); // 16 位计数器最大值
TIM_Cmd(TIM3, ENABLE);
}
转速计算
转速 ω 可以通过位置变化 Δθ 和时间间隔 Δt 计算:
ω = Δθ / Δt
在代码中,我们可以使用定时器捕获值和系统时钟来实现:
float Calculate_Speed(uint16_t prev_count, uint16_t curr_count, float delta_t)
{int32_t delta = (int32_t)curr_count - (int32_t)prev_count;
// 处理计数器溢出
if(delta > 32767) delta -= 65536;
else if(delta < -32768) delta += 65536;
// 假设编码器每转产生 N 个脉冲,四倍频后为 4N
const float pulse_per_rev = 4 * ENCODER_PPR;
return (delta / pulse_per_rev) * (2 * PI) / delta_t; // rad/s
}
位置补偿算法
当检测到 Z 信号时,可以进行位置校准:
void EXTI_Z_Handler(void)
{if(EXTI_GetITStatus(EXTI_LineZ) != RESET)
{TIM_SetCounter(TIM3, 0); // 重置计数器
position_offset = 0; // 清除累积误差
EXTI_ClearITPendingBit(EXTI_LineZ);
}
}
性能优化
PWM 频率对编码器捕获精度有重要影响。定时器的自动重载寄存器 (ARR) 应根据 PWM 频率设置:
ARR = (定时器时钟频率) / (PWM 频率) – 1
例如,对于 72MHz 时钟和 20kHz PWM:
ARR = 72,000,000 / 20,000 – 1 = 3599
避坑指南
1. 高速旋转时的脉冲丢失
解决方案:
– 使用更高分辨率的编码器
– 降低采样周期
– 实现预测算法补偿丢失的脉冲
2. 电源噪声导致的误触发
解决方案:
– 加强电源滤波
– 使用光耦隔离编码器信号
– 增加软件去抖算法
3. 零位信号的校准策略
解决方案:
– 每次上电后执行一次零位校准
– 运行中定期检查零位信号
– 结合霍尔传感器 (Hall Sensor) 提高初始位置检测可靠性
结论与思考
在实际应用中,编码器分辨率与系统实时性往往存在矛盾。更高的分辨率意味着更精确的控制,但也需要更强的处理能力。作为开发者,我们需要根据具体应用场景找到平衡点。
一些值得思考的问题:
– 如何在不增加硬件成本的情况下提高位置检测精度?
– 在多电机协同控制中,如何确保各编码器的同步性?
– 当编码器故障时,有哪些可靠的备用方案可以保证系统安全?
这些问题没有标准答案,需要在具体项目中不断探索和实践。希望本文能为初入 FOC 控制领域的开发者提供有价值的参考。
