ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零调试FOC无刷电机驱动:坐标变换、电流采样与SVPWM实战

从零调试FOC无刷电机驱动:坐标变换、电流采样与SVPWM实战 搞无刷电机驱动的朋友应该都绕不开FOC这个词。我最早接触磁场定向控制是做一个航模无刷电调的替代方案当时被方波换向的噪音和抖动折磨得够呛后来狠下心把FOC从头撸了一遍才真正理解这东西为什么被称为“无刷电机控制的最高效方案之一”。这篇文章不扯虚的我会从坐标变换的直觉理解、电流采样的坑、SVPWM的实现、无感启动的流程再到我实际调试时踩过的各种雷一次性讲清楚。适合正在学FOC的嵌入式工程师、做电机驱动开发的朋友也适合刚入手STM32想驱动三相无刷电机的大三学生——只要你懂一点C语言和基本的电路知识这篇文章能帮你少走好几个月的弯路。1. 整体设计思路FOC到底在控制什么1.1 为什么放着简单的方波控制不用在聊FOC之前得先知道我们为什么“自找麻烦”。三相无刷电机最简单的驱动方式是六步换向也就是常说的方波控制。它的逻辑很直接按照霍尔信号或者反电动势过零检测每隔60度电角度换一次导通组合让定子磁场一步步“推着”转子转。这个方案代码量小、硬件要求低很多电调都在用。但方波控制在低速和中高速都有明显短板。换相瞬间三相电流不是平滑变化而是阶跃切换这会引起转矩脉动表现出来就是电机噪音大、低速时一顿一顿、高速时效率也上不去。对航模、风扇这类对噪音和效率不敏感的场合还好一旦要做精密位置控制或者要求低速大扭矩方波就完全不够用了。FOC的思路完全不一样。它不再“分段换向”而是把三相电流实时分解成两个互相垂直的分量一个负责产生转矩q轴电流一个负责维持磁场d轴电流然后对这两个分量进行闭环控制。整个过程相当于把交流电机的控制问题硬生生变成了直流电机的控制问题来处理。这就是磁场定向控制的全称来源——我们定向控制的其实是磁场的方向。1.2 三次坐标变换把旋转问题变成直线问题FOC最劝退新手的就是那一堆坐标变换公式。我先用生活化的方式解释一下它在干什么。先看Clarke变换。它的任务是把三相静止坐标系A、B、C三相的电流转换到两相静止坐标系α、β轴。为什么要这么做因为三相绕组在空间上相差120度三个电流之间互相耦合直接控制很麻烦。但把它们投影到α、β两个垂直轴之后就变成了两个“看起来”独立的正弦量相当于把三根绳子的拉力合并到了两个方向上。接着是Park变换。它把α、β轴上的交流量通过转子电角度θ旋转到跟转子同步旋转的d、q坐标系上。这一步最精妙经过Park变换之后原本随着转子旋转而变化的正弦电流变成了两个直流分量。其中id是励磁分量在表贴式永磁同步电机里一般控制在0附近就行iq是转矩分量我们要的速度调节器输出的就是iq的给定值。有了这套变换电流环就可以用最简单的PI调节器来做——因为你要控制的已经是直流量了而不再是正弦量。实际代码里还需要逆Park变换和逆Clarke变换把dq轴的电压指令再还原成三相占空比信号去驱动逆变器。1.3 FOC控制器的整体架构一个完整的FOC系统从外到里通常有三层速度环外环根据目标转速和实际转速的误差输出iq的给定值电流环内环分别控制id和iq跟踪给定值输出dq轴的电压指令SVPWM与逆变器把dq轴电压指令还原成三相PWM波形驱动MOS管速度环的带宽低一些一般1kHz左右就够了电流环需要跑得很快常见的是10kHz到20kHz。电流环响应速度越快系统越不容易失稳。我实际用的是20kHz电流环、1kHz速度环配合STM32G431跑得很稳。这里有个理解上的关键点整个FOC的所有闭环控制都建立在“你对转子位置θ的估计足够准”这个前提上。如果位置不对Park变换和逆Park变换的角度全是错的电流环再快也没用。所以转子位置检测是整个系统里最影响成败的一环。2. 核心细节解析与实操要点2.1 电流采样FOC的地基工程很多新手一上来就写坐标变换代码结果电机一抖一抖根本转不起来问题往往出在电流采样上。FOC的电流环质量直接取决于ADC采到的电流准不准。常见方案有三电阻采样、两电阻采样和单电阻采样。三电阻采样是最推荐新手起步的方案。三个下桥臂各串联一个采样电阻在一个PWM周期的固定时刻同时采集三相电流。因为三相电流之和为零实际上采两相就够了但三个都采可以互相校验也能应对一些不均衡工况。采样窗口的问题必须重视。电流采样时刻要避开MOS管开关瞬间的尖峰通常选在PWM中心对齐模式下计数器的顶点或谷点因为这时三相下桥臂都导通采样电阻上的电压正好反映真实的相电流。如果采样时刻选得不对采到的全是开关噪声电流环收敛不了电机会发出刺耳的尖叫。运放选型方面我常用的是0.01欧姆左右的采样电阻加差分运放放大倍数根据电流范围和ADC参考电压来定。假设最大相电流20A采样电阻0.01欧姆那么满量程压降0.2V。如果MCU的ADC参考电压是3.3V需要放大16.5倍左右。这里要留一点裕量我习惯把满量程设计在ADC范围的80%左右也就是运放输出2.6V附近对应20A这样即使有电流尖峰也不会削顶。硬件布局上有几个坑需要注意采样电阻要用开尔文接法避免大电流走线把压降误差带入采样回路运放的地要单独走线别跟功率地混在一起差分信号要短而粗。这些细节直接影响采样的精度间接决定了电流环能不能收敛。2.2 转子位置检测有感方案与无感方案转子位置检测是FOC里最核心也最让人头疼的部分。最简单的方案是安装霍尔传感器三只霍尔间隔120度安装可以给出60度分辨率的角度信息。它只能告诉你转子在某一个扇区内无法提供精确到连续角度的信息所以需要配合一些插值算法或者只在低精度要求的场合使用。对于性能要求较高的场景更推荐使用编码器或磁编码器。增量式编码器可以提供很高的分辨率但上电时转子位置未知需要先执行一次“找零”操作——常见的做法是给定一个固定的d轴电流矢量让转子锁到一个已知位置。绝对式编码器和磁编码器比如AS5047则可以直接给出绝对角度上电就能用省了一堆事。无感方案难度最大但省掉了位置传感器成本低、结构可靠。无感FOC在低速时通过高频注入来辨识转子初始位置中高速段则利用反电动势观测器来估算位置。滑模观测器是最常见的实现方式它根据电机的电压方程和电流误差构造滑模面估算出反电动势再用锁相环提取出转子位置和速度。无感启动一直是FOC调试的重灾区。电机静止时没有反电动势观测器完全没有输入信号所以必须用开环的方式把转子“拖”起来。等转速到了一定值、反电动势足够大之后再平滑切换到闭环状态。这个切换时机和切换算法直接决定了启动能不能成功。2.3 SVPWM把电压矢量变回真实PWM电流环算出了Ud和Uq经过逆Park变换就得到Uα和Uβ下一步要把它转换成三相逆变器的占空比。SVPWM空间矢量脉宽调制是这一环节最常用的方法。SVPWM的原理可以这样理解逆变器的6个MOS管组成了8种开关状态其中6种对应6个非零电压矢量2种对应零矢量。这6个非零矢量把平面分成了6个扇区。任意一个期望电压矢量都可以由相邻的两个基本电压矢量按照时间比例合成中间再插入零矢量来调节幅值。SVPWM相比SPWM的优势在于直流母线电压利用率更高能多出约15%的电压输出而且谐波更小转矩脉动更低。实现时的核心步骤是判断扇区、计算相邻矢量的作用时间、再分配到三个桥臂的占空比。这里在写代码前最好先在Matlab里把公式推一遍不然很容易在扇区判断时搞错符号导致电压矢量方向错乱。死区时间设置也要特别注意。同一桥臂的上下两个MOS管切换时必须插入死区防止直通短路。死区时间通常设为几百纳秒具体取决于MOS管的关断延迟。死区过短有短路风险过长会增加谐波和噪声。我一般先按0.5微秒起步用示波器观察切换点波形再微调。3. 实操过程与核心环节实现3.1 硬件平台选择与搭建要点搞FOC先得有一块能跑的硬件。主控方面STM32F405、STM32G431都是很成熟的选项。G431尤其适合电机控制内置了硬件过采样、高精度定时器还有CORDIC硬件加速单元算起三角函数来轻松很多。驱动部分可以选集成式GateDriver加外部MOS比如DRV8301配套CSD18532也可以选分立方案比如IR2104加IRFS3006。新手我更推荐集成驱动板焊接量小调试起点低。功率电路上母线电容的选择很关键。它负责吸收MOS管开关瞬间的高频纹波容量太小会导致母线电压跌落影响电流环性能。一般按每安培100微法到220微法的经验值来选同时并联一些0.1微法的瓷片电容吸收高频噪声。电流采样电路前面提到过再补充一点关于采样电阻布线的经验。采样电阻最好放在下桥臂MOS管的源极和地之间这样采样到的电压直接对应相电流。如果放在上桥臂则需要高边运放和电平移位电路复杂度陡然上升不建议新手尝试。3.2 软件架构与关键代码实现FOC软件的运行逻辑核心是“一个高优先级中断里完成电流环”。我用的框架是这样的主循环处理通讯、状态机、速度环计算定时器更新中断触发ADC采样、执行FOC计算、更新PWM占空比关键代码里电流环中断函数的执行顺序是读取ADC采样值 - 计算三相电流 - Clarke变换 - Park变换 - 电流PI调节 - 逆Park变换 - SVPWM - 更新比较寄存器。整个过程要在50微秒内完成20kHz周期G431在170MHz主频下CPU负载大约30%还有余量跑别的逻辑。以id和iq的PI参数整定为例一开始可以用电机参数来估算初始值。对于表贴式永磁同步电机电气时间常数τ L/R。假如电机定子电感L 0.1mH相电阻R 0.1欧姆τ 1ms。电流环带宽设计在2kHz左右对应的PI参数可以这样粗算Ki R × 带宽Kp L × 带宽。算出来Kp 200Ki 2000单位取决于标幺化方式。这里我强调一下不同人的标幺化基准不一样参数数量级可能有差异但比例关系是明确的。速度环的带宽要比电流环低一个数量级一般在20Hz到50Hz之间不然内外环会打架。速度环的积分项要注意抗饱和处理否则电机急停或者堵转时积分会越积越深导致恢复时猛冲。3.3 无感FOC的启动流程实操无感启动是新手最容易卡住的地方。这里分享一下我调试成功的一套流程。第一步是转子预定位。给一个固定的d轴电流矢量方向指向0度电角度持续几百毫秒让转子锁定到已知方向。这样做的好处是可以不需要初始位置检测就能开环启动。缺点是如果负载比较大锁不住转子启动就会失败。第二步是开环强拉加速。用I/f控制的方式让电流矢量的角度以一定加速度旋转电流幅值保持在一个足以拖懂转子的值。比如设定加速度为50电角度每秒平方电流幅值3A把转子从静止拖到600RPM左右。第三步是观测器收敛。在开环拖动过程中滑模观测器一直在跑当速度达到一定阈值时估算角度与实际角度的误差会逐渐收敛到零。用一个锁相环监测观测器的误差当误差连续一段时间小于阈值就认为可以切换了。第四步是闭环切换。切换时要注意电流给定值的连续性。开环时iq给的是固定幅值的一部分切闭环后iq由速度环接管如果两者相差太远会突然冲击。我的做法是在切换后的几百毫秒内对电流指令做斜坡过渡同时逐渐增大速度环的输出限幅让系统平滑交接。整这个流程我反复调了一个多星期才稳定主要是切换阈值和斜坡时间需要根据具体负载去试。负载越重切换转速要越高斜坡时间也要适当拉长。4. 常见问题与排查技巧实录4.1 电机发出尖锐噪音这是FOC调试里最常见也最恼人的问题。尖锐噪音通常意味着电流波形里有明显的高频谐波或者电流环在正常控制之外还叠加了额外的振荡。我踩过的坑主要有三个一是电流采样信号被噪声污染。排查方法是先把电流环断开只给固定的开环电压矢量然后用示波器观察ADC采到的原始电流波形。如果波形上有明显的毛刺那就是采样时刻不对或者PCB布局问题。我用这个方法抓出过一次运放供电的纹波问题。二是电流环PI参数不合适。如果Kp太大电流环会出现高频振荡噪音就是振荡的声音。这时用示波器看iq的实际波形会看到明显的锯齿状抖动。把Kp调小、Ki适当调整之后波形变平顺噪音也就消失了。三是SVPWM生成的PWM频率太低正好落在人耳可听范围内。FOC的PWM频率至少应该在16kHz以上我习惯用20kHz。如果你用的开发板默认配置的是10kHz电机噪音会很刺耳调上去就好了。4.2 电机上电后抖动但不转这个问题的原因非常多我列一个排查顺序先确认相序是否正确。三相电机A、B、C对应到驱动器的三路输出如果接错相电场方向是乱的电机只会抖不会转。用开环强制矢量方式测试逐个固定空间角度看电机是否能锁住。再确认编码器/霍尔角度是否校准。电角度零点位置不对Park变换就全错了。用固定的d轴电流锁转子然后读取角度传感器的值这个值就是电角度零点偏置。把这个偏置写进代码里问题基本就能解决。接着确认启动电流是否足够。带负载启动时电流太小拖不动可以先加大开环电流幅值试试。无感方案还要检查观测器是否收敛。启动过程中用串口把估算角度打出来跟实际角度对比如果偏差很大说明观测器参数有问题。4.3 电流波形异常做FOC调试图方便我会用一个轻量级的上位机通过串口以1kHz的速率把id、iq、速度、角度这些内部变量发出来然后在电脑上画波形。这样调PI参数时的反馈速度比反复接示波器快很多。如果看到id或者iq在稳态时仍有明显波动首先检查是不是电流采样三相不平衡。比如某一相的采样电阻虚焊了采样值不准坐标变换之后的id、iq自然就乱了。三相电流的采样值应该是对称的三相正弦用示波器或者串口波形一对比就知道了。还有一个隐蔽的坑是ADC采样到的电流有直流偏置。运放的偏置电压基准如果不干净采样零电流时ADC值就不是中值而是带有偏移。这个偏移如果不校准会让id、iq叠加上一个直流误差表现为电机带负载后电流环稳态误差明显。解决办法是在每次上电时做一次零电流校准把三路ADC的偏置值记录下来在计算时减掉。4.4 常见问题排查速查表我把调试中遇到的典型问题整理成一个速查表方便你对着查。现象可能原因排查方法解决办法电机发出尖锐噪音PWM频率低、采样噪声大、电流环PI过大示波器看电流波形提高PWM频率至20kHz优化采样时刻降Kp电机上电抖动不转相序错、电角度偏置错、启动电流小开环锁转子测试校正相序和电角度偏置加大启动电流启动时失步切换闭环过早、斜坡时间短观察估算角度与实际角度偏差提高切换转速延长切换斜坡时间电流波形有毛刺采样时刻选错、布线干扰断开电流环看原始ADC值调整采样触发点改善PCB布局转速不稳、波动大速度环带宽过高、机械负载耦合用上位机看速度波形降低速度环带宽增加惯性补偿高速时带载能力差电压利用率低、死区过大对比SVPWM和SPWM电压输出检查SVPWM配置减小死区时间5. 从跑通到跑好调参顺序与工具准备5.1 调参顺序先开环后闭环先电流后速度FOC调试最大的忌讳是一上来就闭合所有环路。我走过的比较顺利的路径是第一步开环测试。给定固定的Uα、Uβ电压矢量确认电机能正常旋转、相序正确。这一步不要做任何闭环。第二步电流环调试。把转子锁死或者用速度极低的方式转动只闭合电流环分别给id和iq一个阶跃信号看电流响应。重点观察是否有超调和振荡。第三步速度环调试。电流环调稳后再闭合速度环给定一个目标速度看速度阶跃响应。先只用P项再加I项消除稳态误差。这个顺序能确保每一步出问题时问题范围都足够小不至于几个环路相互干扰最后无从下手。我遇到过很多新手一上来就把速度环和电流环都闭合结果整个系统发散半天找不到问题在哪。5.2 调试工具的取舍一个能实时显示内部变量的上位机是效率神器。不需要很花哨能画波形就行。我用的是PythonPyQt写的小工具通过串口读数据画图十几行代码就能搞定核心功能。调试时把id、iq、速度、估算角度定时发出来观察曲线就能判断系统状态。示波器当然是必须的但不必一开始就上电流探头先用电压探头测PWM输出和驱动芯片的输入信号确认逻辑正确性。等系统开环能转了再考虑用电流探头确认实际的相电流波形。电流探头价格不菲如果你的实验室没有可以用采样电阻上加电压探头的方式来替代。5.3 我的一点心得回头来看从零搞FOC的过程本质上是把“自动控制原理”和“电力电子技术”这两门课真正揉到一起的过程。你会发现书本上的传递函数、PI校正、采样定理在这里全都有落地的位置。当你第一次看到电机在闭环下平稳旋转、电流波形标准的正弦波时那种成就感是单纯调一个PWM波形完全比不了的。如果你正在被无感启动、电流采样噪声或者PI整定折磨不要急于怀疑自己的方案方向先按部就班地把每一环都拆开验证——硬件先开环测、电流环先锁转子调、速度环逐步加。FOC调试最忌讳的就是一口气把所有环节都接上然后在一片混乱里瞎试参数。按照我上面说的顺序稳扎稳打多花点时间在波形观察和变量监控上你也能把FOC跑顺。最后说一个我从调试里总结出来的小技巧每次只改一个参数改完必须重新观察波形并记录。人的直觉在电机调试里会骗人但波形不会。保持严谨的记录习惯你会少走很多弯路。
返回列表