资讯详情

资讯详情

STSPIN32G4无感FOC驱动器实战:从选型到调试全解析

做电机控制这些年凡是涉及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项目里都通用但在这个平台上是验证过效率最高的路径。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →