资讯详情

资讯详情

无感永磁同步电机控制:Simulink中FOC/SMO/PLL模型搭建与调试

前阵子一直在调一个无感永磁同步电机的控制模型项目需求很直接MCU成本受限装不起编码器但启停、转速和转矩都必须可控。所以我在Simulink里搭了一套把FOC、SMO、PLL三个技术融合在一起的仿真模型先离线把算法逻辑验明白再考虑往芯片上移植。说实话FOC、SMO、PLL这三个缩写单独拿出来做电机控制的人多少都听说过。但把它们真正合到同一个模型里跑起来问题就完全不一样了SMO的符号函数抖振怎么滤滤波之后的相位延迟怎么补PLL的PI参数跟速度环带宽怎么匹配低速启动时观测器根本没有反电动势可用怎么办这些细节单独看都有资料串在一起就变成了一堆相互耦合的坑。这篇文章就把我搭模型的全过程捋一遍从为什么三者缺一不可到Simulink里的具体模块架构再到SMO、PLL的建模细节和调试经验全部按实操角度来讲。如果你正准备做无感FOC的离线仿真或者想把这类算法往实际控制器上搬这篇文章应该能帮你少走不少弯路。1. 为什么非要把FOC、SMO、PLL三个技术绑在一起用1.1 传统FOC控制的位置依赖症FOC的核心思想是把三相交流电流分解到转子坐标系下分解之后d轴电流管励磁、q轴电流管转矩控制逻辑变得像直流电机一样清晰。但这里有个绕不开的前提你必须知道转子磁极的实时位置否则Park变换算出来的d、q轴电流全是错的电流环调得再好也白费。传统做法是在电机轴上装编码器或旋变传感器。仿真模型里加一个理想编码器简单得很给个角度信号就行。但放到实际产品里传感器要占用空间、增加成本、多一根线缆而且在高震动、高油污场景下可靠性也是问题。所以我当时的目标很明确把位置传感器拿掉用算法把转子位置估出来这就是所谓的无感FOC。无感FOC不是不用位置而是用观测器替代物理传感器。反电动势就藏在这个估计过程中只要电机在转定子绕组里就会感应出反电动势反电动势的相位直接对应转子磁极位置。问题在于反电动势没法直接测量只能从电压、电流方程里“反推”而这个反推过程在低速下特别脆弱需要专门设计观测器。1.2 SMO的“粗”和PLL的“细”正好互补滑模观测器SMO在电机无感控制里之所以流行主要是因为它对电机参数变化和模型误差的耐受性比较好。它的思路可以理解成一个“自动逼近”机制构造一个和真实电流方程结构相同的观测器让观测电流和实际电流之间产生误差再用一个带符号切换的强反馈把误差压到零。一旦误差被压到滑模面上符号函数里的等效信息就包含了反电动势。但SMO有个天生的毛病符号函数输出是高频切换信号直接拿去做位置计算噪声能把结果淹没。常规做法是加低通滤波器把高频分量滤掉留下反电动势的基波。可是低通滤波器一加相位滞后就来了转速越高滞后越明显位置估计就会偏。这时候PLL就派上用场了。PLL锁相环本质上是一个闭环跟踪器它对输入信号有天然的平滑和滤波作用能把反电动势里夹杂的毛刺进一步压掉同时稳定地输出转子位置和转速。更关键的是PLL的PI参数可以自己设计相当于给位置估计单独装了一个“动态特性调节器”这个特性是直接对反电动势做atan2计算做不到的。所以三者关系可以这样概括FOC负责主控制回路SMO负责从电流电压里提取反电动势PLL负责把带噪声、带滞后的反电动势整理成干净可用的转子位置和速度。少任何一个整个链路都不完整。2. Simulink模型的三层架构从电机本体到观测链路2.1 底层物理模型PMSM本体与逆变器建模我在Simulink里搭这套模型时把整个系统从物理上分成了三层。最底层是电机本体和逆变器这一层决定了整个模型的“真实度”。如果你追求快速验证算法逻辑可以直接用Simulink自带的标准PMSM模型把定子电阻、电感、磁链、极对数、转动惯量填进去就行。但如果后续要考虑逆变器死区、母线电压波动这些非线性因素最好用基础元件搭一个三相全桥再配上PMSM方程模块这样SVPWM的工况更接近实际情况。我的做法是折中电机用Simulink库里的PMSM模型逆变器用三个桥臂的IGBT模块搭出来母线电压用一个直流源模拟。开关频率设10kHzSVPWM的载波周期对应100微秒。之所以不直接给理想三相电压是因为后面SMO的输入电压需要从母线电压和占空比重构而理想电压忽略了管压降和死区会让观测器的输入跟实际有偏差。2.2 FOC双闭环中间层电流环和速度环的分工中间层是FOC控制的主体包括Clarke变换、Park变换、两个电流环PI和一个速度环PI最后输出到SVPWM。这里有一个容易忽略的点模型里角度反馈到底从哪来决定了这套FOC是有感还是无感。传统教学模型里角度直接取电机的机械角度乘上极对数位置传感器不存在。我在模型里把这一路替换成了SMOPLL的输出相当于在中间层和观测层之间留了一个标准的“角度输入接口”。这样做的最大好处是方便对比想验证观测器好坏时把角度源切换成真实角度马上就能看出算法差异造成的电流波形变化。电流环PI的带宽一般设计在1000~2000 rad/s左右速度环带宽则低一个数量级。这个分配不是拍脑袋定的因为电流环要快速响应电压指令而速度环对应的是机械动态机械时间常数远大于电气时间常数带宽过高反而容易引入振荡。2.3 SMOPLL观测链路跟主控制回路的衔接方式最上层就是观测链路从电压、电流出发经过SMO得到估计反电动势再经过PLL得到转子位置和转速。观测链路的输入有两路一路是αβ坐标系下的电压另一路是同样在αβ坐标系下的电流。这里有个关键细节SMO必须工作在αβ静止坐标系下不能放在dq旋转坐标系里因为转子位置本身就是待求量你不可能用一个未知的角度去做Park变换。电压值可以从SVPWM前面的Vα、Vβ直接取但在做精细仿真时我建议用母线电压和三相占空比做一次重构这样能包含逆变器的非线性影响。PLL输出的估计角度直接送给Park变换和速度环形成闭环。整个模型的信号流可以简化为三相电流→Clarke→SMO→反电动势→PLL→位置/速度→FOC坐标变换和速度环。调试时我习惯先在每个环节加Scope观察信号确认前面一级输出正常后再放行到下一级这是后面排查问题最快的方式。3. SMO滑模观测器的建模细节符号函数、滤波与相位补偿3.1 从电流方程到滑模面的设计表贴式PMSM在αβ静止坐标系下的定子电压方程可以写成uα R_s·iα L_s·(diα/dt) eα uβ R_s·iβ L_s·(diβ/dt) eβ其中反电动势分量包含转子位置信息eα -ψ_f·ω_e·sinθ_e eβ ψ_f·ω_e·cosθ_e只要能把eα、eβ估出来转子位置就藏在它们的比例关系里。SMO的基本思路是构造一个与上述方程结构相同的观测器让观测电流去跟踪实际电流。我用下面的形式搭建观测器L_s·(dîα/dt) -R_s·îα uα - K·sign(îα - iα) L_s·(dîβ/dt) -R_s·îβ uβ - K·sign(îβ - iβ)这里的sign函数就是滑模切换项它的系数K是滑模增益。当观测电流与实际电流的误差进入滑模面时符号函数的高频切换等效值中就包含了反电动势信息。简单记就是K·sign(î-i)经过等效平均之后差不多等于反电动势。3.2 Simulink里的SMO实现与参数初值在Simulink里搭SMO我建议用最基础的积分器模块搭而不是一上来就封装成复杂子系统。每个轴用一个积分器输入是电压减去电阻压降、减去切换项再除以电感。积分器输出就是观测电流反馈回去和实际电流做差差经过符号函数再乘以K就是切换项。参数初值方面滑模增益K是第一个要定的量。理论上K必须大于反电动势峰值否则滑模面建立不起来。反电动势峰值近似等于ψ_f·ω_e所以K的初值可以取K 1.5 × ψ_f × ω_e_max其中ω_e_max是最大电角速度。K太小观测误差压不下去K太大抖振会把电流波形弄得很难看。我自己的习惯是先按1.5倍放大给一个偏大的初值在仿真里调到“电流估计误差收敛且波形不过度抖动”为止。然后就是低通滤波器。SMO输出的是开关性质的信号必须要经过低通滤波才能拿到平滑的反电动势波形。滤波器的截止频率需要和电机基频拉开距离一般取反电动势基波频率的5到10倍。基频会随转速变化所以最好是按照最高转速来设计截止频率再在低速下靠PLL去兜底。3.3 低通滤波延迟和相位补偿的工程处理低通滤波带来相位滞后这是SMO最让人头疼的地方。一阶低通在截止频率附近的滞后角大约是arctan(f/f_c)转速越高、反电动势频率越接近截止频率滞后越明显。如果不做补偿PLL锁出来的角度会比真实位置偏小表现在仿真里就是电机转矩变小、q轴电流和转矩对不上。我用的补偿方法是查表补偿或解析补偿。在模型里实时计算补偿角θ_comp arctan(ω̂ / ω_c)其中ω̂是PLL估算的电角速度ω_c是低通滤波器截止角频率然后把补偿角加到PLL输出的估计角度上。这个方法在固定截止频率的低通下非常有效前提是滤波器的阶数固定。如果用了二阶滤波器补偿角计算就要按二阶的相频特性改写不能照搬一阶公式。另外还要注意滤波后的反电动势幅值也会随转速和滤波器参数变化PLL如果直接吃这个幅值环路增益就跟转速耦合了所以后面PLL部分一定要做归一化处理这一点我放在下一节详细说。4. PLL从反电动势里榨出转子位置归一化与PI整定4.1 为什么不用atan2而要绕一圈用锁相环直接从eα、eβ计算位置的常规公式是θ_e atan2(-eα, eβ)。这个公式在理想仿真里没有问题但在SMO低通滤波这个链路里反电动势波形含有残余抖动而且相位是滞后的atan2算出来的角度会每个周期都抖动还需要再对角度求导才能得到转速求导会把噪声进一步放大。PLL最大的优势是它本身是一个二阶闭环系统具备滤波能力同时能直接输出转速估计避免了“位置→差分→转速”这个噪声放大器。PLL对输入信号里的高频毛刺有抑制作用而且我们可以通过整定PI参数来控制系统带宽让估计值在“跟随快”和“平滑”之间取一个可控的平衡。工程上还有一个隐性好处PLL输出的角度是连续变化的不会出现atan2那种从π跳变到-π的相位跳变问题。这个跳变在纯数学上看是小问题但在FOC控制回路里角度一旦跳变Park变换的输出会瞬间突变电流环直接被打乱。4.2 PLL结构、误差信号与PI参数设计我采用的PLL结构以反电动势的αβ分量为输入先用幅值做归一化再构造误差信号。归一化的做法很简单实时计算反电动势幅值E_mag sqrt(eα² eβ²)然后把eα、eβ都除以E_mag这样进入PLL的信号幅值基本恒定在单位量级PLL的PI增益不会随转速剧烈变化。归一化在Simulink里用几个数学模块就能搭出来但要注意E_mag太小——比如低速启动时反电动势接近零——除法会变得毫无意义所以要在分母上加一个很小的常数或在程序里做下限保护。归一化之后构造误差信号ε -eα·cosθ̂ eβ·sinθ̂当θ̂和真实角度一致时这个误差趋近于零角度有偏差时误差近似等于sin(θ_e-θ̂)小偏差下可以线性化成θ_e-θ̂。把这个误差送进PI控制器PI的输出就是电角速度估计ω̂对ω̂积分就得到角度估计θ̂。PI参数方面PLL闭环近似是一个二阶系统。设带宽为ω_pll阻尼比取0.707那么Kp 2 × 0.707 × ω_pll Ki ω_pll²PLL带宽取值要在电流环带宽和速度环带宽之间。电流环带宽1000~2000 rad/s时PLL带宽取200~500 rad/s速度环带宽取20~50 rad/s。我通常给一个参考表控制环带宽参考范围(rad/s)说明电流环1000~2000必须最快决定电流动态PLL观测链路200~500必须高于速度环反馈才跟得上速度环20~50机械动态慢带宽过高易振荡PLL带宽取太低速度环会感受到一个滞后的转速反馈整个速度环容易振荡取太高反电动势里的残余抖动又会进入转速估计。这个区间需要根据实际仿真效果微调。4.3 转速估计的静态误差与动态跟随PLL的PI输出就是电角速度估计理论上在匀速工况下误差为零。但要注意PI控制器的积分项如果被限幅或者归一化在低速时失效就会出现静态偏差。我在模型里给PLL的PI输出加了一个限幅范围对应最大电角速度的百分之十以上防止启动瞬间积分器冲过头。动态工况下当转速斜坡上升时PLL的跟随滞后会体现为角度误差的峰值。如果PLL带宽太低这个动态角度误差会在切换阶段被放大。所以我在启动策略里没有让PLL独自承担全过程的动态跟踪而是先开环强拖等转速稳定一点再交给PLL闭环这样PLL承受的瞬态压力小很多。这里也顺带提一句PLL和SMO低通滤波的关系。我见过有人在PLL输入前不加低通想让PLL自己把抖振滤掉实测效果很差。因为PLL误差信号里的符号函数高频分量会在环路里混叠产生低频频偏。正确做法还是SMO输出先低通再进PLL两级滤波各管一段。5. 闭环协同与启动策略零速强拖、切换条件和速度环投入5.1 无感启动从预定位到开环强拖无感控制最大的难点在零速和极低速因为这时候反电动势基本为零SMO喂进去的信号没有位置信息观测器无从收敛。所以整个启动过程必须绕开SMO先用开环方式把电机拖起来。启动第一步是转子预定位。我给一个固定的d轴电流指令让定子磁场把转子拉到已知位置相当于给系统一个初始角度。预定位时间不用太长大约0.5到1秒扭矩发够就行。第二步是开环强拖用一个按固定斜率上升的给定角度代替估计角度让电流环跟着这个给定角度跑也就是所谓的压频启动或I-F启动。这个阶段电机跟着给定频率逐步加速反电动势也从零开始慢慢建立。开环强拖阶段的电流会比正常闭环大因为角度是给定的和实际转子位置之间可能存在偏差。所以斜坡的加速度不能太大否则失步风险很高。我在模型里设置的是每秒钟转速上升额定值的3%左右具体数值要看负载特性带风机类负载时斜坡可以更缓。5.2 切换条件从给定角度切到PLL估计角度当转速上升到额定值的3%到5%左右反电动势已经有一定幅值SMO和PLL应该能正常工作了。但这时候还不能直接切因为开环给定角度和PLL估计角度之间必然存在一个偏差角。如果直接硬切角度突变会让电流环瞬间失去参考坐标轻则电流跳变重则失步反转。我的做法是在切换前先把PLL的输入角度锁到开环给定角度上让PLL在闭环跟踪模式下去追赶开环角度等到PLL的估计角度和给定角度之差持续小于一个很小的阈值比如恒定5度以内持续50毫秒以上再切换到PLL估计角度。这个锁定过程在Simulink里实现很简单就是加一个切换开关和一个差值判断逻辑。切换判据我设计成三条同时满足才动作转速超过阈值、角度差持续小于阈值、PLL的输出转速与给定转速的偏差小于额定值的2%。这三条都满足说明PLL已经初步对齐切换冲击最小。5.3 电流环、速度环与观测器的带宽配合整个系统跑起来之后各环路的带宽配合直接决定稳定性。电流环带宽最高负责快速抑制电流扰动PLL观测链路居中负责提供平滑准确的位置和速度速度环带宽最低负责机械层面的稳态控制。我在调模型时遇到过一个问题速度环带宽取到80 rad/s后中高速段开始出现转速振荡。排查下来发现不是速度环本身的问题而是PLL带宽只有150 rad/s转速反馈滞后太多速度环相当于在用一个过时的转速做调节。把PLL带宽提高到300 rad/s后振荡立刻消失。这说明带宽分配不是孤立参数任何一环拖后腿整个系统都会表现出振荡症状。另外电流环PI参数也要跟SMO的等效电感模型匹配。电流环PI的Kp一般按KpL_s×带宽来估算Ki按R_s×带宽估算这个初值在离散化后通常要缩一点点。我这里强调“初值”是因为离散化、死区、数字延迟都会改变等效阻尼最终参数必须在仿真里微调。6. 仿真踩坑实录步长、离散化与抖振处理6.1 求解器与固定步长的选择Simulink里跑这类高频电力电子模型第一步就要想清楚用连续求解器还是离散求解器。如果用变步长连续求解器SVPWM的三角载波和SMO的符号函数会在每个开关周期制造大量不连续点仿真步长会自动切得非常小跑一个几百毫秒的工况可能要等很久。更麻烦的是连续域跑得通不代表代码生成后能在MCU里跑得通。我的建议是一开始就按离散系统建模逆变器开关频率10kHz控制周期取100微秒观测器和电流环都在同一个固定步长下运行。求解器选discrete固定步长设1e-5或更小。固定步长选多大取决于SMO的切换动态。步长大符号函数的高频分量会直接混叠成低频噪声步长太小仿真时长又太长。我常用的折中是取开关周期的1/10到1/5也就是1e-5到2e-5秒。如果你的模型里还有高频模拟细节再往下压到5e-6但不要无脑调小先看波形能不能接受。6.2 抖振处理从符号函数到饱和函数SMO的符号函数在离散仿真里会产生一种典型的“数字毛刺”表现为估计反电动势波形上叠加密密麻麻的高频尖刺。低通滤波器能滤掉一部分但滤波后的波形依然不干净PLL的转速输出会带一层白噪声状的抖动。一个非常有效的工程化做法是用饱和函数替代符号函数。饱和函数的表达式是sat(s) sign(s) 当 |s| δ sat(s) s/δ 当 |s| ≤ δδ就是边界层厚度。s/δ相当于在边界层内做了一个连续化处理把切换项的硬特性变软抖振大幅减小。代价是边界层太厚时等效反电动势会出现偏差位置估计会有偏置。所以δ要取一个平衡值我一般从电流额定值的百分之几开始试。这里有个容易忽略的坑饱和函数虽然让波形好看了但等效的反电动势幅值会略微下降导致PLL归一化后的误差信号存在偏置。所以调整δ后一定要重新检查PLL稳态角度误差不能只看波形顺不顺眼。6.3 调试顺序和波形判读先电流环后速度环再观测器整个模型调通了之后我的调试顺序总结成一句话先确认电流环在真实角度下有正弦电流再确认速度环在理想角度下能稳速最后才把角度源切到SMOPLL。具体操作时先在模型里保留一个角度源切换开关用真实角度跑通FOC。此时电流环PI、速度环PI、SVPWM的参数都被验证过了波形正常。然后把角度源切到PLL输出看电流波形是否仍然正弦。如果此时出现畸变回过头看SMO反电动势和实际反电动势的重合度以及PLL角度差。我实际遇到的一个典型案例是转速到4000rpm附近后q轴电流莫名往下掉转矩输出不足。最后查出来是低通滤波器相位滞后约18度PLL输出角度比实际位置晚了一截导致部分q轴电流串到了d轴方向。补偿角加上去之后转矩马上恢复。这个案例说明了相位补偿不是锦上添花而是中高速段的必需品。整套模型跑通之后我现在养成一个习惯每次改参数都在固定工况下记录电流、转速、位置误差三组波形形成一组对照数据。这样SMO增益、滤波器截止频率、PLL带宽这些互相牵扯的参数就能以数据而不是手感来定。后面做代码生成和硬件移植时这份仿真数据也是最好的参考基准。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →