无感FOC从开环到闭环:基于AC7811的滑模观测器与PID整定实战

发布时间:2026/10/3 9:30:34
无感FOC从开环到闭环:基于AC7811的滑模观测器与PID整定实战
做无感FOC有一段时间了手里这个项目从AC7811的SDK例程开始一路把开环跑通、把滑模观测器调稳、最后在负载下闭环稳定运行前前后后花了我大概三周的业余时间。这篇文章不打算讲教科书式的数学推导而是把“从开环到闭环”这条主线上所有我认为重要的细节记录下来。如果你刚接触无感FOC或者正被观测器切换搞得头皮发麻这篇东西应该能给你一个完整的参照系。项目硬件是AC7811主控板加一块自研功率板电机是一台24V供电、极对数为4的表贴式永磁同步电机额定转速4000rpm。之所以选AC7811纯粹是因为公司在车规预研项目里指定了这颗芯片但真正用下来之后我反而觉得它比很多通用MCU更适合做FOC后面会专门解释这颗芯片的优势。这篇记录按项目推进的顺序来写先讲方案取舍和硬件平台再讲开环怎么跑起来、观测器怎么调、切换怎么做、PID怎么整定最后把调试中遇到过的问题全部列出来。如果你赶时间可以直接跳到后面“常见问题排查记录”部分先看一眼。1. 做这个项目前先想清楚两件事1.1 AC7811这颗芯片究竟强在哪AC7811是国产车规级MCUARM Cortex-M3内核主频96MHz。它和普通通用MCU最大的区别在于内部集成了针对电机控制的硬件加速单元。Clarke变换、Park变换这类最耗时的三角函数和矩阵运算可以在硬件模块里完成软件上只需要配置寄存器、喂数据、读结果。这个设计对无感FOC非常友好因为整个控制环路里坐标变换的执行频率很高每周期都要算用硬件省下来的CPU周期可以留给观测器、PLL锁相环、PI调节器、状态机和各种保护逻辑。96MHz跑一个20kHz的FOC控制环路按说软件负载确实不大但无感FOC不是只有坐标变换。观测器、反电动势滤波、速度估算、电流环速度环、死区补偿、过压过流保护这些杂七杂八的代码加起来CPU占用率很容易就到30%以上。有了硬件加速软件侧余量就大很多后期再塞通信协议和故障记录功能也不紧张。另外AC7811的PWM模块支持三相互补输出和死区插入ADC也支持由PWM硬件触发这些对电机控制来说都是刚需省掉了不少外搭逻辑。1.2 为什么非得“先开环后闭环”无感FOC需要一个前提条件就是知道转子当前的电角度。没有编码器这个角度只能靠观测器估。问题是永磁同步电机的反电动势大小和转速成正比转速很低的时候反电动势只有几十毫伏甚至更低早就淹没在开关噪声和ADC量化噪声里了。这个信噪比下任何观测器都没法给出可信的位置信息。所以工程上最可靠的做法就是低速阶段先“不管转子在哪直接强拖”。用一个软件生成的旋转电流矢量去拽转子等转子被拖到一定转速、反电动势大到可以观测之后再让观测器给出的电角度接管系统。整条路线就是预定位 → 开环加速 → 切换条件判断 → 切入闭环。这个流程从理论上绕开了无感FOC最难处理的最低速段也是量产方案里最常见的选择。我经常把这段过程比作手动挡汽车起步。你不能指望松开离合的一瞬间发动机和车轮就完全同步而是先让离合器在半联动状态摩擦发动机带着车慢慢走起来等转速匹配之后再把离合完全松开。FOC里从开环到闭环的切换本质就是在做同等意义的事。2. 硬件平台搭建与关键参数计算2.1 三相逆变与电流采样电路先给硬件画个像。功率级是典型的三相MOSFET全桥24V母线输入6颗低压NMOS做上下管互补开关栅极驱动芯片负责电平转换和死区控制。电流采样采用双电阻方案在A相和B相的低边MOS管源极与地之间各放一个采样电阻C相电流在软件里通过基尔霍夫定律算出来。三相电流瞬时值之和恒为零所以只要拿到A相和B相C相就完全确定了。这里要说一下为什么不用单电阻方案。单电阻只需要一个采样电阻成本最低但电流重构对PWM占空比的依赖非常强。占空比太小或者接近满占空比的时候下管导通时间不够无法可靠地推出三相电流这就是单电阻方案在高转速和低转速两端都有“重构盲区”的原因。双电阻方案在这些问题面前稳定得多调试时也不需要对占空比做额外约束反而省心。采样电阻的选择也很关键。阻值要足够小避免大电流流过时产生过多的功率损耗但阻值太小采样信号幅度就不够容易被噪声淹没。我这边选的是10mΩ、2512封装的合金电阻峰值电流按5A设计压降50mV对采样电路来说这个信号幅度是可以接受的电阻自身功耗也控制在瓦级以内散热压力不大。2.2 采样放大倍数与采样窗口的计算采样放大电路的输出范围决定了整个电流环的测量分辨率。我用的是一颗电流检测放大器固定增益20倍。ADC输入范围是0到3.3V中间值1.65V对应零电流满量程3.3V对应正峰值0V对应负峰值。按10mΩ采样电阻和5A峰值电流来算电阻压降50mV放大20倍就是1V放大器输出范围从1.65V往上下各偏1V也就是0.65V到2.65V基本适配ADC量程。真正容易被忽略的是放大器的共模电压问题。低边采样电阻并不是永远处于地电位MOSFET开关瞬间采样电阻对地会有极高的dv/dt冲击普通差分运放很容易被这种快速共模变化拉偏。我推荐用类似INA240这类电流检测放大器它的共模抑制比和内部滤波做得很好实测在24V母线、20kHz开关频率下电流波形毛刺比普通运放方案小一个数量级。增益校准也不能省。采样电阻本身有1%的精度误差放大器的失调电压和增益误差也是真实存在的。如果不校准电流环的d轴会偏闭环之后会产生恒定的转矩脉动。我在项目里用恒流源灌一个标准电流记录每个采样通道的ADC码值反算出每相的增益和偏移然后把这些补偿值存到Flash里后面调试就稳很多。2.3 ADC触发与PWM时序对齐电流采样点不是随便选的。PWM输出采用中心对齐模式三角波计数器的周期对应20kHz开关周期。在每个PWM周期的中心点也就是计数下溢或上溢的位置三相低边管会同时导通此时采样电阻两端的电压正好反映对应绕组的瞬时电流。把这个时间点接成ADC的硬件触发源就能保证每次采样都落在电流纹波的中心噪声最小。如果你把采样点放在开关沿附近采到的可能是振铃和死区造成的尖峰。我一开始懒得配置触发直接用软件连续采样波形噪得没法看。后来改成PWM硬件触发ADC代码看着复杂了但波形干净立竿见影。另外ADC本身的采样窗口也需要留够一般几十纳秒到几百纳秒这个时间在中心对齐模式下完全够用只要死区设置合理下管导通窗口是足够宽的。3. 开环阶段先把电机稳稳转起来3.1 从V/F开环说起开环阶段我先从最简单的V/F控制开始。V/F的意思是电压幅值和频率之比恒定早期变频器控制异步电机基本都是这个思路。它在代码上的实现非常简单只需要按给定频率生成三相正弦电压的相位电压幅值跟频率成比例就行。但V/F用在PMSM上有一个天然缺陷。PMSM是同步电机转子必须和定子旋转磁场严格同步旋转V/F对转子的实际位置完全没有感知负载一旦变化转子和磁场之间就会拉开一个很大的功角当功角超过临界值电机就会失步。我实验下来的结果是空载可以慢慢转起来但稍微施加一点负载电流就开始喘振严重时直接掉步。不过V/F在项目里依然很有价值它就是验证PWM和ADC链路最直接的工具。给电机发一个固定频率的固定电压矢量相电流波形应当是一组标准的正弦幅值稳定、没有截顶。这一步跑通基本就可以确定硬件链路和底层配置没问题后面所有复杂算法都是在同一个地基上搭建的。3.2 更适合启动的I/F开环控制V/F开环只是链路自检真正用来启动无感PMSM的是I/F控制。I/F的含义是电流环闭合转矩电流指令直接给定电流矢量的角度完全由软件开环给定。这里要讲清楚一个容易误解的点I/F不是放弃FOC的坐标变换它其实还是做Clarke变换、Park变换、电流环PI和SVPWM只是Park变换所用的角度来自一段开环斜坡积分而不是观测器输出。电流指令一般设为d轴为0、q轴为固定值比如1.5A。这个固定电流决定电机在开环阶段能输出的加速力矩电流越大拉力越强但铜损也会快速上升。启动之前一定要做定位。如果不知道转子初始位置就直接上开环斜坡电流矢量方向和转子所处位置对不上启动瞬间就会出现反转或者顿挫。定位的做法有好几种最简单有效的方法是在固定位置施加一段时间的恒定电流矢量让转子强制转到这个位置。载荷不大、静摩擦力不大的场合这个办法完全够用。如果负载摩擦较大可以用三段式定位法分别施加三个间隔120°的电压矢量通过采样电流的响应判断转子位置再做一次精确拉正。3.3 开环调试中的几个观察点开环阶段需要重点观察几个量相电流幅值是否稳定、电流波形有没有明显畸变、电机有没有异响或机械抖动、母线电流是否平稳。任何一个异常都值得停下来查原因因为开环阶段的问题如果带进闭环后面排查会指数级变难。加速度率是开环阶段的重要参数。电角度加速度设得太大电流矢量转得太快转子跟不上功角被不断拉大很快就会失步设得太小电机长时间处于大电流小速度状态发热严重。我这台电机的启动经验值是从电角加速度100到300 rad/s²这个区间开始试然后用示波器观察实际转速的跟踪情况出现顿挫就降低斜率。还有一个经验开环阶段的q轴电流不是越大越好。空载调试时可以给1.5A左右带载启动建议按额定电流的60%到80%给。如果电流已经给到额定值还是失步优先检查预定位是否到位而不是继续往上加电流盲目加电流只会加剧发热并不会解决根本的失步问题。4. 无感闭环的核心转子位置观测4.1 为什么低速无感难做无感观测的困难根源还是反电动势。反电动势的幅值等于转速乘以磁链常数速度越低反电动势越小。E小了之后和开关噪声、采样量化噪声混在一起信噪比完全没法看。各种花哨的观测器算法在中低速段确实能试着恢复位置但对硬件精度和参数鲁棒性要求非常高量产项目中一般不愿意冒这个风险。这也是为什么很多无感FOC产品在低速段会听到“吱吱”的声音。那其实是定位激励和PWM噪声通过电机产生的声学响应物理上很难完全消除。真正的无感FOC方案普遍主打中高速段低速直接上闭环的要么是特殊应用场景要么是对硬件和算法都有极强的把控能力。对大多数工程师来说老老实实做“开环启动中高速闭环”是最务实的路线。4.2 滑模观测器SMO怎么估计反电动势我用的是最通用的滑模观测器SMO。永磁同步电机在αβ静止坐标系下的电压方程可以写成下面这个形式其中u是定子电压i是定子电流R和L分别是相电阻和相电感e就是要估计的反电动势uα R·iα L·diα/dt eα uβ R·iβ L·diβ/dt eβ eα -ψf·ωe·sin(θe) eβ ψf·ωe·cos(θe)SMO的思路是按照电机模型构造一个并联的电流估计模型然后定义一个滑模面 s i_hat - i用符号函数乘以一个较大的增益K把估计电流强行拉向实测电流。当系统进入滑模面之后这个控制量的平均值就等效于反电动势。具体到代码里电流估计方程写成L·diα_hat/dt uα - R·iα_hat - K·sign(iα_hat - iα) L·diβ_hat/dt uβ - R·iβ_hat - K·sign(iβ_hat - iβ)滑模增益K的经验取法是比电机最大反电动势幅值大一些。太小了进不了滑模面估计值发散太大了会产生明显的抖振电流波形上能看到高频毛刺。反电动势估计出来之后一般还要经过低通滤波器滤掉滑模控制量里的高频开关成分。我用的是2kHz截止频率的一阶低通滤波器在主要转速范围内既能滤掉开关噪声相位滞后也不会大到影响稳定性的程度。4.3 PLL锁相环如何提取转子角度拿到反电动势估计值之后下一步就是从eα和eβ中解出转子电角度。最朴素的方法是直接做atan2(-eα, eβ)但实际调试中这个信号在波形过零区域会被噪声扰动得很厉害角度会出现跳变。我最终使用的是锁相环PLL把角度误差送进PI调节器PI输出转速估计转速再积分成电角度形成一个闭环跟踪环路。PLL的误差信号是这样算的ε -eα_hat·cos(θ_hat) - eβ_hat·sin(θ_hat)当角度误差很小时这个表达式近似正比于真实角度和估计角度之差可以作为PI调节器的输入。PI输出的就是转速估计值ω_hat再积分一次就是θ_hat。PLL的带宽设置很关键太宽会把反电动势里的谐波噪声引入角度太窄会让角度动态响应变慢。从实际参数看电流环带宽通常1kHz左右PLL带宽放在100到300Hz这个区间比较合适具体数值可以根据电机转速范围微调。整个观测器链路看起来环节多但AC7811的硬件加速单元能覆盖坐标变换的大部分运算实际代码里SMO加PLL的主循环开销并不大。如果你的主控没有硬件加速也可以用查表法或定点运算优化20kHz控制周期下DSP指令集的MCU通常也能跑得动。5. 从开环切闭环的实操策略5.1 切换前必须满足的条件系统从开环切入闭环不能拍脑袋直接切要先判断观测器给出的角度是否可信。具体做法是同时记录两个角度一个是开环自己生成的电流矢量角度一个是观测器估计的转子电角度。开环阶段的电机是被电流矢量拖着走的如果转子已经稳定同步开环角度和转子实际电角度之间会差一个固定的功角δ而观测器估计的电角度理论上会跟踪转子的真实位置。这里有个关键点需要注意切换条件不是“开环角度和观测器角度差为0”。因为开环电流角度本来就超前转子一个功角所以差值稳定在某个非零值反而是正常的。真正要警惕的是这个差值一直在漂移那说明转子没有跟上电流矢量处于失步边缘。我最终设定的切换条件是三个转速超过阈值我这边取500rpm机械转速开环角度与观测器角度之差在±15°以内这个条件连续保持50ms以上。三个条件缺一不可任何一个不满足就继续开环。调试的时候最好把这两个角度差用串口实时发出来一边调一边看它们是否收敛。5.2 角度平滑与电流冲击控制真正执行切换时要留意几个容易忽略的点。第一是Park变换的角度源切换要尽量平滑避免角度跳变导致电流突变。最安全的方式是让开环角度慢慢靠近观测器角度等两者差值足够小再切。如果不想等可以在切换瞬间对电流环PI的积分器清零再把输出限幅卡紧能抑制大部分电流冲击。第二是速度环的介入方式。切换前如果速度环没有接入切换后速度环突然介入它的积分器从零开始积分输出可能一下子打满限幅电机猛冲一下是完全可能发生的。我建议在切换前后的几个控制周期内速度环积分器保持清零或者保持切换前的输出值让电流指令渐进过渡到由速度环接管这样可以避免切换瞬间的电流跳变。切换完成之后记录一段时间的Iq指令和转速反馈。如果Iq从切换前的恒定值平滑过渡到速度环的调节值转速反馈没有大的过冲说明切换是成功的如果Iq瞬间打满限幅或者转速掉坑基本就是角度差或者速度环介入方式有问题。5.3 切换瞬间的现场表现与微调切换是否成功现场其实是能感觉到的。成功的切换电机只有“稳稳一下就进入闭环”的轻微手感电流波形保持连续转速的波动是平滑连续的失败的切换要么是“滋啦”一声电流异响要么是转速瞬间掉一下又拉回来严重时直接触发过流保护。一个对成功率影响很大的细节是开环阶段的加速度率。第一次调试时我开的加速度偏高观测器还在收敛过程中就直接切换结果反复失步。后来把加速度调低一些多留出大概1秒的等待时间让观测器角度充分收敛到开环角度附近问题就消失了。这个缓冲时间在切换策略里很值得保留它本质上是在给观测器“确认自己没看错”的时间。6. 闭环PID参数整定与调试笔记6.1 电流环PI参数整定方法控制系统调试的通用顺序是先内环后外环。电流环的动态速度决定了整个系统的刚度带宽通常可以设到开关频率的1/10到1/2020kHz的PWM对应1到2kHz的电流环带宽。参数整定我推荐先用公式算初值再根据阶跃响应微调纯试凑法在参数空间比较大的时候容易浪费时间。公式方法本身不复杂。对于表贴式PMSM电流环PI的零点一般设计在电机电气极点附近也就是让Ki/Kp约等于R/L这样能获得比较好的零极点对消。Kp根据期望带宽来定估算公式是Kp约等于L乘以2π乘以带宽。以我这台电机为例L0.5mHR0.35Ω带宽取1kHz那么Kp约等于3.14Ki约等于2200。需要提醒的是这里的单位取决于代码实现实际工程还要按标幺化和离散化折算不能直接照搬。电流环调好的标准是给q轴一个阶跃指令Iq反馈能在几个控制周期内快速跟踪没有明显超调也没有高频振荡。如果出现振荡第一个要怀疑的是采样延迟或者PWM死区效应而不是一味调小Kp因为调小Kp会牺牲带宽。6.2 速度环PI参数整定方法速度环是外环带宽要比电流环低一到两个数量级通常10到50Hz就够用。太快反而会把负载的机械谐振放大这是我做过几次纯速度环实验之后得到的教训。速度环参数主要通过阶跃响应观察给转速一个阶跃指令看上升时间和超调量。我的整定习惯是先只加Kp让系统能快速跟到目标转速附近这时候存在稳态误差是正常的然后把Ki一点一点加上去消除稳态误差。如果转速出现持续振荡第一反应是降低Kp。Ki太大也会造成低速振荡尤其是负载惯量比较小的电机Ki带来的相位滞后会让速度环稳定性变差。速度环的输出就是电流环的Iq指令因此必须做限幅。一般限幅设为额定电流的1.2到1.5倍。限幅设得太高过载时电流持续很大整个系统会严重发热甚至导致磁钢退磁风险限幅太低则启动困难、动态响应差。正常运行时电流应该低于限幅值限幅只在启动和突加负载时起保护作用。6.3 调试用的几个关键波形与判读调试无感FOC示波器至少要能看到这么几个量相电流波形、d轴电流反馈、q轴电流反馈、电角度估计值、转速估计值。相电流应该接近标准正弦没有截顶、没有明显毛刺d轴电流在闭环稳定后应稳定在0附近如果d轴一直为正或为负说明角度存在静态偏差q轴电流与负载力矩成正比不应有频繁的大幅突变。转速反馈波形能反映整个系统的动态品质。给定转速恒定之后估算转速不应该有周期性的低速漂移。若出现周期性抖动多半是机械负载问题或者观测器角度谐波。切换信号也要留意切换瞬间电流波形不应该出现大尖峰如果有优先检查切换前角度差是否已经收敛。7. 实战中踩过的坑常见问题排查记录7.1 电流波形毛刺多现象很直观相电流波形里叠了一层高频毛刺毛刺的频率和PWM开关频率一致。排查顺序是先看采样点是否对齐PWM中心再检查PCB布线最后看放大器输出有没有加RC滤波。我遇到的情况是采样点没对齐改到中心触发之后毛刺基本消失。7.2 切换瞬间失步每次I/F切换闭环电机都“滋啦”一声转速掉一下甚至过流。优先检查切换前的角度差是否稳定收敛其次看开环加速度率是否偏高。我调试时发现主要原因是加速度率太高观测器还没来得及收敛就切把加速度调低并增加等待时间后问题直接解决。7.3 低速启动反转每次上电启动电机先反转一下再正转。原因基本都是没有做预定位开环I/F启动时电流矢量与转子实际初始位置的夹角过大。解决方法是增加预定位流程。如果系统长期重载启动建议上三段式定位法逐段判断转子扇区彻底规避反转风险。7.4 高速电流畸变跑飞高速段相电流不再是标准正弦出现明显畸变母线电压瞬间被拉低。先看占空比是不是接近满量程电流环是否饱和再看观测器低通滤波器的相位滞后是否已经导致角度偏差过大。我最终的处理是把速度环输出限幅收紧同时给观测器角度加了一个和转速相关的相位补偿问题就稳住了。7.5 调速过程反复振荡给定转速改变时实际转速过冲之后来回振荡。原因通常是速度环Kp过大带宽太高系统阻尼不足。降低Kp、适当加大Ki重新平衡同时检查电流环在调速过程中是否饱和。还有一个小坑是速度反馈滤波器的截止频率太低导致转速信号滞后太大反馈回路等效为引入了额外延迟放大器闭环振荡几乎是必然的。现象最可能原因优先排查方向我最后的解决办法电流波形毛刺多采样点未对齐PWM中心采样触发时序改用PWM硬件触发ADC切换瞬间失步观测器未收敛就切换切换前角度差、加速度率降低加速度率增加等待时间低速启动反转未做预定位启动流程增加预定位流程高速电流畸变电流环饱和、角度有滞后占空比、LPF相位收紧限幅加角度补偿调速反复振荡速度环Kp过大或反馈滞后速度环参数、滤波降低Kp检查反馈滤波最后说一点自己的体会。做无感FOC最难的往往不是某一个公式而是对“系统现在处于什么状态”的判断。我从一开始对着状态机发呆到后来通过波形一眼就能看出问题出在采样还是控制中间最大的变化是学会了用观测器角度、开环角度、实际转速三者之间的差值来“读”电机的状态。这个能力比记住任何一套参数都重要。如果你也在做类似项目遇到问题先确认当前系统处于开环还是闭环、角度可信不可信再去看参数和波形方向对了剩下的都是时间问题。