xTepper - FOC混合伺服步进驱动
>/0 前言
基于磁场定向控制(FOC)的电机驱动技术已成为机电系统高精度运动控制领域的核心研究方向之一。步进电机足够便宜、结构简单、定位精度较高,是很多桌面级设备和个人项目里最容易上手的执行机构;但一方面多数情况下控制精度直接与细分数关联,难以兼顾速度和分辨率;另一方面A4988这种恒流驱动,电流给小了带不动负载,电流给大了发热巨大,不能自动跟随负载变化。
2023年电赛准备阶段,我曾用STM32F103+A4988做了一个比较简单的步进驱动,使用一条I2C总线控制多个步进电机、并将驱动板和编码器放在一起;复盘一下,发现仍存在很大的局限性,使用STM32G4+H桥驱动进行重构了。问就是以前没见过世面
>/1 改进思路
-
用一条总线控制多个电机 I2C给板级用用差不多得了,给电机这种东西不行。还是得RS-485或者CAN。
-
位置编码器方案 从AS5600更换为MT6701,SPI/SSI速度更快。
-
驱动方案 以往使用A4988只是将编码器、驱动等“打包”在一起,想要实现更高效的控制,就直接将电机的两相作为H桥控制。使用DRV8701作为栅极驱动器,独立控制A、B相。每相由四颗 N 沟道 MOSFET 组成 H 桥结构,两相合起来构成完整的步进电机驱动。PH 决定电流方向,EN 输入 PWM 用来控制电流幅值,而 SLEEP 则可以在必要时直接关断整桥。
从“给脉冲”到“控制磁场”:
-
传统步进驱动的思路非常直接。给一个脉冲,走一步;想更细一点,就把一步拆成更多的小步。这种方式的一个隐含前提是:电机并不知道自己现在在哪。 它只是在假设——假设负载不大、假设没有打滑、假设前面的每一步都成功执行了。
-
FOC 关心转子磁场和定子磁场的相对角度。只要实时知道转子的位置,并且能精确控制定子电流的方向和幅值,就可以让电机始终工作在最理想的电磁状态下。因此给步进电机加上传感器、引入闭环控制。FOC 算法计算出的结果本质上就是一个电压矢量,而这个矢量最终可以被自然地映射成 PWM 占空比和方向信号。
- 核心方案 驱动系统的核心选用了 STM32G4,面向电机控制应用高度优化,含有高分辨率 PWM、CORDIC、FMAC、片内 OPAMP 和 PGA等外设,为功率驱动、电流采样、变换运算等提供助力。
/2> 一些细节
电流采样
在这块板上,我采用了 DRV8701E 支持的低端采样方式。采样电阻位于 H 桥底端,采集到的电压信号经过芯片内部固定 20 倍放大后,再送入 STM32G4 的可编程增益放大器(PGA)。这样可以节省掉一片运放,使用原有的器件处理模拟信号链路,把信号幅度调整到一个容易采集的区间。
此外,DRV8701提供硬件级的过流保护。MCU 可以通过 DAC 设置一个参考电压,当实际电流超过这个阈值时,DRV 会直接拉低 SO 引脚,触发中断。这意味着即使 MCU 正在执行复杂的 FOC 计算,过流保护依然是立即生效的。
位置反馈
要使用FOC方式驱动一个步距角1.8°的步进电机,相当于极对数=50。也就是转子转过7.2°对应电角度的一个周期,要想准确的提供磁场矢量,就得准确测得转子位置。故先开环正、反转,读到磁编码器返回的位置,再建立查找表,克服椭圆误差和回程误差。除了读到的值本身,还用到了二分查找和线性插值。
IMU…?
板上带了一颗 LSM6DSM 六轴 IMU,最初是出于整活的想法。但在实际调试过程中,它确实一个非常有价值的工具。
通过加速度和角速度数据,可以清楚地看到电机在不同转速、不同控制参数下的振动情况,甚至能分析出机械系统的共振频率。这对于调试低速抖动、高速啸叫以及某些“说不清楚哪里不对劲”的现象,提供了一个完全不同的视角。
此外,IMU 还能顺便用来监测板上温度,在长时间大电流运行时作为一个额外的安全参考。
通信接口
在通信接口上,没有刻意追求“最简”,而是希望这块板能方便地融入不同规模的系统中。除了RS-485 用于传统总线控制外,还用 USB Type-C 提供了一种新的调试模式。
Type-C 接口既可以让板子作为 USB Device 直接和电脑通信,也可以通过板载的 CH340E 以串口形式工作。一个USB口可是实现调参、看日志等功能。之后甚至可以整活做成HID设备,比如带力反馈的旋钮。
在串口处理上,利用了 UART 的 FIFO 机制,只有当 FIFO 达到一定深度或检测到总线空闲时才触发中断,从而把中断频率降低了一个数量级。
控制模式
低速状态下使用FOC方式控制,达到一定速度后再对磁场方向准确调制就有些多余了,所以回到了传统的8拍:(A -> AB -> B -> BA' -> A' -> A’B' -> B' ->B’A),从准确的角度退化到“象限”/轴。当然,这个过程仍然是闭环的,否则会出现丢步。
3>/结论
到现在为止,这块驱动板已经可以在低速区间稳定运行 FOC,在高速区间切换到传统的八拍控制,整体行为连贯,动态响应也比较理想。
它当然还不是工业级的伺服驱动器,但对于 3D 打印机、激光雕刻、小型机械臂等对成本敏感、又希望控制体验更好的应用来说,我觉得这是一个非常值得探索的方向。
很多看起来“天生如此”的工程问题,其实只是还没有被认真对待过。