基于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; % 哦裸机表贴Lq=Ld=8.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(反电动势是ed,dedt是扩展的虚拟扰动,假设ed变化慢但dedt用来补未建模的比如齿槽转矩扰动)
    id_hat_new_dot = (udq_fb(1) - Rs*id_hat + Ld*omega_e_prev*iq_hat - ed_hat) / Ld; % 哦对!表贴PMSM旋转坐标系dq轴电压方程是ud=Rs id + Ld did/dt - omega Lq iq + ed,我刚才伪代码漏了Lq iq!凸极率接近1的话Lq≈Ld=8.5e-3,写起来方便!
    ed_hat_new_dot = dedt_hat + K2*e_id;
    dedt_hat_new_dot = K3*e_id;
    
    % 3. 更新q轴ESO(q轴反电动势eq=omega*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切换策略,切换点设的280rpm,I-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的标称精度就浪费一半了),最后调到K1=300,K2=3e4,K3=3e6的时候,波特图带宽大概3kHz,1000rpm的时候相位滞后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/div,ESO观测轴速(蓝色)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。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐