ARTICLE DETAIL

资讯详情

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

FOC磁场定向控制实战:从三相电流到转矩控制的完整链路解析

FOC磁场定向控制实战:从三相电流到转矩控制的完整链路解析 1. 从三相到两轴FOC 到底在解决什么问题如果你拆过航模电调或者伺服驱动器大概率见过这样的场景一块小小的板子上六个 MOS 管驱动一个三相无刷电机电机转起来又稳又安静低速下扭矩还特别大。这背后十有八九跑的就是磁场定向控制也就是我们常说的 FOC。FOC 的核心目标其实一句话就能说清把三相交流电机当成直流电机来控制。直流电机为什么好控制因为它的励磁磁场和电枢磁场在空间上是正交的你给电枢电流产生的转矩就和电流成正比控制起来非常线性。而三相交流电机通的是正弦波定子电流产生的磁场是个旋转的矢量转子和它之间的夹角一直在变直接控制三相电流根本没法直观地控制转矩。FOC 的做法就是通过坐标变换把三相静止坐标系下的电流映射到一个跟着转子一起旋转的坐标系上。在这个旋转坐标系里原本旋转的磁场被“拉直”了一个轴管励磁一个轴管转矩两个量都是直流量用 PI 调节器就能稳稳地控制住。这就是为什么 FOC 能让电机在低速下依然输出平稳扭矩、噪音小、效率高。这套东西听起来数学味很重但落到工程上无非就是几个环节采样三相电流、做 Clarke 变换、做 Park 变换、跑两个电流环 PI、再反变换回三相、最后用 SVPWM 输出。整条链路里三相电流是原料dq 坐标系是加工车间转矩控制是最终产品。我见过不少刚上手的朋友卡就卡在坐标系变换的物理意义上代码照着抄能跑但一出问题就完全不知道从哪查。所以这篇我打算把这条链路从头到尾捋一遍重点讲清楚每个环节为什么这么设计以及实际调试时那些文档里不会写的坑。适合看这篇的人做过电机控制但 FOC 没跑通的、想从方波驱动升级到 FOC 的、以及被 dq 变换绕晕过的嵌入式工程师。我会尽量用生活化的类比把数学讲明白同时给出可以直接参考的代码结构和参数整定思路。2. 三相电流与坐标变换FOC 的数学地基2.1 为什么三相电流不能直接拿来控制先说说三相电流本身。一个理想的三相无刷电机三相绕组在空间上互差 120 度电角度通入的电流也是互差 120 度的正弦波。这三相电流合成起来就是一个幅值恒定、以电频率旋转的电流矢量。问题来了这个旋转矢量的幅值和角度和转矩之间是什么关系答案是——取决于它和转子磁场的夹角。如果电流矢量和转子磁场方向一致那它只产生励磁不产生转矩如果超前 90 度转矩最大。也就是说要控制转矩本质上是要控制电流矢量相对于转子磁场的位置和大小。但三相电流是三个随时间正弦变化的量你没法直接对它们做 PI 控制——PI 调节器对正弦量的跟踪是有稳态误差的而且三个量互相耦合调一个动全身。这就是为什么必须做坐标变换把问题从“跟踪三个正弦量”变成“控制两个直流量”。这里有个很关键的物理直觉坐标变换不是数学游戏它是在换一个观察视角。就像你坐在旋转木马上看地面的人觉得他们在绕圈但如果你也坐在旋转木马上看另一个同样转速的人他就静止了。Park 变换干的就是这件事——把观察者放到转子上于是定子电流在观察者眼里就变成了两个不动的分量。2.2 Clarke 变换三相到两相的降维Clarke 变换是把三相静止坐标系a、b、c变成两相静止坐标系α、β。因为三相电流满足 ia ib ic 0星形连接无中线时所以三个量里只有两个是独立的降成两维不丢信息。变换公式有两种常见形式区别在系数等幅值变换α 轴分量等于 a 相电流系数是 2/3。这种变换下变换前后矢量的幅值不变做电流环时给定值和实际值可以直接比较工程上最常用。等功率变换系数是 sqrt(2/3)变换前后功率不变但幅值会变做控制时要注意标幺化。我个人的习惯是用等幅值变换因为调试时示波器上看 iα 和 ia 的幅值一致心里有底。具体公式iα (2/3) * (ia - 0.5*ib - 0.5*ic) iβ (2/3) * (sqrt(3)/2) * (ib - ic)实际代码里因为 ia ib ic 0可以简化成i_alpha ia; i_beta (ia 2.0f * ib) * ONE_BY_SQRT3;这个简化版省掉了一次乘法和几次加减在中断里跑能省几个周期。但要注意这个简化只在三相电流严格满足和为零时成立。如果采样有偏差或者电机有中线引出就得老老实实按完整公式算。注意Clarke 变换的输入必须是同一时刻采样的三相电流。如果三相采样有先后顺序在高速下会引入相位误差导致转矩脉动。我见过一个案例电机在 3000 转以上出现明显抖动最后查出来是 ADC 采样顺序导致的改成同步触发就好了。2.3 Park 变换跟着转子一起转Park 变换是把 α、β 坐标系再旋转一个角度 θ转子电角度得到 d、q 坐标系。d 轴对准转子磁场方向q 轴超前 90 度。id iα * cosθ iβ * sinθ iq -iα * sinθ iβ * cosθ变换之后id 是励磁分量iq 是转矩分量。对于表贴式永磁同步电机SPMSMd 轴和 q 轴电感相等磁阻转矩为零所以通常把 id 控制为 0只给 iq 就能控制转矩转矩和 iq 成正比Te 1.5 * p * ψf * iq其中 p 是极对数ψf 是永磁体磁链。这个公式是 FOC 转矩控制的理论基础——只要把 iq 控住转矩就控住了。对于内置式永磁同步电机IPMSMd 轴和 q 轴电感不等存在磁阻转矩这时候可以给一点负的 id 来利用磁阻转矩提高效率这就是所谓的 MTPA最大转矩电流比控制。不过这是进阶话题先把 id0 跑通再说。θ 这个角度从哪来有传感器的话从编码器或霍尔读无感的话从观测器估。这是 FOC 里最要命的一环角度错了整个坐标系就歪了电流全乱套。后面会专门讲。2.4 反 Park 变换与 SVPWM把控制量送回三相电流环算出来的 vd、vq 是旋转坐标系下的电压指令要送回三相去执行得先反 Park 变回 α、βvα vd * cosθ - vq * sinθ vβ vd * sinθ vq * cosθ然后通过 SVPWM空间矢量脉宽调制生成六路 PWM。SVPWM 比正弦波调制SPWM的直流电压利用率高约 15%而且谐波特性更好是 FOC 的标配。SVPWM 的核心思想是用八个基本电压矢量六个有效矢量加两个零矢量去合成任意方向的电压矢量。具体实现有七段式和五段式七段式谐波好但开关次数多五段式开关损耗低但谐波稍差。工程上常用七段式因为死区效应和电流纹波更小。这里有个实操细节SVPWM 计算出来的三个占空比要经过死区补偿再写入定时器比较寄存器。死区是为了防止上下桥臂直通但死区会导致输出电压畸变低速时尤其明显表现为电流波形出现平顶。补偿方法一般是根据电流方向给占空比加一个偏置具体补偿量要结合死区时间和开关频率算。3. 电流环与转矩控制把 iq 拿捏住3.1 电流环为什么是 FOC 的内核整个 FOC 的控制结构是双环外环是速度环或位置环内环是电流环。电流环的带宽通常比速度环高 5 到 10 倍因为电流响应必须足够快才能让转矩指令被及时执行。电流环的输入是 id_ref 和 iq_ref输出是 vd 和 vq。对于 id0 控制id_ref 直接给 0iq_ref 来自速度环的输出。两个 PI 调节器分别控制 d 轴和 q 轴电流。为什么用 PI 而不是别的因为电机绕组是 RL 电路传递函数是一阶的PI 调节器能提供足够的低频增益实现零稳态误差同时通过零点对消把系统整成典型一阶或二阶。理论上PI 参数可以按内模控制IMC或零极点对消法算出来Kp L * ωc Ki R * ωc其中 L 是电感R 是电阻ωc 是期望的电流环带宽。比如 L1mHR0.5Ω想要 2000rad/s 的带宽那 Kp2Ki1000。实际调试时在这个基础上微调因为还有采样延迟、PWM 延迟、死区等非理想因素。提示电流环带宽不是越高越好。带宽太高对采样噪声和 PWM 延迟敏感容易振荡带宽太低转矩响应慢动态性能差。一般取开关频率的 1/10 到 1/20。比如 20kHz 开关频率带宽取 1k 到 2k rad/s 比较稳妥。3.2 dq 轴耦合与解耦补偿dq 坐标系下电压方程是这样的vd R*id Ld*d(id)/dt - ωe*Lq*iq vq R*iq Lq*d(iq)/dt ωe*Ld*id ωe*ψf注意最后那几项带 ωe 的是交叉耦合项和反电动势项。它们的存在意味着你调 d 轴电压q 轴电流会受影响转速越高耦合越强。如果不做解耦电流环在高速下会明显变差甚至失稳。解耦补偿的做法很简单在 PI 输出上叠加前馈项vd_ff -ωe * Lq * iq vq_ff ωe * Ld * id ωe * ψf这样就把耦合项抵消掉了d 轴和 q 轴可以独立调。低速时耦合小加不加差别不大但转速上到额定的一半以上不加解耦基本没法看。我踩过的一个坑一开始没加解耦电机在低速跑得好好的一上高速电流就震荡iq 波形像锯齿一样。查了半天以为是 PI 参数问题后来加上前馈补偿波形立刻干净了。所以如果你发现高速下电流环不稳先检查解耦有没有做对。3.3 转矩控制的实现路径转矩控制的最终目标是让电机输出想要的转矩。对于 id0 控制转矩和 iq 成正比所以速度环的输出直接就是 iq_ref。速度环通常也用 PI输入是速度误差输出是转矩指令。但这里有个限幅问题iq_ref 不能无限大受限于电机额定电流和逆变器容量。所以速度环输出要经过一个限幅器限幅值取电机允许的最大 q 轴电流。同时如果做了弱磁控制id_ref 也会随转速变化这时候转矩和 iq 的关系就不是简单正比了需要查表或在线计算。实际工程里转矩控制还要考虑几个因素电流采样精度采样电阻的温漂、运放的失调都会影响 iq 的准确性进而影响转矩精度。高精度场合要用霍尔电流传感器或隔离运放。角度精度θ 的误差直接导致 id、iq 解算错误表现为转矩脉动。有传感器时要注意编码器安装偏心无感时要注意观测器收敛。死区与管压降低速小电流时死区和 MOS 管压降导致的电压误差占比大会让实际电流偏离指令转矩控制不准。3.4 无感 FOC 的角度估计滑模观测器实战无感 FOC 最核心的问题就是没有编码器怎么知道转子在哪常见方法有反电动势观测、滑模观测器SMO、龙伯格观测器、高频注入等。滑模观测器因为鲁棒性好、实现简单在工业上用得最多。滑模观测器的基本思路是根据电机电压方程构造一个电流观测器用实际电流和观测电流的误差来构造滑模面通过开关函数迫使误差收敛到零从而从等效控制量里提取反电动势再算出角度。具体步骤在 α、β 坐标系下建立电流观测器d(iα_hat)/dt (1/L) * (vα - R*iα_hat - eα_hat) d(iβ_hat)/dt (1/L) * (vβ - R*iβ_hat - eβ_hat)定义滑模面 s iα_hat - iα用符号函数或饱和函数构造控制量eα_hat k * sign(iα_hat - iα)对 eα_hat、eβ_hat 做低通滤波得到反电动势估计值。角度 θ atan2(-eα_hat, eβ_hat)。滑模观测器的难点在抖振和低速性能。符号函数抖振大实际用饱和函数或 sigmoid 函数替代。低速时反电动势幅值小信噪比低角度估计不准所以纯滑模观测器一般只能跑到额定转速的 5% 到 10% 以上。要低速甚至零速运行得用高频注入或者把滑模和别的观测器结合起来。注意滑模观测器的参数 k 需要根据反电动势幅值来整定。k 太小收敛慢k 太大抖振严重。一般取反电动势峰值的 1.5 到 2 倍。另外低通滤波会引入相位延迟高速时要补偿补偿角 atan(ωe / ωc)ωc 是滤波器截止频率。4. 从代码到波形FOC 实操全流程4.1 硬件与软件框架搭建一套典型的 FOC 系统硬件上需要三相逆变桥六个 MOS 或 IPM、电流采样电路至少两相常用三电阻或单电阻、母线电压采样、转子位置传感器有感的编码器/霍尔无感的省掉、以及一颗能跑浮点或定点 FOC 的 MCU。软件框架我一般这么分PWM 中断最高优先级触发 ADC 采样、执行电流环、更新 PWM 占空比。频率等于开关频率比如 20kHz。速度环中断频率低一些比如 1kHz执行速度 PI 和角度更新。主循环处理通信、状态机、故障保护。PWM 和 ADC 的同步很关键。通常用定时器的更新事件触发 ADCADC 转换完成后产生中断在中断里做 FOC 计算。这样采样时刻固定在 PWM 周期的中点或起点避开开关噪声。void PWM_IRQHandler(void) { // 1. 读取三相电流 ia ADC_GetPhaseA(); ib ADC_GetPhaseB(); ic -ia - ib; // 2. Clarke 变换 i_alpha ia; i_beta (ia 2.0f * ib) * ONE_BY_SQRT3; // 3. Park 变换 id i_alpha * cos_theta i_beta * sin_theta; iq -i_alpha * sin_theta i_beta * cos_theta; // 4. 电流 PI vd PI_Update(pi_d, id_ref - id); vq PI_Update(pi_q, iq_ref - iq); // 5. 解耦补偿 vd - omega_e * Lq * iq; vq omega_e * (Ld * id psi_f); // 6. 反 Park v_alpha vd * cos_theta - vq * sin_theta; v_beta vd * sin_theta vq * cos_theta; // 7. SVPWM SVPWM_Calc(v_alpha, v_beta, duty_a, duty_b, duty_c); PWM_SetDuty(duty_a, duty_b, duty_c); // 8. 清中断标志 PWM_ClearIRQ(); }这段代码是骨架实际还要加母线电压补偿、死区补偿、过流保护等。母线电压补偿是因为 SVPWM 输出的占空比对应的是实际母线电压如果母线波动同样的占空比输出电压会变所以要用实际母线电压归一化。4.2 电流采样时机与噪声抑制电流采样是 FOC 里最容易出问题的地方。三电阻采样时采样时刻必须避开开关动作否则采到的是开关噪声。通常的做法是在 PWM 周期的中点采样因为这时候下桥臂导通采样电阻上有电流流过。但中点采样有个限制当占空比接近 0% 或 100% 时下桥臂导通时间太短采样窗口不够。这时候要么用最小采样时间限制要么切换到单电阻采样方案。单电阻采样只需要一个采样电阻成本低但重构三相电流的算法复杂且在扇区边界处有盲区。噪声抑制方面硬件上在采样电阻两端加 RC 滤波软件上做多次采样取平均或中值滤波。但滤波会引入延迟影响电流环带宽所以要权衡。我一般用两次采样取平均延迟小效果也够。提示采样电阻的选型要考虑功耗和信噪比。阻值大信号强但功耗大阻值小功耗低但信号弱。一般取 1mΩ 到 10mΩ配合运放放大到 ADC 量程的 1/2 到 2/3。运放要选高共模抑制比、低失调的比如差分运放。4.3 参数整定与调试步骤FOC 调试我一般按这个顺序来确认硬件先不接电机用示波器看六路 PWM 波形确认死区、极性、互补性都对。然后接一个假负载比如三个电感看电流采样是否正常。开环旋转给一个固定的电压矢量和逐渐增加的角度让电机开环转起来。这一步验证 SVPWM 和角度生成是否正确。如果电机不转或抖动检查相序和角度方向。电流环整定电机堵转或带小负载给 id_ref0iq_ref 给一个小阶跃看 iq 的响应。先调 Kp 到临界振荡再降到 0.5 倍然后加 Ki 消除稳态误差。用示波器看 iq 波形上升时间、超调、稳态误差都要关注。速度环整定电流环 OK 后闭合速度环给速度阶跃调速度 PI。速度环带宽取电流环的 1/5 到 1/10。无感观测器调试如果做无感先开环拖到一定转速切换到闭环看观测器角度和实际角度的误差。误差大就调观测器参数或者检查反电动势常数是否准确。每一步都要用示波器或上位机看波形不要凭感觉。我习惯用 DAC 把 id、iq、速度这些量输出到示波器上实时观察。没有 DAC 的话用串口上传到上位机画波形也行但采样率受限。4.4 常见问题与排查速查表现象可能原因排查方法电机不转有嗡嗡声相序错、角度方向错交换任意两相或角度加负号低速抖动高速正常死区补偿不足、电流采样噪声加大死区补偿检查采样时刻高速电流震荡解耦未做、PI 带宽过高加前馈解耦降低 Kp转矩脉动大角度误差、电流采样偏差校准编码器检查采样电阻无感启动失败观测器低速不收敛用高频注入或开环启动过流保护频繁触发电流环参数太激进、限幅值太小降低 Kp检查限幅电机发热严重id 不为零、谐波大检查 id_ref优化 SVPWM这张表是我这些年踩坑总结出来的基本覆盖了 80% 的常见问题。遇到问题先查表能省不少时间。5. 进阶话题与工程经验5.1 弱磁控制与 MTPA电机转速升高时反电动势增大当反电动势接近母线电压时电流环就饱和了转速上不去。这时候需要弱磁给一个负的 id削弱转子磁场降低反电动势。弱磁控制的核心是电压极限椭圆和电流极限圆的约束下找到最优的 id、iq 组合。MTPA 则是另一个方向对于 IPMSM通过合理分配 id 和 iq用最小的电流产生最大的转矩。MTPA 的解析解可以通过对转矩公式求导得到但实际因为参数非线性常用查表法。这两个话题展开能写一整篇这里只提一点弱磁和 MTPA 都需要准确的电机参数Ld、Lq、ψf参数不准效果大打折扣。所以做这些高级控制之前先把参数辨识做扎实。5.2 带宽的理解与整定热词里有个“foc控制中带宽的理解”我单独说说。带宽本质上是系统对指令的跟踪能力定义为幅频特性下降到 -3dB 对应的频率。电流环带宽决定了转矩响应的快慢速度环带宽决定了速度跟踪的快慢。带宽不是越高越好受限于采样频率根据香农定理带宽不能超过采样频率的一半实际取 1/10 以下。PWM 延迟PWM 更新有半个周期的延迟加上采样和计算延迟总延迟约 1.5 个 PWM 周期。延迟越大可达到的带宽越低。噪声带宽高高频噪声放大容易振荡。整定时先用理论公式算一个初值然后在实际系统上测阶跃响应看上升时间和超调。如果超调大降 Kp如果有稳态误差加 Ki。反复几次就能找到合适的值。5.3 无感 FOC 的启动策略无感 FOC 最大的难点是启动。零速和低速时反电动势为零或很小观测器无法估计角度。常见的启动策略有三种三段式启动先强制对齐给一个固定角度通电流把转子拉到已知位置然后开环加速按预设的加速度增加角度和电压最后切换到闭环。简单可靠但启动时间和位置不确定。高频注入在 d 轴注入高频电压信号利用凸极效应提取转子位置。能实现零速启动但对电机凸极率有要求且注入会带来噪音和损耗。I/F 启动电流闭环、频率开环给一个旋转的电流矢量让电机跟着转达到一定转速后切换到 FOC。比三段式平滑但参数整定麻烦。我一般先用三段式把系统跑通再根据应用需求决定要不要上高频注入。航模和风扇这类对启动时间不敏感的三段式足够了伺服和压缩机这类要求零速大转矩的得上高频注入。5.4 代码优化与实时性FOC 中断里跑的东西不少20kHz 开关频率意味着 50us 就要跑完一次。三角函数、除法这些运算很耗时得优化。三角函数用查表法或 CORDIC 算法比库函数快很多。查表要注意分辨率太粗会导致角度误差太细占 Flash。除法尽量用乘法代替比如除以 3 变成乘以 1/3。定点化如果 MCU 没有 FPU用 Q 格式定点运算速度比浮点快几倍。但要注意溢出和精度。中断优先级FOC 中断优先级最高其他中断不能打断它否则时序会乱。我实测过在 100MHz 的 M4 上浮点 FOC 跑 20kHz 大概占 30% 到 40% 的 CPU定点能降到 15% 左右。如果还要跑观测器和弱磁得留够余量。5.5 实测经验与避坑清单最后分享几条我踩过的坑电流采样运放的失调运放失调会导致零电流时采样不为零积分后 id、iq 漂移。上电时要校准失调或者用软件做零漂补偿。编码器安装偏心会导致角度误差随位置周期性变化表现为转矩脉动。安装时要保证同心度或者做偏心补偿。死区时间过大死区大了输出电压损失大低速时电流畸变严重。死区时间一般取 0.5us 到 2us根据 MOS 开关速度定。母线电容太小母线电容小电压波动大影响 SVPWM 输出。一般按每安培 100uF 到 200uF 选。参数辨识不准R、L、ψf 不准电流环和观测器都调不好。上电时做一次参数辨识或者用 LCR 表测。FOC 这东西理论看一遍觉得懂了实际调起来全是细节。我的建议是先搭一个能跑的最小系统把电流环调好再逐步加功能。每加一个功能都要用波形验证不要凭感觉。波形不会骗人眼睛会。后续如果想深入可以研究一下模型预测控制MPC在 FOC 上的应用或者把 FOC 和参数辨识、无位置传感器技术结合起来。但基础的三相电流、dq 变换、转矩控制这条链路是所有进阶的根基值得反复琢磨。
返回列表