STM32F103三环PID伺服控制:双电机同步与抗干扰实战
去年接手一个工业小车的运动控制项目,客户要求两个直流伺服电机在负载变化时保持同步,位置误差不能超过2个编码器脉冲。最初用简单的P控制,轻载时还行,一旦加上5kg负载,一个电机明显滞后,手动调P参数要么振荡要么响应慢。这个问题让我重新审视PID——它不只是三个参数的组合,而是一套需要理解系统特性才能调好的控制逻辑。
STM32F103配合HAL库确实降低了开发门槛,但把PID从理论公式变成稳定运行的伺服系统,需要跨越物理建模、实时调度、抗干扰三个门槛。这次实验重点不是验证PID公式正确性,而是探索如何在资源有限的Cortex-M3芯片上实现双电机协同控制,并处理实际工程中的编码器噪声、计算延迟、电源波动等细节问题。
1. 从单环到三环:为什么伺服控制需要分层设计
1.1 位置式PID的直接局限
如果直接用位置式PID计算电机目标位置与实际位置的偏差,会出现两个典型问题。当目标位置突然变化时,由于积分项累积误差,电机会以最大速度冲刺,导致过冲机械冲击。而在负载突变时,位置环响应速度跟不上物理系统变化,表现为明显的滞后或振荡。
更本质的问题是,位置环PID输出直接对应电机电压,但没有考虑电机本身的动力学特性。比如电机转子惯性、减速比、摩擦阻力等因素,都会影响位置环的参数整定。这就是为什么单纯调位置环PID参数总感觉“碰运气”。
1.2 三环控制的物理意义
三环控制(位置环+速度环+电流环)实际上是把一个复杂控制问题分解成三个时间尺度的问题:
- 电流环(最内环):响应最快(通常10-100kHz),控制电机转矩,对抗负载突变
- 速度环(中间环):中等响应(1-10kHz),平滑转速变化,抑制扰动
- 位置环(最外环):响应最慢(100Hz-1kHz),保证最终定位精度
在STM32F103上,这三个环的计算需要安排在不同时间间隔的中断里。电流环需要最高优先级,通常放在PWM定时器中断;速度环放在编码器读取定时器中断;位置环可以放在主循环或低优先级定时器。
1.3 HAL库带来的抽象与代价
HAL库统一了STM32系列的外设操作接口,比如用HAL_TIM_Encoder_Start()开启编码器接口,用HAL_TIM_PWM_Start()启动PWM输出。这种抽象加快了开发速度,但也隐藏了底层细节。
例如,HAL库的编码器接口会自动处理计数方向,但默认使用32位计数器,而STM32F103的TIM2/TIM3/TIM4只有16位。当编码器高速旋转时,16位计数器很快会溢出,需要手动扩展为32位计数。这就是抽象带来的“认知陷阱”——看起来简单,但要稳定运行必须了解限制条件。
2. 硬件平台搭建与关键外设配置
2.1 电机驱动电路设计要点
实验采用TB6612FNG双H桥驱动芯片,比L298N效率更高、发热更小。关键连接包括:
- PWM输入:TIM1_CH1/TIM1_CH2,支持互补输出和死区控制
- 方向控制:GPIO输出,简单的高低电平控制正反转
- 电流检测:0.1Ω采样电阻+运放放大,接入ADC检测实时电流
特别要注意的是PWM频率选择。对于直流伺服电机,PWM频率太低(如1kHz)会导致电机啸叫,太高(如50kHz)则开关损耗增大。实验发现10-20kHz是比较理想的区间,既能保证电流平滑,又不会明显发热。
2.2 编码器接口的稳定性处理
STM32F103的定时器编码器模式可以自动识别正交信号方向,但工业环境中的编码器信号常伴有毛刺。配置时需要注意:
这种配置使用双沿计数,4倍频提高分辨率,但也更容易受噪声影响。实际测试中,添加了20pF电容进行硬件滤波,同时在软件中采用中值滤波算法处理计数值。
2.3 ADC电流采样的实时性保障
电流环要求最快的响应速度,因此ADC配置为规则组连续转换模式,使用DMA传输数据。关键配置参数:
- 采样时间:239.5周期(对应STM32F103的17.1us)
- DMA模式:循环模式,双缓冲交替读取
- 触发源:PWM定时器更新事件触发
这样确保每个PWM周期都能获取最新的电流值,为电流环计算提供及时反馈。
3. 三环PID算法的具体实现与参数整定
3.1 离散PID公式的实用变形
标准位置式PID公式:
在实际嵌入式系统中,需要处理积分饱和和微分冲击问题。实验采用改进公式:
这种变形显著改善了启动和制动时的控制性能。
3.2 三环优先级与计算时序安排
在20kHz的PWM中断中执行电流环计算,确保转矩控制的及时性。速度环放在1kHz的中断中,位置环则在200Hz的主循环中计算。这种多速率控制结构既保证了内环响应速度,又避免了不必要的计算负担。
具体实现时,使用标志位传递环间数据:
通过volatile关键字确保中断与主循环间的数据一致性。
3.3 参数整定的工程化方法
传统的Ziegler-Nichols方法在伺服系统中过于激进,实验采用更温和的整定流程:
电流环整定(最优先):
- 将Ki、Kd设为0,逐渐增大Kp直到电机开始轻微振荡
- 记录此时Kp值为Ku,振荡周期为Tu
- 按PI控制器设置:Kp = 0.45Ku, Ki = 0.54Ku/Tu
速度环整定:
- 电流环整定完成后,将速度环Kp从0开始增大
- 观察电机转速阶跃响应,追求快速无超调
- 加入积分消除静差,但积分系数要小
位置环整定:
- 前两环稳定后,位置环通常只需要较小的P增益
- 适当加入微分改善动态响应,但需注意噪声放大
整定过程中发现,理论计算值只能作为起点,最终参数需要在实际负载下微调。特别是摩擦非线性因素,仿真很难准确建模。
4. 双电机同步策略与抗干扰设计
4.1 主从同步与交叉耦合控制
简单的双电机独立PID控制无法解决负载不均导致的失步问题。实验对比了两种同步策略:
主从模式:一个电机作为主电机,其速度或位置作为另一个电机的设定值。这种方法实现简单,但从电机会始终滞后于主电机。
交叉耦合控制:实时计算两电机的位置差,将这个差值作为修正量同时反馈给两个电机PID控制器。修正量的权重系数需要根据机械结构确定,实验中发现0.3-0.5的效果较好。
实际采用混合方案:正常运行时使用交叉耦合控制保持同步,当位置差超过安全阈值时切换为主从模式强制同步。
4.2 编码器计数异常的处理机制
工业现场电磁干扰可能导致编码器计数跳变,出现突然的大幅度位置偏差。这种异常值如果直接进入PID计算,会引起电机剧烈抖动。设计了三层防护:
- 硬件层面:编码器信号线使用双绞线,接入RC滤波电路
- 驱动层面:配置定时器的输入滤波器,TIM3的IC1F[3:0]设置为0xF(16个时钟滤波)
- 软件层面:连续监测位置变化率,超过物理极限视为无效数据
4.3 电源电压波动的补偿
电池供电情况下,电压波动会影响电机转矩特性。实验发现电压从12V降到10V时,同样的PWM占空比输出转矩下降约15%。为此增加了电压前馈补偿:
同时监测电源电压,当电压过低时逐步降低目标速度,避免过流保护触发导致突然停机。
5. 系统性能测试与优化方向
5.1 稳态精度与动态响应测试
在空载和5kg负载两种情况下测试系统性能:
位置稳态误差:
- 空载:±1脉冲(编码器1000线,4倍频后±0.09°)
- 5kg负载:±2脉冲(满足设计要求)
阶跃响应(从0°到90°):
- 上升时间:空载120ms,负载150ms
- 超调量:<5%
- 调节时间:空载200ms,负载280ms
同步性能(双电机同时运动180°):
- 最大位置差:空载3脉冲,负载5脉冲
- 平均位置差:1.5脉冲
5.2 CPU负载与实时性分析
使用STM32F103的DWT周期计数器测量各任务执行时间:
- 电流环(20kHz):12us(占CPU时间24%)
- 速度环(1kHz):25us(占CPU时间2.5%)
- 位置环(200Hz):30us(占CPU时间0.6%)
- 总CPU负载:约27%,留有足够余量处理通信等任务
5.3 进一步优化方向
虽然当前系统满足基本要求,但从工业应用角度还有优化空间:
自适应PID:根据负载大小自动调整PID参数,目前参数是针对典型负载整定的,当负载变化范围较大时性能会下降。可以考虑基于模型参考自适应控制(MRAC)或模糊PID。
摩擦补偿:静摩擦和动摩擦的非线性影响明显,特别是在低速运行时。加入基于模型的摩擦补偿可以改善低速平稳性。
通信接口:当前使用USART传输调试数据,实际应用中可以改为CAN总线,提高抗干扰能力和传输距离。
安全机制:增加软件看门狗、过流保护、堵转检测等安全功能,确保系统在异常情况下安全停机。
这个实验最深的体会是,PID控制看似简单,但要达到工业级稳定性需要综合考虑硬件特性、实时调度、抗干扰等多个维度。三环结构提供了理论框架,但每个环节的实现细节都直接影响最终性能。STM32F103配合HAL库降低了开发门槛,但真正理解系统工作原理才能解决实际工程问题。