ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FOC驱动实战:电流环推导与无感控制调试全解析

FOC驱动实战:电流环推导与无感控制调试全解析 说实话FOC这东西我接触了不少项目但要从一个“升魂浩荡”这种中二感拉满的项目名开始讲我估计这个项目的命名人要么是重度网文读者要么就是被电机参数折磨到精神恍惚之后起的代号。FOC全称Field-Oriented Control磁场定向控制这几年在无人机、机器人关节、电动工具、家电变频、平衡车这些领域基本是标配。它的难点从来不在“知道这个概念”而在“从电流环推导到程序落地”这一整条链路的每一项细节。很多朋友入手FOC手里攒了一堆资料看了不少PPT结果一上板子就懵电流采样噪声大、电机一抖一抖、启动就过流保护、转子位置检测不知道从哪下手。这篇文章就围绕“升魂浩荡FOC驱动”这个项目实际推进过程中的核心问题重点拆电流环的推导过程、转子初始位置检测、无感FOC的实现路径以及我在调试现场踩过的那些坑。适合正在写FOC驱动代码、准备从方波驱动切到正弦驱动、或者已经跑通开环但闭环一直收敛不住的朋友。我不会把整篇写成理论教材而是按项目推进的顺序来先讲整体架构怎么设计再推导电流环然后说初始位置检测和无感方案最后是调试实录和问题排查。整个过程尽量说人话能给出参数的地方直接给参数能复现的步骤直接写步骤。1. 项目整体架构与控制链路拆解1.1 为什么非要用FOC方波驱动和磁场定向的本质差异先说一句可能得罪人的实话如果你的项目只是做个抽水机、小风扇方波驱动完全够用六步换相加个可调脉宽就能转成本还低。但如果你要做的是伺服级控制要求低速大扭矩、高速弱磁、动态响应快、噪音小那方波驱动基本交代不了。六步换相的本质是“定子磁势跳着走”。它在一个电角度周期内只切换六次导通状态每次导通60度电角度定子合成磁势停留在某个方向上等转子转过去了再跳向下一方向。这相当于你开车的时候每隔一段距离猛打一次方向盘而不是持续修正方向。结果就是扭矩脉动大、中高速啸叫明显、效率低。FOC干的事情是把定子电流实时分解到转子磁场方向和垂直于转子磁场方向的两个分量上前者是励磁分量Id后者是转矩分量Iq然后让电流矢量始终和转子磁场保持接近90度的关系。换句话说你从“跳着走”变成了“全程顶着走”扭矩输出平稳得多。在实际项目中FOC的“磁场定向”这四个字就是全部精髓。你得知道转子磁场在哪里才能把电流矢量送到正确方向去。这就引出了整个控制链路里最核心的角色——转子角度。没有准确的角度后面什么Park变换、反Park变换、SVPWM全是白搭。1.2 控制链路拆解从ADC采样到PWM输出的完整通路先给你看我这个项目里最终确定下来的控制链路按信号流向走一遍。整个FOC代码不管你是用ST的MCSDK、SimpleFOC还是完全自己写核心链路都是一样的三相电流采样通过采样电阻或电流传感器得到ia、ib、ic很多时候只采两相第三相通过基尔霍夫定律算出来。坐标变换三相静止坐标系→两相静止坐标系即Clark变换得到iα、iβ。转子角度获取编码器、霍尔传感器或者无感方案里的观测器得到电角度θe。旋转坐标变换两相静止坐标系→两相旋转坐标系即Park变换得到id、iq。电流环PI控制给定id_ref通常为0和iq_ref来自速度环或位置环和反馈的id、iq做差进PI控制器得到vd、vq。反Park变换vd、vq→vα、vβ。SVPWM调制vα、vβ合成电压矢量算出三相占空比输出到逆变桥。很多入门者喜欢急着上SVPWM和死区补偿其实这不是起步时的重点。我建议先把电流采样和坐标变换这前半段搞踏实因为后面所有调参、所有算法都建立在“你采回来的电流是准的、坐标变换是正确”的前提上。一个常见的坑是相位没对齐导致id、iq振荡然后你去调PI越调越乱最后怀疑人生。1.3 代码架构与任务调度电流环必须快速度环必须稳代码架构上我一般分三层底层驱动PWM、ADC、编码器、中间算法层Clark/Park/PI/SVPWM、上层逻辑层速度环、位置环、状态机、通信。电流环的代码要放在最高优先级的中断里速度环放在低优先级定时器里。以20kHz PWM频率为例电流环也跑20kHz即周期50us。在这个中断里需要完成采样保持、Clark/Park、电流环PI、反Park、SVPWM一共没多少行代码但每个环节都必须在50us内完成。速度环我一般放1kHz到2kHz位置环再慢一些可以到200Hz到500Hz。这个频率差是有讲究的内环带宽必须远高于外环电流环才来得及把外环要的Iq给到。如果电流环太慢速度环一给指令电流还没跟上整个系统就容易共振。模块设计上还要注意一点把PI控制器、坐标变换、SVPWM写成与硬件无关的纯函数这样换主控、换逆变桥驱动时算法层基本不用动。我当时把坐标变换和PI都用C语言纯算法实现底层通过接口拿ADC原始值和角度值调试效率高出一大截。2. 电流环推导从电机方程到PI参数整定2.1 先从物理层面理解三相电流是怎么在电机里产生旋转磁场的电流环推导之前我想先花点篇幅把旋转磁场这事说透因为很多人会算公式但心里没有“画面”。三相对称绕组在空间上相差120度当三相对称正弦电流通进去时每一相绕组都会产生一个脉振磁动势。这个脉振磁动势可以分解成正转分量和反转分量三相加起来反转分量互相抵消正转分量叠加最终形成一个幅值恒定、在空间匀速旋转的圆形磁动势。这个旋转磁场的转速就是同步转速和电源频率严格对应。永磁同步电机PMSM的转子本身有永磁体转子磁场方向和转子机械位置固定。定子旋转磁场会“拉着”转子磁场跑两者保持同步时输出恒定转矩。如果定子电流矢量方向控制得不好比如和转子磁场之间角度偏了就会有一大堆电流变成了励磁或者去磁分量真正产生转矩的电流就少了系统效率直线下降。FOC干的事就是在任何时刻都知道转子磁场在哪里然后精确控制定子电流矢量指向“让转矩最大化”的方向。这也是为什么我总说角度是整个FOC的地基角度不准后面全是空中楼阁。2.2 Clark和Park变换推导为什么要把交流变成直流电流环要的是“稳”、“准”、“快”而三相电流是交流量直接拿交流量做PI控制会出现稳态静差很难消除的问题。所以FOC采用了一个非常巧妙的思路换坐标系。先看Clark变换把三相静止坐标系a、b、c映射到两相静止坐标系α、β。这里有两种常用约定等幅值和等功率。我在项目里用的是等幅值变换好处是变换前后相电流的幅值不改变方便观察波形。公式如下假设中点为中性点三相平衡iα (2/3) * (ia - (1/2) * ib - (1/2) * ic) iβ (2/3) * ((√3/2) * ib - (√3/2) * ic)如果已经知道三相电流直接算就行。但在实际采样中常常只采两相第三相用 ic -ia - ib 来算。再看Park变换把两相静止坐标系旋转到两相旋转坐标系d、q旋转角度就是转子电角度θeid iα * cos(θe) iβ * sin(θe) iq -iα * sin(θe) iβ * cos(θe)经过这一步之后id和iq变成了直流量。id对应转子磁场方向的电流iq对应垂直转子磁场方向的电流也就是真正产生转矩的分量。然后你对两个直流量分别做PI控制这就是电流环的全部秘密。控制结果通过反Park变换还原到αβ坐标系再交给SVPWM生成占空比。这里有个新手特别容易搞混的点不同教材对d、q轴的定义方向不同有的把d轴定义为转子永磁体磁场方向有的定义为气隙磁场方向差一个角度。还有Park变换矩阵的符号也常有差异。这不影响算法本质但会影响你后面的角度对齐和观测器代码所以一旦选定了约定整个项目都要保持一致别中途换。2.3 永磁同步电机的d-q电压方程与解耦要整定电流环PI参数先得有被控对象的数学模型。PMSM在d-q旋转坐标系下的电压方程是v_d R_s * i_d L_d * d(i_d)/dt - ω_e * L_q * i_q v_q R_s * i_q L_q * d(i_q)/dt ω_e * L_d * i_d ω_e * λ_m其中R_s是相电阻L_d、L_q是d轴、q轴电感ω_e是电角速度λ_m是永磁体磁链。等号右边第一项是电阻压降第二项是电感上的瞬态电压第三项和第四项是旋转引起的交叉耦合电动势。如果忽略交叉耦合项d轴和q轴就可以看成两个独立的“电阻电感”一阶系统这是简化PI设计的常用做法。以q轴为例从v_q到i_q的传递函数近似为G(s) 1 / (L_q * s R_s)对它做闭环PI控制把PI控制器设计成消除掉被控对象的极点就可以把闭环带宽压到我们想要的值。工程上常用的整定公式是Kp L * ω_bw Ki R_s * ω_bw其中ω_bw是期望的电流环带宽弧度/秒。这个公式推导出来的前提是连续域、且忽略交叉耦合但它给出来的初值非常靠谱。我在项目里用的电机参数是R_s 0.6ΩL_d L_q 0.45mH表贴式电机交直轴电感基本相等。期望电流环带宽做到1kHz左右那么ω_bw 2π * 1000 ≈ 6283 rad/s。代入公式Kp 0.45e-3 * 6283 ≈ 2.83单位V/A Ki 0.6 * 6283 ≈ 3770单位V/(A·s)注意这是连续域参数落地到代码里还要做离散化。如果电流环周期T 50us用前向欧拉法离散积分系数就是 Ki_d Ki * T 3770 * 0.00005 0.1885。不同程序框架里PI控制器的写法不一样有的直接存Ki有的存积分系数单位容易混务必要先对好单位再上机。这只是理论初值。实际调试时我一般在这个值的基础上先降一半然后看波形再往上抬。这里有个经验Kp决定电流跟踪的快速性Kp太小反应肉Kp太大会出现高频抖动和啸叫Ki的作用是消除稳态误差Ki太大会出现低频振荡和超调Ki太小则电流会有静差。你调参的时候要同时看阶跃响应和稳态波形不能只看能不能转。再提一下解耦如果电机转速不高、电流环带宽远高于运行频率交叉耦合的影响不大简化设计完全够用。但如果做高速弱磁就建议加前馈解耦把 -ω_e * L_q * i_q 和 ω_e * L_d * i_d ω_e * λ_m 这两项补到输出电压上否则高速时d、q轴会互相干扰表现出来就是电流忽大忽小。我那个项目做到5000转以上时才加的完整解耦加完明显更稳。3. 转子初始位置检测与无感FOC难点3.1 不知道转子在哪FOC根本无从谈起带编码器或霍尔传感器的方案理论上每次上电只要读一次角度就能知道转子位置。但你很快就会遇到另一个问题增量式编码器上电时没有绝对位置霍尔传感器只有60度分辨率磁编码器又存在安装偏心这些都会导致初始角度不准。对于无感FOC来说初始位置检测更是第一道拦路虎。因为电机静止时反电动势为零你根本“看不见”转子位置。如果随便给一个角度强行起动轻则抖动重则反转甚至过流保护。理解这个问题前你先要接受一个事实永磁电机转子有凸极效应尤其是内置式IPM电机d轴和q轴电感不相等。当你在某个方向施加电压时由于磁路饱和程度和电感差异电流的响应速度和大小会随着转子位置不同而变化。所有不用编码器就能测初始位置的方法本质上都是在利用这种电感或饱和特性的不对称性。3.2 脉冲电压注入法工程上最常用的初始位置检测这个项目用的是脉冲电压注入法也常被叫做“三次脉冲法”或“六脉冲法”。原理很简单向不同方向施加电压矢量测每个方向上的电流响应幅值电流响应最大的方向就是转子N极所在的方向。具体做法这样来。先把电流环去掉直接用PWM输出固定占空比的电压脉冲依次施加在几个方向。我使用的是0度、120度、240度三个方向每个方向施加一次短促的电压脉冲。施加时间和电压幅值取决于电机电感和母线电压基本原则是让电流达到几安培但不能触发过流保护时间一般取100us到1ms不等要不断试。测完三个方向的电流峰值后选出峰值最大的那个方向这个时候它指示的是转子磁极轴线方向但还是N/S模糊的。也就是说你已经知道了转子在哪一条线上但不知道磁极朝向。接下来再在这个方向上施加两个方向相反、幅值相同、时间相同的电压脉冲分别测电流响应。由于磁路饱和效应顺着永磁体磁场方向加压和反向加压电流响应不一样电流更大、电流上升更快的那次就是N极方向。这个方法看起来简单实际用起来有几个细节要特别注意。第一电压脉冲不能太大也不能太小太大转子会被拉动甚至转起来太小信噪比不够、方向判断不准。第二电流采样窗口要避开开关管导通瞬间的毛刺建议在脉冲中间段采样多次取平均。第三如果电机负载有弹簧或齿轮箱转子可能被负载拉离理想位置测出来的方向会有偏差这种情况下要多做几次并取平均值。3.3 高频注入和I/F起动无感FOC的两个阶段初始位置检测只是起动的那一瞬间。之后无感FOC要能在低速甚至零速下保持转子位置跟踪不然电机还是无法稳定转起来。最常用的低速方案是高频信号注入法。基本原理是在估计的d轴方向上叠加一个高频电压信号比如500Hz到2kHz幅值为母线电压的5%左右然后检测q轴上的高频电流响应。由于转子凸极效应当估计角度和实际角度存在误差时q轴会出现与位置误差成正比的高频电流分量。这个信号经过带通滤波、乘法器解调、低通滤波后得到位置误差信号再送给一个锁相环或PI观测器不断修正估计角度直到误差收敛到零。高频注入法的实现难度不低滤波器的相位延迟、解调信号的幅值、观测器带宽都会影响收敛效果。如果你的电机是表贴式SPMd轴和q轴电感差异非常小高频注入法的效果会很差。这时候更实用的起动策略是I/F电流-频率开环起动。I/F起动的思路很粗暴先用电流闭环拉住一个固定幅值的电流矢量让它的角度按设定的加速度匀速旋转。转子被这个旋转磁场带着走虽然一开始会有角度差但只要频率爬升不太快转子就能同步转起来。当转速上升到反电动势足够大的时候再切换到无感闭环通常基于滑模观测器或龙贝格观测器估算反电动势位置。这个切换点一般设置在额定转速的5%到10%左右取决于反电动势的幅值和采样信噪比。切换时机没选好最容易出现电流冲击和失步所以切换前要确认估算角度已经收敛、转速误差在允许范围内。4. 电流环实操调参采样、标定、波形观察与整定步骤4.1 电流采样时序采不准就是一切问题的根源先来一个我见过无数次的案例某朋友的FOC板子算法看着没问题电机也能转但电流波形全是毛刺id和iq在给定值附近不停振荡PI不敢调大性能上不去。最后排查下来是ADC采样时机不对采到了开关管开关过程中产生的尖峰上。电流采样是所有闭环控制的地基。你采回来的电流如果失真后面坐标变换、PI控制、调试判断全部失效。硬件方案上低压电机控制最常见的是三电阻采样或单电阻采样。三电阻采样的优势是重构简单每个PWM周期在中心对齐模式下当三个下管都导通时三个采样电阻上的电压直接对应三相电流。ADC触发点要设在PWM定时器计数到周期值的正中间并且可以做一个几微秒的延迟避开开关瞬间的震荡。单电阻采样省成本但重构逻辑复杂因为在某些扇区边界两个下管可能同时只导通很短时间采样窗口不够这时候要采用移相或者调整PWM占空比的技术。我的建议是除非是成本敏感的量产产品前期调试阶段老老实实用双电阻或三电阻方案把精力花在算法上。还有一件事必须做电流采样偏置校准。FOC用小电压信号采集时运放通常会叠加一个半母线电压的偏置。断电状态下采到的ADC值就是零点偏置。如果这个偏置没校准电流就有直流偏置控制时id和iq都会出现固定误差表现在电机上就是电流不对称、震动大、噪音异常。每次上电初始化时我都建议至少采样32次取平均作为零点。4.2 电流环整定的完整流程别一上来就闭环说实话很多人调FOC失败是因为一上来就把所有环都闭合出了问题根本不知道是哪个环节挂了。我的调试顺序从来都是分步走先开环再电流环再速度环最后位置环。第一步是开环测试。给定一个固定幅值、固定频率的电压空间矢量让电机转起来观察三相电流波形是否正弦、幅值是否一致。如果电流波形明显畸形或某相特别大去查采样和硬件不要继续往下走。第二步是电流环闭环。给定一个恒定的iq_ref比如0.5Aid_ref给0角度用编码器实测值。观察iq实际值能不能快速跟上给定、是否稳定无振荡。用示波器或者直接在代码里把变量通过DAC输出出来看阶跃响应。常见的情况是超调大→Ki太大高频振铃→Kp太大响应慢→两个都太小。我可以给一个大概的“调节手感”从理论值的一半开始每次加10%到20%观察到有一点临界阻尼的感觉就停把参数记录下来。这里有个很容易忽略的问题电流环PI饱和。当给定电流很大或者电流还没建立起来时PI的输出可能已经到占空比极限了。如果没有做好限幅积分项会一直累积等到电流追上给定后输出还在饱和状态导致大超调甚至振荡。所以积分一定要做限幅我一般把积分项单独限制在PI输出限幅的30%到50%或者做积分清零让它在检测到饱和时快速退出。第三步才是速度环。速度环的输出是iq_ref它的带宽要远低于电流环。速度环PI的整定思路和电流环类似但你要知道速度环控制的是一阶积分对象天生的相位滞后比电流环大所以速度环的Kp和Ki通常需要更保守。我的经验是先把速度环Kp一点点加看到转速阶跃有一点超调了再加一点Ki消除静差加太多就会出现周期性的转速波动俗称“喘振”。4.3 FOC调试难点对照表下面把我在这个项目和一些其他项目里实际遇到的调试难点和排查方向整理成一张表你可以直接拿来对照现象可能原因排查方向电流波形毛刺多ADC采样时机不对、滤波电容不匹配调整采样触发时刻检查采样电阻布局尝试多采样几次id/iq振荡、电机高频啸叫电流环PI参数过大、采样相位滞后降低Kp检查坐标变换角度是否对齐低速启动发抖、反转初始位置检测不准、磁极方向判断反了重新标定脉冲法参数检查N/S极判断逻辑高速失步、转速上不去解耦没做、反电动势观测器相位滞后加前馈解耦增加速度环相位补偿上电就过流保护电流采样零点未校准、占空比初始化异常校准偏置检查PWM初始化状态速度环“喘振”速度环积分过强、负载波动大减小Ki检查机械连接是否有间隙无感切换瞬间电流尖峰切换前角度误差大、切换逻辑没有平滑衔接延长切换前等待时间增加电流限幅5. 常见问题与排查技巧实录5.1 上电一瞬间就过流保护这是很多新手第一个遇到的打击。第一种情况是电流采样偏置根本没校准。采样电阻上的电压是叠加在偏置电压上的如果偏置不准电流值就全是飘的。第二种情况是PWM初始化时占空比恰好让某一相的上下管直通了哪怕只有几微秒瞬间电流就能把采样放大器的输出打到顶。排查方法很简单上电后先别启动PWM读一遍ADC原始值三个采样通道的值应该非常接近。然后把PWM频率和死区时间都设好用示波器看每一路输出的互补波形确认没有直通再开主回路。5.2 电机“哒哒哒”响转子就是不转这个现象通常出现在刚写完FOC代码、第一次上电测试的时候。原因大概率是角度或换相逻辑错了。比方说编码器的AB相位接反了或者磁编码器的零位没有和电机零点对齐Park变换得到的结果完全是乱的。我自己的排查顺序是这样的先开环给一个固定电压矢量确认PWM输出和三相绕组是对号的然后手动旋转电机轴在代码里打印电角度值确认角度是连续变化的、方向和旋转方向对应最后才上闭环。这里有一个新手的通病就是电机三相的相序和编码器方向没有匹配好导致FOC不仅没有把电流送对反而形成阻力所以电机“哒哒哒”抖动。简单验证相序的方法给电机某一个方向开环加一个较小的电压矢量用一个力传感器或者你的手去感受转子是被往同一个方向柔和地拉还是有明显抖动。如果方向对转子应该顺着电压矢量方向稳定转到一个位置停住并且保持在那里。如果换几个方向还是乱跑那就把任意两相交换再试。5.3 电流波形有直流偏置怎么都调不好上个项目调试时我遇到一种情况电流闭环响应挺快但id始终有个0.3A左右的固定偏置怎么调Ki都消不掉。最后用万用表测了各采样电阻发现有一个采样电阻焊接不良阻值比其他两个偏大了不少。这种情况下电流重构出来的三相幅值也就不对称了坐标变换出来的id、iq自然就有偏置。硬件问题也要怀疑。电流采样电路的运放偏置电压、采样电阻的精度、PCB布局导致的温度漂移都可能让三相电流幅度不对称。硬件工程师总是觉得软件什么都能调但电流采样这种物理层的东西软件只能校准零点校准不了增益不一致。遇到这种问题别急着调PI先花时间确认三个采样通道的增益一致性和偏置电压。5.4 关于调试器和上位机的那点事顺便说一个绕不开的坑。很多时候不是算法问题而是电脑和调试工具的连接。这个项目里我换过几次板子用的ST-Link和J-Link都遇到过驱动装不上、连接失败的情况。尤其在某些系统环境下调试器驱动和新版本IDE不兼容经常出现“无法识别设备”。我的解决习惯是固定一台调试电脑装好调试器驱动后不要随意升级IDE确认好设备管理器里能看到设备再打开工程。环境问题虽小但一折腾就是半天。另外一个建议是如果你的主控芯片支持浮点运算电流环建议用浮点。STM32F4及以上都支持硬件浮点单元直接用浮点写PI和坐标变换代码清晰、调试方便性能完全足够。FOC算法的实时性瓶颈更多在采样时序和中断响应而不在这些数学运算上。5.5 参数记录的坏习惯害了多少项目最后我想强调一件很多工程师不在乎的事调参记录。FOC参数之间是强耦合的电流环PI变了速度环整定就得重来又换了一块电机以前的参数又不能直接用。如果不记录每一次修改后的波形和数据过两天你就得从头再来。我的习惯是每次调参前把当前参数和波形截图存一份写清楚“什么条件下测的”“改了什么”“现象怎样”。这看起来简单但在复杂调试中能省下大量时间。有时候一个参数改了十多次你以为已经很好了回头一对比反而是最早那一版更稳。另外保存好的历史参数在换电机或换板子时非常有用。新电机的Rs、L、磁链参数不同但你可以基于之前项目的参数按比例缩放再结合理论公式微调。这个起步速度比从零开始快得多。最后说一点个人体会做FOC这个项目最大的感觉就是它不是一个“看懂了就会了”的技术而是一个必须上手踩坑才能建立直觉的领域。公式推导可以告诉你PI参数初值该给多少但你不上示波器看波形就永远不会知道“超调一点”和“振荡起来”之间的手感差异在哪里。我自己反复踩坑之后的经验就是千万别急。电流环没调稳就不要去碰速度环开环没确认相序就不要做闭环参数没记录就不要乱动。FOC这个东西你只要每一步都走踏实它最后给你的回报是一套非常稳定、安静、有力度的电机驱动系统。那种顺滑感用过的人才懂。后面有时间我准备再把无感FOC的滑模观测器和磁链观测器单独拿出来写一篇那个坑更深也更有意思。先到这里希望对正在和FOC较劲的你有帮助。
返回列表