基于ESO的永磁同步电机无传感器控制模型设计与性能优化分析

张开发
2026/4/21 22:56:24 15 分钟阅读

分享文章

基于ESO的永磁同步电机无传感器控制模型设计与性能优化分析
基于ESO的永磁同步电机无传感器控制模型 无传感不可能一点误差没有这已经调的很好了最近啃永磁同步电机FOC无传感啃到发际线又往后挪2mm卡尔曼滤波嫌协方差矩阵算起来像解魔方三阶变种滑模控制又抖得像冬天骑没闸电动车手最后抱着试试“死马当活马医极点瞎凑凑”的心态选了线性ESO——哦不对偷偷先把电流环PI的静差和超调压到能看见纹波但编码器都懒得皱眉之后才敢碰观测器的三个极点。现在轴速跟电机屁股上插的那个E6B2编码器实验室穷买不起绝对值贴得几乎示波器放大到100ms/div才见缝插针的小毛边哦不对最后凑到10ms/div仔细抠误差还是有个0.4-0.6rpm左右的正弦小波动晃悠200W负载从50%突然拉到100%会往上飘2.2转然后往下掉1.3转加起来200ms稳回目标±1rpm内真的已经调得很好了。先上观测器的核心公式不然怕有人说我瞎掰调出来的公式还是稍微规整点但别用LaTeX渲染式那种冷冰冰的框框就用Markdown的行内数学混着说人话假设永磁同步电机在旋转坐标系dq轴下把反电动势\(\hat{e}d\)、\(\hat{e}q\)当成扩展状态线性ESO的结构大概就是酱紫用simulink里搭的简化逻辑的伪M代码说就是把dq轴电压电流传感器的数据往里面塞% ESO核心伪代码假设电流PI已经调好输出的dq电压是udq_fb % omega_e是观测出来的电角速度要积分或者算转速比例换机械轴速 function [omega_e, ed_hat, eq_hat] eso_linear(id_fb, iq_fb, udq_fb, Ld, Lq, Rs, pole_num, dt) % 先把状态方程列出来对应的ESO增益矩阵参数极点选的是-100,-105,-110穷学生算的是三阶的哦因为反电动势dq轴都是独立扩展的算上电流偏差是三个状态不对严格来说三阶ESO每个轴不不不我搭的是旋转坐标系下把电流id-iq耦合的扩展成四阶哦伪代码简化成旋转坐标系下忽略id轴耦合凸极率不大的表贴式PMSM刚好实验室电机是TMotor AK80-6减速比拆了剩裸机凸极率接近1的双轴三阶合并简化版吧增益矩阵K1 K2直接说凑的 K1 300; % 凑的第一个电流观测偏差增益 K2 30000; % 凑的反电动势观测增益 K3 3e6; % 凑的反电动势变化率增益对三阶ESO还要加这个当“虚拟扰动” persistent ed_hat_prev eq_hat_prev omega_e_prev; if isempty(ed_hat_prev) ed_hat_prev 0; eq_hat_prev 0; omega_e_prev 0; end % 先算dq轴的电流估计值和反电动势估计值忽略凸极率裸机表贴 id_hat_dot (udq_fb(1) - Rs*id_fb Ld*omega_e_prev*id_fb - ed_hat_prev) / Ld; iq_hat_dot (udq_fb(2) - Rs*iq_fb - Lq*omega_e_prev*id_fb - eq_hat_prev) / Lq; % 哦裸机表贴LqLd8.5e-3 H对吧 ed_hat_dot K1*(id_fb - id_hat_dot*dt id_hat_prev_integral不对伪代码要接地气积分用梯形吧欧拉有时候晃 % 重新捋用旋转坐标系表贴简化后的四阶合并但电角速度解耦简化版本的伪梯形积分ESO persistent id_hat ed_hat dedt_hat iq_hat eq_hat deqdt_hat; if isempty(id_hat) id_hat 0; ed_hat 0; dedt_hat 0; iq_hat 0; eq_hat 0; deqdt_hat 0; omega_e_prev 0; end % 1. 计算电流估计偏差e_id, e_iq e_id id_fb - id_hat; e_iq iq_fb - iq_hat; % 2. 更新d轴ESO反电动势是eddedt是扩展的虚拟扰动假设ed变化慢但dedt用来补未建模的比如齿槽转矩扰动 id_hat_new_dot (udq_fb(1) - Rs*id_hat Ld*omega_e_prev*iq_hat - ed_hat) / Ld; % 哦对表贴PMSM旋转坐标系dq轴电压方程是udRs id Ld did/dt - omega Lq iq ed我刚才伪代码漏了Lq iq凸极率接近1的话Lq≈Ld8.5e-3写起来方便 ed_hat_new_dot dedt_hat K2*e_id; dedt_hat_new_dot K3*e_id; % 3. 更新q轴ESOq轴反电动势eqomega*psi_f这个是核心psi_f是永磁体磁链实验室TMotor AK80-6裸机是0.082 Wb对吧拆减速比的时候看了手册残页 iq_hat_new_dot (udq_fb(2) - Rs*iq_hat - Ld*omega_e_prev*id_hat - eq_hat) / Ld; eq_hat_new_dot deqdt_hat K2*e_iq; deqdt_hat_new_dot K3*e_iq; % 4. 梯形积分dt是10kHz的采样周期也就是1e-4 s id_hat id_hat 0.5*dt*(id_hat_new_dot (id_hat_new_dot_prev哦伪代码再简化第一次先欧拉后面自动变伪欧拉-梯形其实穷学生第一次直接上的欧拉除了轻载启动稍微抖了下后面极点调密点K1K2K3上去了就没事了欧拉10kHz采样够了 id_hat id_hat dt*id_hat_new_dot; ed_hat ed_hat dt*ed_hat_new_dot; dedt_hat dedt_hat dt*dedt_hat_new_dot; iq_hat iq_hat dt*iq_hat_new_dot; eq_hat eq_hat dt*eq_hat_new_dot; deqdt_hat deqdt_hat dt*deqdt_hat_new_dot; % 5. 解算电角速度核心核心核心q轴反电动势除以psi_f就是omega_e但直接除轻载启动或者低速带载psi_f太小会除出鬼不怕不怕我调的是中高速裸机表贴300rpm以上直接起飞低速300rpm以下加了个简单的开环I-f切换策略切换点设的280rpmI-f的电流环是和闭环共用的PI参数稍微改小了点防切换冲击完美 if abs(omega_e_prev) 2*pi*280/60 % 280rpm对应电角速度 omega_e eq_hat / 0.082; else omega_e omega_e_prev dt*omega_e_ref_dot; % 开环I-f的参考电角速度斜率设的200rad/s²刚好够快又够稳 end % 6. 把电角速度存下来下一次用 omega_e_prev omega_e;刚才那段伪代码漏了开环切换的细节但反正核心是ESO的解算q轴反电动势。为什么选q轴反电动势不用d轴因为表贴PMSMd轴的磁链是\(\psid Ld id \psif\)反电动势\(ed \omegae \psid - \frac{d\psid}{dt}\)d轴电流一般闭环控制到0所以\(\psid≈\psif\)但还是有个电流微分的小尾巴而q轴磁链\(\psiq Lq iq\)d轴电流控制到0的话电压方程简化后\(eq \omegae \psif - \frac{d(Lq iq)}{dt}\)哦刚才伪代码里把电流微分的小尾巴和未建模的齿槽转矩、死区时间、电阻电感的小误差全扔到扩展的虚拟扰动dedthat和deqdthat里了这就是ESO的牛逼之处不用精确建模所有参数有小误差或者扰动都能帮你“观测”出来然后补偿一部分基于ESO的永磁同步电机无传感器控制模型 无传感不可能一点误差没有这已经调的很好了极点为什么选-100,-105,-110其实一开始我是按书上说的“极点距离是被控对象带宽的5-10倍”选的被控对象是PMSM的电流环带宽我之前调的大概是500Hz左右电流阶跃响应10%到90%大概2ms那观测器带宽选2500-5000Hz对应的极点就是\(-2\pi*2500≈-15700\)不对不对三阶ESO每个轴的极点是分开的哦我刚才混淆了单轴三阶ESO和双轴合并简化的伪ESO增益矩阵的对应关系其实穷学生没太搞懂极点精确配置的数学推导线性代数 eigenvalues eigenvectors 上次期末差点挂科补考还是抄的左右桌中间改了个数直接打开simulink的线性化工具把刚才搭的ESO模块单独线性化调整K1K2K3的滑块看线性化后的波特图观测器带宽够宽电流环的10倍以上但相位滞后别太大高速的时候相位滞后大会导致轴速滞后编码器我之前K1K2K3调得太大波特图带宽10kHz但1000rpm的时候轴速滞后编码器3度减速比拆了剩裸机3度机械角误差对应负载端如果加回去AK80-6的6:1减速就是18度那TMotor的标称精度就浪费一半了最后调到K1300K23e4K33e6的时候波特图带宽大概3kHz1000rpm的时候相位滞后0.8度机械角完美再说说误差刚才说的0.4-0.6rpm的正弦小波动是什么示波器看反电动势eqhat和编码器算出来的真实eq真实eq真实omegae*psif对比了一下发现eqhat上有个和极对数对应的6次谐波哦对了是齿槽转矩齿槽转矩会导致电机的输出转矩有波动进而导致轴速有波动然后反电动势也有波动ESO虽然能补偿未建模的扰动但齿槽转矩是周期性的6次谐波刚好落在观测器带宽的边缘附近或者说ESO的极点配置对周期性扰动的抑制不如重复控制但没关系0.5rpm的波动对于我这个只是用来演示无传感控制的实验来说已经调得很好了带载突跳的误差为什么会飘2-3转因为负载突然加上去的时候电流环需要时间响应反电动势eqhat也会跟着突然变化ESO需要时间观测这个突变虽然观测器带宽有3kHz但解算eqhat还是需要个小积分过程对吧然后I-f切换到ESO闭环的时候会不会有冲击冲击是有的但加了个简单的电流平滑和角速度平滑过渡策略I-f的参考电流在切换前100ms从设定的I-f启动电流2A慢慢降到ESO闭环的q轴参考电流根据转矩计算的TMotor AK80-6裸机额定电流大概10A轻载0.5A左右角速度平滑用的是一个简单的一阶低通滤波器时间常数50ms切换的时候示波器看电流和轴速的波形几乎没有尖峰完美最后放一张示波器截图的文字描述吧实验室示波器太老不能插U盘导出只能用手机拍然后用眼睛描出来横轴100ms/div纵轴编码器轴速黄色100rpm/divESO观测轴速蓝色100rpm/div负载电流红色5A/div。一开始是I-f启动蓝色轴速从0慢慢升到280rpm黄色轴速跟得很紧280rpm切换到ESO闭环蓝色和黄色几乎重合红色负载电流0.5A大概在200ms的位置我手动把电阻箱负载从100W突然拉到200W红色电流突然跳到3A蓝色轴速先往上飘了2.2转到大概1002.2rpm然后往下掉了1.3转到大概998.7rpm黄色轴速的波动比蓝色稍微小一点但也差不多大概在400ms的位置蓝色和黄色轴速都稳回了1000±0.5rpm红色电流也稳回了3A。

更多文章