做电机控制这些年,凡是涉及FOC方案的板子,十块里有七块都在跟芯片选型较劲。最近用STSPIN32G4做了个无感FOC驱动器,发现这颗料确实把“MCU + 栅极驱动 + 电源管理 + 电流采样”揉到一块芯片里了,对于做小体积、高功率密度的控制器来说,省掉的布板面积和走线麻烦相当可观。这篇文章不聊概念,围绕STSPIN32G4这颗芯片,把FOC控制器从硬件设计到软件调试的完整链路掰开揉碎讲一遍,重点讲选型时的思考、电流采样怎么排、MCSDK工程怎么跑起来、以及我实际踩过的几个坑。适合正在做无人机、机器人、电动工具、小型伺服这类项目的工程师参考,也适合想从方波控制转向FOC的入门者当一份实操手册。
1. 方案整体设计与选型思路
1.1 为什么盯上STSPIN32G4这颗料
做电机控制器的传统路子是MCU配一个独立三相栅极驱动器,比如用一颗通用MCU加一颗IPM或者单管驱动芯片。这么做没什么毛病,但有一个绕不开的问题:采样电阻、运放、比较器、电源电路都得自己一个个搭,PCB面积下不来,调试时信号链路上出问题的概率也高。
STSPIN32G4的思路不一样,它内部集成了Cortex-M4内核的单片机(主频跑到170MHz,带FPU),然后把三相栅极驱动、电荷泵、自举电路、LDO、运放、比较器全部做进一颗芯片。这样电机控制最核心的闭环——电流采样、过流保护、控制算法、PWM生成——就全部压缩在同一个硬件域里。外围要放的只剩功率MOS管、预驱电阻、自举电容、采样电阻、电源滤波这些元件。
我做这个项目时选它的决定性因素有四个:
- 第一,MCU主频和运算能力足够,做FOC加无传感算法CPU余量很大。
- 第二,CORDIC加速单元是硬件算反三角和三角函数的地方,Park变换和弧度计算省了一大截时间。
- 第三,内部集成的运放增益可通过寄存器配置,做三相电流采样不用外置仪表放大器。
- 第四,有一整套配套的Motor Control SDK,工程生成和参数辨识有官方工具托底。
1.2 让FOC落地的系统框架
这个控制器我定义为“48V/15A级别的无感FOC驱动器”,目标场景是给某小型移动平台提供驱动。
系统框架分两级来理解:
第一个是功率级。电池或者外部直流电源进来,经过防反接、母线电容滤波以后,直接进到三相逆变桥。每一相由上下两个N沟道MOS管构成,STSPIN32G4的栅极驱动提供高边自举供电和低边直接驱动。电流采样电阻放在逆变桥低边,每一相一个,采样信号直接送进芯片内部的运放。
第二个是逻辑控制级。MCU内部跑FOC主循环,当前拍的电流值、母线电压值、转子估算位置参与计算,输出三对PWM信号给内部栅极驱动。整个闭环跟外部唯一的关系就是一根配置好的UART调试线。
从硬件结构来看,整个控制器板上最核心的器件就是这颗STSPIN32G4、六个功率管、三个低边采样电阻、自举电容和母线电容。和传统分离方案比,物料清单少了不少行,布板难度也降了一档。
1.3 这种集成方案带来的甜头和要注意的代价
说实话,STSPIN32G4不是万能的,我在项目初期就اندازه过它的边界。
甜头很明显:走线短。栅极驱动信号的环路被压缩在芯片内部和管脚附近,寄生电感变小,PWM开关时振铃少了一个量级;采样信号同样如此,运放就在芯片内部,从采样电阻到运放输入的距离可能是毫米级,抗干扰能力天然占优。
代价也要说清楚。首先是引脚的复用问题,毕竟芯片管脚数有限,很多功能是复用的。比如某些调试接口、ADC输入、定时器引脚之间要反复权衡,硬件设计前必须把引脚分配表理得一清二楚。其次是系统的散热,所有东西挤在一起,如果PCB布局做得不仔细,芯片底部的散热焊盘和走线处理不好,大电流下温升会让人头疼。
如果你做的是48V、20A以上的大功率控制器,我的建议是多对比几个方案再决定,而像我这样做15A左右的中小功率完全够用。
2. 硬件核心拆解与设计要点
2.1 电源树:从母线电压到各模块供电
STSPIN32G4有一颗集成稳压器,可以生成系统逻辑电压。在48V输入的应用里面,我习惯把系统供电分成几路处理。
输入母线电压VBAT经过芯片的电源管理模块,内部产生3.3V逻辑电源,给MCU内核和数字外设供电。这个3.3V同时做ADC的参考电压,所以电源质量直接决定电流采样的精度。我在3.3V输出脚上放了高频去耦电容和钽电容,高频陶瓷电容负责滤PWM开关带来的尖峰,大容量电容稳住动态响应。
然后是栅极驱动供电。高边驱动靠自举电路供电,低边驱动由芯片内部的驱动逻辑供电。需要注意的是,如果PWM启动时自举电容还没充满电,高边MOS管可能无法完全导通,堵转时就会因为Pdyn过大烧管子。
电源设计上还有一个容易忽略的点:芯片内部数字电源和模拟电源虽然有分开的引脚,但实际PCB布局时仍然要小心地分割地平面。我这个板子做的是四层板,底层完整铺地,中间两层走信号和电源,效果还是很理想的。
2.2 三相栅极驱动:自举、死区和互锁
STSPIN32G4内部的三相栅极驱动峰值电流能达到1A级别,驱动中低功率MOS管完全没问题。每个通道支持高边和低边输出,高边驱动需要外部自举电容。
自举电容的选择我踩过坑。一开始参考设计选的是100nF,但实测在低载波频率下高边电压掉得厉害,管子关断时Vgs抖动明显。后来我把每相自举电容换成1uF的X7R陶瓷电容,并在电容两端并联一个小的100nF,效果立刻改善。问题在于某些测试条件下PWM占空比长时间接近100%,自举电容没有足够的充电窗口。
栅极驱动部分内置了死区时间,也可以通过寄存器配置。做FOC时死区时间不要太小,否则上下管直通,轻则波形畸变严重,重则烧管子。我最终用的死区时间是500ns,在48V电源和120kHz载波下,这个值是安全和效率的折中点。
2.3 电流采样通道:相位对齐至关重要
FOC控制的核心输入是三相电流。STSPIN32G4内部集成三个运放,正好对应三个低边采样电阻。
采样电阴我用的是10毫欧合金电阻,额定功率2W。硬件设计时采样电阻的Kelvin走线非常重要,必须直接从电阻两端引出两根独立的线到运放输入,不能在中间串入功率走线的压降。这个细节直接决定了低转速下的电流噪声水平。
运放增益配置在硬件上通过引脚电平选择,在软件里会根据这个增益自动换算电流值。我的配置是把增益设为典型值,配合10毫欧采样电阻,满量程电流可以覆盖正负30A,留了一倍以上的余量。
电流采样最重要的是跟PWM同步。FOC算法的电流值必须在PWM特定相位点采样,否则采到的是管子的开关尖峰。MCU的定时器会自动触发ADC转换,这个触发点和PWM中心对齐,实测下来电流波形很干净。
对比一下三种采样方式,列个表:
| 采样方式 | 电阻数量 | 成本 | 采样精度 | 适用场景 |
|---|---|---|---|---|
| 三电阻低边采样 | 3个 | 高 | 最优 | 大功率、高性能FOC |
| 单电阻采样 | 1个 | 低 | 受占空比限制 | 小功率、低成本方案 |
| 双电阻采样 | 2个 | 中 | 中等 | 中功率、电扇类负载 |
STSPIN32G4内部运放通道多,我直接用了三电阻方案,省心且精度高。
2.4 保护与反馈:过流、母线电压、温度一个都不能少
FOC控制器如果只靠软件保护,一旦电流超过MOS管耐受值,大概率是灾难性的。STSPIN32G4内部集成了比较器,可以实现逐周期限流。我配置的过流阈值是20A量级,超过阈值直接关闭PWM输出,保护响应在几百纳秒内完成。这比单纯靠软件中断快了一个数量级。
母线电压采样我用芯片内部的分压电阻网络接到ADC。这个电压值有两个用途:一是正常运行时的电压闭环保护,防止过压烧电容;二是无感FOC算法中反电动势估算需要母线电压做基准,电压采样不准,速度估算就漂。
温度保护方面,我在MOS管附近放了一个NTC热敏电阻,接到MCU的ADC。软件每隔一段时间读一次温度,超过85度降功率,超过95度停机。芯片本身也有过温保护,但这主要是自己保护自己,管子的温度还得靠外部传感器。
3. 软件算法与FOC主循环实现
3.1 从电流值到电压矢量:坐标变换链路
FOC说穿了就是一圈坐标变换。ANCSI把这个讲得很清楚,我这里结合STSPIN32G4的实际工程再捋一遍。
电流采样得到Ia、Ib、Ic,先做Clarke变换,把三相静止坐标系变换到两相静止坐标系αβ。这一步在MCU里就是几个乘法加法,计算量不大。
再做Park变换,把αβ轴上的电流投影到转子旋转的dq坐标系上。这里需要转子角度,有传感器就用传感器,无感就用估算的角度。
然后PI控制器分别控制Id和Isd。Id控制磁场分量,Iq控制转矩分量。Id的给定一般是0(表面贴式PMSM),有弱磁需求时Id给负值。Iq的给定来自速度环,速度环也是PI,转速误差经过PI后得到Iq值。
最后把dq电压做逆Park变换得到Ualpha和Ubeta,送进SVPWM模块生成三相占空比。SVPWM本质上是用相邻两个非零电压矢量和零矢量去合成目标电压矢量,让逆变器输出的电压基波最大,谐波最小。STSPIN32G4的定时器有互补PWM输出,还支持插入死区,硬件上省了交叉互锁的逻辑。
3.2 用上CORDIC和FPU,主循环能跑多快
STSPIN32G4的主频是170MHz,带单精度FPU,还有CORDIC协处理器。在MCSDK生成的工程里,FOC主循环默认放在高频中断里执行。
我实测下来,在CORDIC和FPU都启用的条件下,完整跑一遍FOC加无传感观测器的计算量大概是12到15微秒。也就是说,如果用10kHz的电流环频率,CPU占用率只有两成不到,余量非常大。
这里我最想强调CORDIC的价值。做反Park变换时要算sin和cos,传统做法用数学库的sin函数,一个sin要几百个周期,而CORDIC硬件计算sin/cos只需要一组移位加操作。如果高频PWM跑到了30kHz以上,这个优势会特别明显。
MCSDK工程里已经帮忙把这些外设初始化好了,但默认配置不一定最优化。我会在初始化代码里手动把CORDIC的通道配置为自动完成模式,并且把角度输入换算成固定的Q1.15格式,省去额外的格式转换开销。
3.3 无传感器转速估计:从反电动势到滑模观测器
无感FOC不需要霍尔也不需要编码器,转子位置全靠算法估算。STSPIN32G4上常用的是反电动势观测器。
中高速段用反电动势法效果不错。电机旋转时,定子线圈上除了反电动势,还有电感电压降。通过电压方程可以构造一个观测器,从电流误差中提取反电动势信息,反电动势的相位就是转子角度。
低速段反电动势太弱,纯反电动势法会失效。我的做法是低速用高频注入或者开环强拖启动。STSPIN32G4的MCSDK里有默认的启动策略:先开环强拖到一定转速,再切到反电动势闭环。这个切换时刻很关键,太早会失步,太晚会有明显冲击。项目里我通过调启动曲线参数,把切换点在10%额定转速附近,启动过程平滑了很多。
如果项目要求堵转也能维持力矩,那就必须上高频注入法,但STSPIN32G4的ADC采样频率要够高才能看到叠加在相电流上的高频响应,这个一般要配合30kHz以上的载波才能做得好。
3.4 控制策略扩展:MTPA、弱磁和速度环整定
做完基础FOC之后,我在这个项目上又把控制策略补了两个模块。
一个是MTPA。对内置式永磁同步电机,Id不为零时磁阻转矩可以被利用,通过查询不同电流角度下的最大转矩点,让相同电流产生更大转矩。STSPIN32G4平台上是查表实现MTPA,表里存的是不同转速和转矩下的最优电流角度。做这个之前要把电机的Ld、Lq测量比较准,我用自动参数辨识工具跑出来的数值结合人工修正,效果还不错。
另一个是弱磁控制。母线电压固定后,电机转速受到反电动势限制。超过基速后需要让Id反向去消磁,牺牲一点转矩换转速。弱磁扩速范围在这个平台上能做到1.2倍基速到1.5倍基速。弱磁参数我一共用了一周时间调稳,这里不建议偷懒,弱磁电流给大了容易失步甚至退磁。
速度环整定相对简单,典型的PI结构。但它的带宽要配合负载惯量匹配,我这个项目负载惯量变化比较大,我用的是动态响应要求不高的软启动方式,速度环带宽放低一些,换取了非常好的稳定性。
4. 实操全流程:从MCSDK到跑起来
4.1 用Motor Control SDK生成工程
ST为STSPIN32G4提供了一套完整的电机控制SDK,官方叫MCSDK,配合CubeMX使用。第一次接触的工程师可能会被庞大的代码结构吓到,其实核心入口很清晰。
我用的是在CubeMX里选择MCU型号,然后加载MCSDK扩展包的方式生成初始工程。CubeMX里能直接配置STM32G4的时钟树、引脚功能、ADC、定时器和各种外设。选好以后,MCSDK会自动叠加一层电机控制中间件,这层中间件包含电流采样驱动、PWM驱动、坐标系变换、PI调节器、观测器等模块。
生成完的工程主要看三个文件:用户配置头文件、中断回调函数、用户应用层。配置头文件里几乎全是电机参数和控制参数,像极对数、磁链常数、母线电压、过流阈值、载波频率、死区时间都在里面,可以直接改,不用从头追代码。
有一点要特别说明:SDK版本跟CubeMX版本要匹配,版本不匹配编译会报一堆莫名其妙的错,我第一次用就栽在这上面。到官网下载芯片对应的SDK版本,并且严格按安装说明操作,能省半天时间。
4.2 用Motor Profiler自动测参数
手动输入电机参数是最容易出错的一步。好在这个平台的开发工具链里有一个很强大的工具:Motor Profiler。把电机接上控制板,通过UART连上PC端的这个工具,点击运行,它会自动完成对电机的参数辨识。
Motor Profiler能自动识别极对数、定子电阻、电感、反电动势系数、磁链常数等一整套FOC必需的参数。识别过程中电机是通电运转的,所以一定把电机轴空载固定好,避免飞出来碰伤人。
我实测下来,Profiler识别的参数百分之八十的时候可以直接用,但有一点要注意:它识别的是电机的平均参数,如果电机磁路饱和或者有特殊的齿槽结构,参数会偏差。我每次跑完Profiler都会手动复核磁链常数和电感值,特别是有偏差项目,需要手动修正后写入配置。
参数识别完成后,Profiler会生成一个配置文件,可以一键导入到MCSDK工程里。这个流程比手动填参数靠谱得多,强烈推荐新上手的人先走一遍。
4.3 手动调参重点:电流环和速度环
自动识别完参数,不代表板子就能顺畅运转。第一次上电,我建议先把电流环单独拉出来调,速度环断掉,给一个固定Iq指令,观察电流响应。
电流环的PI参数在MCSDK里可以直接改。先调比例项,给一个小的阶跃Iq指令,看电流波形有没有剧烈振荡。振荡就减小比例增益;响应太慢就增大比例项。积分项主要消除稳态误差,但过大电流会过冲,我的调节顺序是先比例后积分,两个参数交替逼近。
电流环调好后,速度环就相对轻松了。速度环的输出上限要限制住,防止启动瞬间电流指令过大,直接触发过流保护。速度环的比例项影响响应速度,积分项影响稳态精度和带负载能力。
我这边调完后记录一下最终参数:电流环比例0.2,积分0.05,速度环比例8.0,积分0.6。这个不值当抄,因为电机和负载惯量不同,但是可以当参考起点。
4.4 实测波形解读:电流、电压、转速
项目调试到可以正常转起来以后,一定要用示波器和上位机把实时波形抓下来对着看。
电流波形是最直接的。稳定运行状态下,三相电流波形应该是光滑的正弦波,幅值稳定,频率和电机转速对应。如果电流波形上有明显的锯齿或者毛刺,先怀疑采样相位对不对,再确认PWM触发ADC的延时设置。
速度波形在启动阶段能看出切换是否平滑。无感切闭环的点会比较突兀,如果速度曲线有台阶或者抖一下,说明切换逻辑的转速阈值或者电流修正量还需要微调。
母线电压波形要关注PWM开关造成的纹波。48V输入下,母线纹波控制在几百毫伏以内是正常的,如果纹波太大,母线电容容量不足是主要原因,而不是控制算法的问题。调这个主要是硬件层面,增加母线电容或者降低母线等效串联电阻。
5. 常见问题与排查技巧实录
5.1 上电后芯片发烫或者短路
这个故障出现的概率不低,尤其是第一次打样。我的建议是焊完板子先用万用表测一下VS和GND之间有没有短路,再测三相输出到任意一相是否有短路,确认没有问题再上电。如果上电以后芯片迅速发烫,最可能的原因是电源树上有电容焊反或者芯片某个引脚对地短路。
还有一种情况是MOS管方向搞错,或者买到了RD Son过大的假管子,这会导致发热异常。排除方法很简单,第一次上电用限流电源,电流只有几十毫安,如果有电流大额消耗就马上断电排查。
5.2 电机启动卡顿,电流波形跳变
这种问题在无感FOC的启动阶段常见,表现形式是电机吱吱响,转起来很吃力,或者启动瞬间抖一下。
排查步骤我按概率排序:先检查开环强拖时的电流频率和幅值配比,如果强拖电流太小导致转不起来,就把Iq加大一些;再看强拖切到闭环的转速阈值是不是太低,阈值太低时反电动势观测角度还不过稳;最后检查速度环输出限幅,如果速度环输出被限得特别低,启动时没有足够电流拉升转速。
项目里遇到一次类似问题,最后发现是电机极对数填错了。电机标称是7对极,我填了4对极,整个环路频率完全错误,表现在启动上就是电流过冲、卡顿、发热明显。这种错误最容易发生在代用电机和型号不对应的场景里。
5.3 电流采样数值一直偏大或偏小
电流采样值错误会让FOC完全失控。第一步检查采样电阻的阻值和运放增益是否匹配,10毫欧电阻配固定增益,满量程电流是固定的。如果电阻用了15毫欧却按10毫欧配置,读到的电流值天然偏大接近1.5倍。
第二步检查ADC参考电压。STSPIN32G4内部参考电压可能也不是精确的3.3V,会有细微偏差。可以在配置里做一个简单的ADC校准,短接运放输入端读零点,再给一个已知电压读增益。这种校准对低漂移应用非常有帮助。
第三步,也是最容易忽略的:运放输入引脚上的RC滤波电容不要加太大。我一开始在运放输入和地之间放了1nF电容,主流FOC高频采样瞬间波形被严重平滑,导致电流峰值看上去不够。后来把RC参数改成100欧姆加100pF,采样值和实测对上了。
5.4 表格速查:常见故障、可能原因和排查方向
| 故障表现 | 可能原因 | 排查方向 |
|---|---|---|
| 上电芯片烫手 | 电源短路、芯片引脚误接 | 量VS对地阻抗,检查元器件极性 |
| 电机不转 | 使能信号没拉高,PWM没输出 | 检查UART后台状态变量、示波器测栅极驱动输出 |
| 电流波形跳变 | 采样相位偏、电流值超标 | 调ADC触发延时,减小电流环比例增益 |
| 启动抖动剧烈 | 强拖转闭环阈值过低 | 提高转速阈值,加大启动电流 |
| 母线电压纹波大 | 母线电容不够 | 并接更大容量母线电容 |
| Profiler辨识失败 | 电机参数超出量程 | 检查电源电压是否被限流、电机是否空载 |
我个人的经验是,遇到问题不要急着改代码,先拿示波器看波形。因为FOC是环环相扣的,电流不对会影响速度估算,速度估算不对又会加剧电流异常。从源头找到第一个不对劲的环节,改起来十分高效。而STSPIN32G4自带DAC输出的特性,也很适合把内部变量映射到DAC上再送到示波器观测,这个能力我整整用了一个项目周期才发挥熟练。
最后再说一个小技巧,这个平台调试时可以把FOC内部的计算变量实时发到上位机,比如Id、Iq、估算角度、估算速度。我平时调的时候只关注两个东西:估算角度是否连续,Id和Iq是否能跟给定值贴合。如果角度曲线有跳变,再看看是哪里的观测器增益设置不对;如果Id电流一直拉不下来,基本就是PI输出饱和了,要把积分限幅放开一点。这个排查思路在任何FOC项目里都通用,但在这个平台上是验证过效率最高的路径。