尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FOC电流环实战:从ADC采样到PI整定,彻底解决电机抖动与啸叫

发布时间:2026/9/29 17:51:20

资讯中心
01
ARTICLE

FOC电流环实战:从ADC采样到PI整定,彻底解决电机抖动与啸叫

FOC电流环实战:从ADC采样到PI整定,彻底解决电机抖动与啸叫
1. 从“升魂浩荡”说起这套FOC电流环到底在折腾什么“升魂浩荡”这个词放在电机控制里其实挺传神——电流环调好了电机运转那种丝滑跟手的感觉确实像给一台普通电机“升了魂”。我最早接触FOC是在一台云台电机上当时用方波驱动低速抖动、噪音大、力矩脉动明显换成FOC之后整个手感完全变了。而FOC三环里头电流环是最内环也是决定整套控制品质的地基。速度环、位置环调得再花哨电流环要是软了、抖了、响应慢了上层全是空中楼阁。这篇内容主要面向已经上手过STM32、玩过PWM输出、对电机控制有基本概念但电流环总是调不出理想效果的兄弟。我会把电流环从采样时刻、坐标变换、PI整定、解耦补偿、程序结构这几个维度拆开讲尽量把“为什么这么写”讲透而不是只丢一段代码让你抄。文中涉及的参数和代码结构都是基于STM32G4/F4系列加DRV8301或类似栅极驱动方案的常见实践其他平台思路一致细节自行迁移。先给一个整体认知电流环的本质就是让电机绕组里的电流在几毫秒甚至几百微秒内精确跟踪你给定的Id和Iq。Id一般给0表贴式PMSMIq对应转矩。听起来简单但实际做起来采样时机差一点、角度延迟一点、PI参数偏一点波形就全乱了。下面按我实际调试的顺序一层层往下剥。2. 电流环的整体设计与方案选型思路2.1 为什么电流环必须用FOC而不是简单PI很多人一开始会想我不就是想让电流等于给定值吗直接拿给定电流减反馈电流过一个PI输出PWM占空比不就行了这个思路在直流有刷电机上勉强能用但在三相PMSM上会直接崩掉。原因在于三相电流是耦合的你调A相B相和C相的电流也会跟着变三个PI互相打架永远稳不下来。FOC的核心操作是通过Clarke变换和Park变换把三相交流量转到两相旋转坐标系下。在dq坐标系里Id和Iq在稳态下是直流量直流量用PI调节器可以做到零稳态误差。这就是为什么FOC的电流环能做得又准又快。Clarke变换把三相变成两相静止坐标系αβPark变换再根据转子电角度θ把αβ转到dq。整个链路是Ia、Ib、Ic → Clarke → Iα、Iβ → Park(θ) → Id、Iq → PI调节 → Vd、Vq → 反Park(θ) → Vα、Vβ → SVPWM → 六路PWM这个链路里θ的准确性是命门。θ差一点Id和Iq就会串扰你给Iq阶跃结果Id也跟着跳转矩响应就脏了。所以有感和无感的区别很大程度上就是θ从哪来的区别。2.2 有感与无感在电流环层面的差异有感方案用编码器或霍尔θ直接读电流环可以跑得很高带宽通常PWM频率16kHz到20kHz电流环也在同频率执行带宽能做到1kHz以上。无感方案用滑膜观测器或龙伯格观测器估算θ估算本身有延迟和噪声电流环带宽就得压一压否则观测器跟不上整个系统会啸叫。我自己的经验是第一次调电流环一定先用有感把电流环调明白把采样、变换、PI、SVPWM这条链路全部验证正确再去碰无感。否则无感不收敛的时候你根本分不清是观测器的问题还是电流环的问题。热词里提到的“无感foc滑膜观测器”和“foc转子初始位置检测”都是建立在电流环已经稳定的前提下的。2.3 电流环执行频率与PWM频率的关系一个常见误区是电流环频率随便设。实际上电流环的执行频率最好等于PWM频率并且在PWM计数器的特定时刻触发ADC采样。以中心对齐PWM为例计数器从0往上数到ARR再往下数回0通常选择在计数器等于ARR即波峰或者等于0波谷时触发ADC。这个时刻下桥臂导通采样电阻上的电流才是真实的相电流。如果采样时刻选错比如在开关切换瞬间采样你会采到开关噪声电流波形上全是毛刺PI再一放大电机直接叫。所以“foc adc采样应该在什么时刻”这个问题答案就是中心对齐模式下在计数器波峰或波谷触发且要避开开关死区引起的振铃通常加一点采样延迟。3. 核心细节解析与实操要点3.1 ADC采样时刻与电流重构先讲采样。三相电流一般只采两相第三相由IaIbIc0算出来。采样电阻可以放在下桥臂对地也可以放在母线。下桥臂采样成本低但要求在下桥臂导通时采。中心对齐PWM的波峰时刻三个下桥臂都导通假设占空比不是100%这时候采最稳。具体操作把ADC的触发源设为TIM的TRGOTRGO事件配置在计数器等于ARR时产生。然后在ADC中断里读结果。但要注意从触发到ADC实际采样保持中间有采样窗口如果PWM频率很高比如20kHz周期50us采样窗口要设短一点比如几个ADC时钟周期否则会采到下一个开关状态。我踩过的坑一开始没加采样延迟电流波形在轻载时还行一加载就全是尖刺。后来在触发后加了约1us的延迟再启动ADC波形立刻干净。这个延迟具体多少要看你的栅极驱动死区时间和MOS管开关速度一般0.5us到2us之间试。3.2 Clarke与Park变换的实现细节Clarke变换有两种形式等幅值和等功率。电流环里常用等幅值系数是2/3。公式Iα IaIβ (Ia 2Ib) / √3或者用更对称的形式Iα (2Ia - Ib - Ic) / 3Iβ (Ib - Ic) / √3实际写代码时为了省计算常用查表或者定点运算。STM32G4有CORDIC和FMAC可以加速三角函数但Park变换需要sin和cos如果MCU没有硬件三角函数就用查表加线性插值。表长1024或2048精度足够。Park变换Id Iα * cosθ Iβ * sinθIq -Iα * sinθ Iβ * cosθ这里θ是电角度不是机械角度。电角度 机械角度 × 极对数。编码器读回来的是机械角度要乘极对数再取模。这个细节新手经常忘结果电机转起来电流环完全不对。3.3 电流环PI调节器的结构与参数整定电流环PI一般用并联形式Vd Kp * (Id_ref - Id) Ki * ∫(Id_ref - Id) dtVq Kp * (Iq_ref - Iq) Ki * ∫(Iq_ref - Iq) dt但实际工程里为了抗积分饱和会加限幅和抗饱和逻辑。积分项在输出限幅时停止积分或者用反算抗饱和。参数整定有个经典方法把电流环等效成一阶惯性环节然后按带宽配置。电机电气时间常数τ L/RL是相电感R是相电阻。PI的零点对消掉这个极点即Ki/Kp R/L。然后Kp决定带宽Kp L * ωcωc是期望带宽一般取PWM角频率的1/10到1/5。举个例子某云台电机L0.5mHR0.5ΩPWM频率20kHzωc取2000rad/s约318Hz。则Kp 0.0005 * 2000 1.0Ki Kp * R/L 1.0 * 1000 1000。这个值只是起点实际还要根据采样延迟和滤波再微调。注意这个计算假设电流环执行频率远高于带宽且采样延迟可忽略。如果执行频率只有10kHz带宽要再降。3.4 交叉解耦补偿的必要性dq轴之间不是完全独立的存在交叉耦合项Vd和Vq里分别有 -ωLqIq 和 ωLdId ωψf 的耦合。低速时ω小耦合可以忽略高速时如果不补偿Id和Iq会互相干扰电流环跟踪变差。补偿公式Vd_comp Vd_pi - ω * Lq * IqVq_comp Vq_pi ω * Ld * Id ω * ψf其中ψf是永磁磁链。表贴式电机Ld≈Lq补偿简单些。我一般在中高速时才开解耦低速时关掉避免参数不准反而引入扰动。热词里“永磁同步电机电流环内膜解耦”说的就是这个内膜解耦是更高级的形式用内模原理设计控制器对参数鲁棒性更好但实现复杂新手先把前馈解耦做好就够用。4. 实操过程与核心环节实现4.1 硬件与工程环境准备我用的平台是STM32G474 DRV8301 一台24V云台电机编码器是AS5047P。工程用STM32CubeMX生成IDE是STM32CubeIDE。时钟配置到170MHzPWM用TIM1中心对齐频率20kHz死区时间500ns。ADC用注入组由TIM1的TRGO触发。关键配置清单项目配置PWM模式中心对齐20kHz死区500nsADC触发TIM1 TRGO波峰ADC采样时间1.5 cycles电流采样下桥臂电阻两相编码器SPIAS5047P电流环频率20kHz与PWM同步4.2 电流环中断服务程序结构中断里做的事情要尽量精简顺序如下读ADC结果得到Ia、Ib计算Ic -Ia - Ib读编码器得到机械角乘极对数得电角度θClarke变换得Iα、IβPark变换得Id、IqPI调节得Vd、Vq解耦补偿反Park得Vα、VβSVPWM计算占空比更新TIM比较寄存器整个过程要在50us内完成所以尽量用定点或硬件加速。G4的CORDIC可以算sin/cosFMAC可以加速滤波用起来很爽。4.3 SVPWM的实现与占空比计算SVPWM比SPWM电压利用率高15%是FOC标配。实现方式有查表法和公式法。公式法用Vα、Vβ判断扇区然后算作用时间。我一般用简化公式先算三个中间变量Va VβVb (√3 * Vα - Vβ) / 2Vc (-√3 * Vα - Vβ) / 2然后根据Va、Vb、Vc的正负判断扇区再算T1、T2最后算三相占空比实际写的时候注意Vα、Vβ要归一化到母线电压。如果母线电压波动最好做母线电压补偿否则占空比会随电压漂。4.4 参数整定现场记录第一次上电先不接电机用示波器看PWM输出确认六路波形正常死区正确。然后接电机但母线电压调低到5V防止炸管。给Id_ref0.1AIq_ref0看Id能不能跟上。如果Id震荡先降Kp再降Ki。如果Id响应慢加Kp。我当时的记录Kp1.0Ki1000Id阶跃0.1A响应时间约2ms超调20%降Kp到0.5Ki到500响应时间约4ms超调5%再加Kp到0.8Ki到800响应时间约2.5ms超调10%最后取Kp0.8Ki800。然后给Iq阶跃看转矩响应。注意Iq阶跃时电机会转要固定转子或者用测功机加载。5. 常见问题与排查技巧实录5.1 电流波形毛刺大、PI输出饱和最常见的原因是采样时刻不对。排查步骤用示波器看采样触发信号和PWM波形确认触发在波峰或波谷看ADC采样窗口是否太短检查下桥臂采样电阻的运放滤波电容是否太大导致响应慢检查死区时间是否过长导致采样时下桥臂还没完全导通我遇到过一次毛刺是因为运放供电被PWM噪声干扰加了个RC滤波就好了。5.2 电机啸叫、电流环震荡啸叫通常是PI参数太激进或者解耦补偿参数不对。先把解耦关掉只留PI如果还叫降Kp。如果降Kp后响应太慢检查电流环执行频率是否稳定有没有被其他中断打断。另一个原因是电角度θ有偏差。用示波器看相电流和反电动势过零点如果对不上说明θ有偏移需要校准编码器零位。5.3 无感模式下电流环不收敛无感时观测器估算的θ有延迟和噪声。解决办法降低电流环带宽Kp和Ki都降在观测器输出加低通滤波但滤波会引入相位延迟要折中检查滑膜观测器的增益是否合适增益太大抖太小收敛慢我一般先用有感把电流环调到满意然后切无感把Kp降30%左右再微调。5.4 常见问题速查表现象可能原因排查方法电流毛刺大采样时刻不对示波器看触发与PWM电流震荡PI太激进降Kp、Ki电机啸叫解耦参数错关解耦再试响应慢Kp太小加Kp稳态误差Ki太小加Ki高速跟踪差未解耦开前馈解耦无感不收敛观测器延迟降带宽、调观测器提示每次只改一个参数改完记录波形否则你永远不知道是哪个参数起了作用。6. 程序结构优化与代码组织建议6.1 中断优先级与执行时间电流环中断优先级要最高不能被其他中断打断。把ADC中断设为最高优先级编码器读取可以放在里面但SPI读编码器可能耗时如果太慢可以用DMA或者放在低速任务里用上一次的角度加补偿。我实测SPI读AS5047P约2us可以接受。如果编码器是SSI或BiSS可能更慢要考虑。6.2 定点与浮点的选择G4有FPU浮点运算快我直接用float。F4也有FPU但主频低如果电流环频率高可以考虑定点。定点Q格式要小心溢出尤其是积分项。6.3 代码模块划分建议分成bsp_adc.cADC初始化与读取bsp_encoder.c编码器读取与角度计算foc_math.cClarke、Park、反Park、SVPWMfoc_current.c电流环PI与解耦foc_main.c主循环与状态机这样换平台时只改bsp层算法层不动。7. 一些个人体会与后续扩展调电流环这件事急不得。我见过太多人一上来就想跑无感高速结果连有感的电流波形都没看明白。我的建议是先把有感的电流环调到阶跃响应干净利落再碰速度环最后才是无感和高速。每一步都拿示波器看波形不要凭感觉。另外母线电压补偿、温度补偿这些低速时影响不大但高速或大电流时一定要做。还有电流环的PI输出限幅要设对一般限制在母线电压的0.95倍以内留点余量给SVPWM。后续如果想深入可以研究内模解耦、预测电流控制、无差拍控制这些在高性能场合有用。但基础电流环没调好这些高级算法也救不了。先把地基打牢再往上盖楼。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。