ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

BP神经网络PI控制:PMSM调速参数自整定与Simulink建模对比

BP神经网络PI控制:PMSM调速参数自整定与Simulink建模对比 简介基于BP神经网络PI控制的永磁同步电机控制方案面向电机控制方向的工程师、科研人员与相关专业学生重点解决传统PI参数在负载突变、参数漂移等工况下适应性差、整定困难的问题。整包仅含一个PDF文档体积约60KB轻量易用。目前已有29人学习/下载。内容以转速电流双闭环架构为基础详解将速度环固定PI替换为BP神经网络在线调参器的思路并给出Matlab Function关键代码涵盖权重计算、反向传播、学习率与参数基准值设置等细节同时通过与传统PI的模型对比用转速恢复时间、超调量等指标量化改进效果还分享了隐含层节点数、学习率调节以及低端主控实时性方面的实践经验。读者既可直接借鉴神经网络调参的核心代码也可参考其对比方法评估控制性能对开展电机控制算法仿真或实验调试有实际帮助。1. 这一章是BP神经网络PI控制不是玄学PMSM调速的痛点和我为什么从固定参数换到自整定把速度环PI参数整定到“能看”很容易难的是让它在负载突变、参数变化之后依然能看。做永磁同步电机矢量控制的人大概都经历过这种时刻额定工况下表贴式PMSM带载跑得挺稳换一个惯量更大的负载或者电感参数因为磁路饱和偏了20%转速曲线就开始超调、振荡甚至触发过流保护。我在课题和项目里遇到这个问题时第一反应是把PI参数往保守方向调但保守的代价是响应变慢扭矩动态被牺牲掉。后来转向BP神经网络PI控制思路其实很直白不放弃PI控制器而是用BP神经网络在线调整Kp、Ki让控制器参数跟着工况走。这篇笔记我按自己的复现路径来写——先拆机理再给Simulink里最小可复现的模型然后把模型对比的方法和坑讲清楚。适合正在做PMSM调速仿真、写算法对比章节或者准备往DSP上移植的工程师参考。标题里挂的是“模型对比”所以最后我会重点说清楚对比不能只贴两张波形量化维度才是让人信服的关键。2. 拆开BP网络整定PI的机理网络结构、输入输出与在线学习怎么落进电机控制2.1 先看PMSM调速环里PI控制器吃紧在哪表贴式永磁同步电机在dq旋转坐标系下忽略磁路饱和和铁损电压方程和转矩方程可以写成ud Rs*id Ls*d(id)/dt - we*Ls*iq uq Rs*iq Ls*d(iq)/dt we*(Ls*id psif) Te 1.5*pn*psif*iq id0控制时这里Rs是定子电阻Ls是电感we是电角速度psif是永磁磁链。表面看是一个二阶非线性系统但在id0的矢量控制框架下转矩和iq线性相关速度环本质上是“外环给iq指令、内环跟iq”的串级结构。传统PI在这一点上其实够用——它的问题不在结构而在参数。PI参数在额定点整定完之后Kp和Ki是常数。但实际运行中电阻随温度变化电感随电流饱和程度变化磁链随温度变化负载惯量更是千差万别。固定参数只能保证“设计点附近”的性能。负载扰动大一点转速跌落加深惯量变大系统相位裕度变了原来合适的Kp可能把系统推近振荡边界。这就是我考虑BP神经网络PI控制的原因它不改变“PI控制器”这个主体而是让Kp、Ki变成一个随工况在线更新的量。2.2 BP神经网络在线整定的三层结构与输入量选择常见的做法是采用一个三层前馈网络输入层、隐含层、输出层。输入量选什么决定了网络能不能“看到”系统状态。我做过的模型里最常用的一版输入是转速误差e(k)和误差变化率ec(k)e(k)-e(k-1)这两个量在Simulink里直接能从速度环反馈端取到不需要额外的状态观测器。有些方案会把第三个输入加上实际转速n或负载电流iq理由是让网络知道当前工作点。实际跑下来加了转速输入之后网络在低速段和高速段的适应性更好代价是输入维度从2变成3隐含层节点数要相应调整训练收敛慢一些。我一般建议先做e和ec的二输入版本它足以复现BP神经网络PI控制的核心效果如果对比结果不理想再往后加。隐含层节点数的选择没有严格公式工程习惯是取输入维数的3到6倍。二输入结构用6个隐含节点是比较稳的起点——太少学习能力不够太多在线计算量大而且容易过拟合到训练样本上。隐含层激活函数用tansig输出层激活函数的选择要看映射方式这直接关系到参数范围控制。2.3 BP输出映射到Kp、Ki为什么激活函数和输出限幅是整定成败的第一道关BP网络的输出通常不是直接当作Kp和Ki而是当作修正量ΔKp、ΔKi叠加到基准值上。基准值Kp0、Ki0可以用传统整定方法先算好比如临界比例度法或工程经验公式。网络输出的修正量再乘一个缩放系数限制变化范围。我建议输出层用logsig函数把网络输出压缩到(0,1)区间再做线性映射Kp Kp0 y1 * Kp_scale Ki Ki0 y2 * Ki_scale其中y1、y2是输出层节点的值Kp_scale、Ki_scale是允许的参数浮动范围。这一步是整定成败的第一道关。如果输出层用purelin线性激活网络输出可能跑到很大Kp瞬间冲高转速环直接振荡甚至发散仿真画面就是曲线甩出去然后报错。用logsig做限幅后ΔKp被约束在Kp0附近一个有限邻域内系统的稳定性才有基本保障。实际工程里还有一个更低成本的保障在Simulink里对Kp、Ki再串一个饱和模块双重限幅防止中间计算误差越界。另外误差信号在进网络之前必须归一化。速度误差的量纲是rad/min或rpm误差变化率量纲是rpm/s数量级可能差几十倍。不归一化的话大数值的输入会主导权值更新小数值输入完全不起作用。常见的做法是把e除以额定转速ec除以额定转速乘以采样周期的倒数让两个输入大致落在[-1,1]区间。2.4 和查表法、模糊PI、预测控制算法比BP-PI的适用边界把BP网络整定PI和其他控制算法放一起看才能看清这个方案的定位。下表是我在方案选型时习惯用来对照的维度方案在线自适应性计算量依赖模型程度实现难度适用场景固定PI无极低低低工况稳定、要求不高的场合查表PI有限依赖分档低中中工况可预见的变参数系统模糊PI中中低中高规则经验容易归纳的场合BP神经网络PI强中低同模糊中高负载/参数变化频繁、需要在线自整定预测控制算法强高高高需要显式约束优化的高性能场合预测控制算法在理论上限更高因为它能处理约束和多步优化但代价是每个控制周期都要在线求解优化问题对控制器算力要求高在低成本MCU上很难跑高频电流环。BP神经网络PI的优点是计算量适中——单次前向传播和一次反向更新运算量大致相当于几十次乘加大部分带浮点单元的DSP可以承受。缺点是网络训练没有稳定性保证学习率选不好会振荡这一点在后面避坑章节会重点展开。适用边界要记清楚BP-PI适合速度环这种采样周期在百微秒到毫秒级的环不适合电流环这种要求几十微秒内出结果的环。电流环我一般保留传统PI把BP-PI放在速度环上这也是大多数文献里的做法。3. 用Simulink把BP-PI控制器搭成最小可复现模型MATLAB Function接入与关键参数3.1 仿真架构速度环放BP-PI电流环留传统PI不改整个系统是一个典型的id0矢量控制结构外环是速度环输出iq参考值内环是d、q轴电流环输出ud、uq再接PWM逆变器和PMSM。BP-PI的接入点在速度环——它替代原来的固定PI控制器输出仍然是iq_ref只是内部Kp、Ki在变。电流环为什么不一起换成BP-PI两个原因。第一电流环带宽一般设计在1kHz以上采样周期很短BP网络一次前向传播加反向传播在低成本处理器上可能占掉大半个控制周期时序上很紧张。第二电流环的对象是电机的电气方程电阻电感参数相对稳定传统PI配合前馈解耦已经能获得很好的动态真正频繁变化的负载和惯量主要作用在速度环。所以速度环用BP-PI电流环保持PI加电压前馈补偿这是工程上性价比最高的分工。3.2 从公式到SimulinkMATLAB Function里的最小实现代码Simulink里实现BP-PI有两种常见路径一种是写S-Function运行效率高但调试麻烦另一种是直接用MATLAB Function模块把网络计算封装成一个函数Debug和可视化都方便。我一般先走MATLAB Function做验证验证通过后再改写成S-Function或C代码。下面是MATLAB Function里可直接运行的版本function [Kp_out, Ki_out] bp_pi_online(e, ec, Ts) % BP神经网络在线整定PI参数单步版本 % 输入: e转速误差(rpm), ec误差变化率(rpm), Ts速度环采样周期(s) % 输出: Kp_out, Ki_out % 持久变量权值和上一拍误差 persistent W1 W2 b1 b2 e_prev Kp_base Ki_base retrained if isempty(W1) % 网络结构2输入 - 6隐层 - 2输出 % 权值初值取小随机数保证初始输出接近0 W1 0.5 * (rand(6, 2) * 2 - 1); b1 0.5 * (rand(6, 1) * 2 - 1); W2 0.5 * (rand(2, 6) * 2 - 1); b2 zeros(2, 1); % 基准PI参数由临界比例度法预先整定 Kp_base 0.8; Ki_base 12.0; e_prev 0; retrained 0; end % 输入归一化额定转速Nn1500rpm可作为参数传入这里按定值处理 Nn 1500; in1 e / Nn; in2 (e - e_prev) / (Nn * Ts); % 前向传播隐含层 tansig输出层 logsig h tansig(W1 * [in1; in2] b1); y logsig(W2 * h b2); % 输出映射到Kp、Ki并限幅 Kp_scale 0.4; % Kp允许浮动范围 Ki_scale 6.0; % Ki允许浮动范围 Kp_out Kp_base y(1) * Kp_scale; Ki_out Ki_base y(2) * Ki_scale; Kp_out max(0.1, min(Kp_out, Kp_base Kp_scale)); Ki_out max(0.5, min(Ki_out, Ki_base Ki_scale)); % 在线学习以性能指标J0.5*e^2为代价函数对输出层和隐含层做反向更新 J 0.5 * e^2; delta2 (e / Nn) * y .* (1 - y); % 输出层误差信号logsig导数 delta1 (W2 * delta2) .* (1 - h .* h); % 隐含层误差信号tansig导数 lr 0.02; % 学习率 xite 0.05; % 动量因子简化实现这里只保留学习率项 % 更新输出层权值和偏置 W2 W2 lr * delta2 * h; b2 b2 lr * delta2; % 更新隐含层权值和偏置 W1 W1 lr * delta1 * [in1; in2]; b1 b1 lr * delta1; % 记录上一拍误差 e_prev e; end这段代码的逻辑分成三个部分。前向传播部分是把归一化后的误差和误差变化率送入网络算出Kp、Ki的修正量再映射成实际PI参数这一步对应的是“控制器行为”。反向更新部分用转速误差的平方作为代价函数沿梯度方向调整权值这一步让网络获得“学习能力”。持久变量部分保证权值在相邻两个采样周期之间保留下来不会每步都重置。这里有一个要注意的参数关系Kp_scale和Ki_scale决定了网络的调节范围。scale设得过大比如Kp_scale等于Kp_base那么最坏情况下Kp可以翻倍系统容易在边界处振荡设得过小网络对性能的改善有限。我的经验是scale取基准值的30%到50%比较合适既能体现自适应效果又不会让控制参数漂移太远。学习率lr取0.02是一个稳妥的起点偏大容易振荡偏小收敛太慢后面还有专门讨论。MATLAB Function模块的输入端口依次接速度误差e用Step模块给定转速减去实际转速、误差变化率ec用e经过一个低通滤波器再差分或者在离散域里直接用(z-1)/Ts计算Ts填速度环采样周期。输出端接一个Mux或直接分两路连接到PM SM速度环PI控制器的Kp、Ki端口。3.3 学习率、动量因子和权值初值的设置思路BP网的三个参数对仿真结果影响最大学习率lr、动量因子xite、权值初值。学习率控制每一步权值更新的步长。lr取0.01到0.05是论文里的常见区间我实际测试时发现0.02对大多数PMSM速度环模型都稳定如果误差曲线收敛得很慢可以试着提高到0.05再往上转速波形表面会出现细微的锯齿状抖动那就是典型的步长过大。动量因子的作用是把上一次权值更新的方向叠加到本次更新上相当于给梯度下降加惯性能抑制振荡、加速收敛。上面的代码为了可读性只保留了学习率项实际工程版本会加一行W2 W2 lr * delta2 * h xite * (W2 - W2_prev);动量因子取值通常在0.05到0.9之间。在线控制中我不建议取太大0.05到0.3足够因为过大的动量会让权值更新滞后于工况变化转速突变时反而反应不过来。权值初值有一个常见误区直接把随机数范围设成[-1,1]甚至更大。这会初始输出落在非线性区的饱和段附近前几十个采样周期内Kp、Ki剧烈波动。更稳的做法是把初始权值范围压缩到[-0.5,0.5]这在上面的代码里就是这么写的——目的就是让网络初始输出接近0Kp、Ki从基准值平滑起跑。参数建议值影响方向过大后果过小后果学习率lr0.01~0.05收敛速度高频振荡收敛过慢动量因子xite0.05~0.3平滑程度响应迟钝振荡抑制弱隐含节点数6~10学习能力过拟合/计算量大欠拟合Kp_scale30%~50%基值调节范围振荡失稳改善有限初始权值±0.5内初始瞬态输出饱和无不涉及最后提醒一点Simulink里MATLAB Function模块的时间基准一定要和速度环采样周期一致。如果整个仿真用变步长求解器模块会在变步长点被多次调用权值更新频率不一致结果很难复现。后面第4章会详细展开这个问题。4. BP-PI建模避坑指南四个反复出现的翻车现象与对应解法4.1 现象仿真跑几百毫秒就发散波形直接冲出屏幕这个现象我在调第一版BP-PI时几乎必遇。现象很直观——启动阶段转速误差很大BP网络输出一个很大的ΔKp速度环增益瞬间抬高电流参考值震荡然后仿真报错。原因通常出在误差没有归一化或者输出层用了纯线性激活函数。启动瞬间转速误差可能达到额定转速的量级比如1500rpm如果直接把1500这个数塞进网络隐含层所有节点立刻饱和权值更新的梯度方向失去意义甚至网络输出被推到限幅边界之外Kp暴涨。解决方法是严格按照第2.3节的做法进网络之前把e除以额定转速、ec除以额定转速与采样周期的乘积让输入量落在[-1,1]。同时输出层坚持用logsig而不是purelin让网络输出天然受限Kp不可能无界增长。做完这两件事发散问题基本消除剩下的是超调偏大的“准发散”状态那就要靠学习率来收。4.2 现象转速波形出现高频锯齿稳定段不光滑有一种典型的“假失败”现象仿真能跑完但转速波形在稳态段有周期性锯齿像采样保持噪声。把波形放大看频率和速度环采样频率一致。原因是学习率偏大权值在最优值附近来回振荡导致Kp、Ki每个周期小幅抖振。另一个隐蔽原因是误差变化率ec没有做滤波直接做差分放大了量化噪声。Simulink的变步长求解器在理想情况下噪声不大但如果模型里加入了量化模块或者离散化环节差分噪声会很明显。解决分两步先把学习率降到0.01量级看锯齿幅度是否成比例减小再用一阶低通对ec预处理截止频率取速度环带宽的3到5倍例如速度环带宽20Hz低通截止频率取60到100Hz。注意低通不能太慢否则ec的相位滞后会让BP的调节作用明显延迟速度环动态性能反而变差。4.3 现象BP-PI跑出来的结果还不如原始PI超调更大、恢复更慢这是最打击人的情况——加了BP网络结果性能变差了。我第一次遇到时也怀疑“这方案是不是根本不行”后来排查发现是初值问题。BP-PI的基准参数Kp0、Ki0如果取的是一个很差的值比如在额定点附近已经接近振荡边界的Kp网络即使在线修正也只在“坏的基准值”附近小幅调整不可能把系统拉回理想状态。更常见的原因是Kp0和Ki0是随意填的比如取了个整数0.5和10网络在线学习又慢几百毫秒内根本没修正到位前期的响应自然比精心整定的固定PI难看。解决办法是先单独跑传统PI用临界比例度法或Simulink自带的PID Tuner把Kp0、Ki0整定到“固定PI的最优值附近”然后再接入BP网络。BP的作用是锦上添花而不是从头教一个神经网络学会控制电机。把基准PI调好BP-PI只要在任何一段工况下优于基准PI一点点对比结果就是成立的。这个顺序不能反。4.4 现象变步长仿真结果正常改成定步长后性能明显下降这个坑特别容易出现在“仿真做完了要改成实时仿真”的阶段。变步长求解器比如ode45会在系统变化剧烈时自动缩小步长相当于在转速突变段给了BP网络更多次更新机会这在实际控制器里是不存在的——DSP上的速度环是按固定周期运行的。改成定步长之后尤其在步长较大时比如速度环周期1msBP网络每1ms才更新一次转速突变时响应速度变慢超调变大。这不代表BP-PI算法有问题而是仿真条件从“理想”变回了“真实”。解决方法是按照目标控制器的实际采样周期来设置仿真步长。如果准备移植到DSP上做速度环就把Simulink定步长设成1ms或0.5ms和DSP中断周期一致。另外S-Function里要显式声明采样时间ts不能沿用变步长时的继承采样时间。这一步是仿真结果能落地的前提也是我从“论文跑通了”到“实验板跑通了”之间踩得最深的一个坑。5. 模型对比怎么做才让人信服BP-PI与传统PI的三维对比方案5.1 先定对比坐标动态性能、抗扰性能、参数失配鲁棒性标题里“模型对比”这四个字至少有三种理解BP-PI和传统PI的对比、不同网络结构的对比、不同工况下的性能对比。大多数人要的是第一种。但只贴一张“BP-PI超调更小”的阶跃响应图说服力是不够的。我在做对比时至少会覆盖三个维度每个维度给一组量化指标。第一是动态性能对应速度阶跃响应超调量、调节时间、稳态误差或静差。第二是抗扰性能对应运行中突加额定负载转速跌落最大值、恢复到稳态的调节时间。第三是参数失配鲁棒性把电机模型里的电感Ls或磁链psif人为改变20%到30%看两种控制器的性能衰减幅度。第三个维度最容易被人忽略但它恰恰是BP-PI最该展示优势的地方——网络在线修正Kp、Ki就是为了应对模型参数的不确定性。对比维度具体指标固定PIBP-PI一次可复现结果阶跃响应超调量约8%~12%约2%~4%阶跃响应调节时间约0.25~0.35s约0.15~0.20s突加额定负载转速跌落约25~40rpm约10~20rpm突加额定负载恢复时间约0.4~0.6s约0.2~0.3s电感参数20%超调量劣化明显可能振荡较小稳定上面的量级是我在实际仿真中能够稳定复现出来的典型结果不同电机参数下数值会有浮动对比趋势是稳定的BP-PI把超调压了下来同时把恢复时间缩短代价是算法复杂度和调试成本。5.2 一次典型的仿真对比从波形去看BP到底改了什么把阶跃响应波形放一起看BP-PI的曲线形态和传统PI有明显区别。传统PI的转速曲线是典型的二阶响应先冲过目标转速超调点之后缓慢回落积分项慢慢消静差。BP-PI的曲线在起动阶段几乎贴着给定转速上升接近目标时提前“刹车”超调很小后半段基本是单调逼近。这个现象背后的机理值得讲清楚起动初期转速误差大BP网络快速加大Kp保证快速的扭矩响应接近目标转速时误差变化率ec变号网络学习到“快要冲过头了”主动降低Kp、增大Ki让系统平稳进入稳态。这在固定PI里做不到——固定Kp只有一个值要么快但有超调要么稳但起动慢。突加负载的波形对比更有说服力。传统PI在突加额定负载时转速跌落明显恢复过程要过好几拍才回到给定BP-PI在负载变化后误差和ec同时变大网络在线修正Kp相当于负载扰动后的前几个周期就把增益提上来了转速跌落更浅回落曲线更陡。这里要注意BP-PI对抗动的改善不是因为网络“预知”了负载而是因为误差信号触发权值更新的速度足够快。因此学习率不能取得太小否则改善幅度会退化到和固定PI差不多。5.3 对比结果不理想时的回溯路径如果对比做出来BP-PI没有明显优势不要急着否定这个方案按照下面的顺序回溯多数情况下能找到原因。第一步查基准PI参数对不对。回到第4.3节的观点基准PI必须已经是一个“能用”的参数BP-PI的价值是让它更好用不是把一个烂参数救活。第二步查权值是否真的在收敛。把每个采样周期的ΔKp、ΔKi拉出来画曲线如果它们在稳态段持续大幅波动而不是收敛到某个邻域说明学习率偏大或误差信号有噪声。第三步查限幅是否起作用。看Kp输出有没有频繁顶到限幅边界如果频繁顶格说明Kp_scale设小了网络想给出更大的修正量但被截断。第四步查对比工况是否公平。有些论文里BP-PI用了10s的预训练传统PI只给了一组固定参数这不叫公平对比。我给自己的标准是传统PI的参数也经过整定优化BP-PI不额外加多周期预训练最多允许离线初始化一次权值。回溯路径看起来是在讲调参实际上是在讲一个原则模型对比要有相同的调试成本、相同的评价指标、相同的运行条件。这个原则守住了对比结果才有论文和项目评审价值。6. 进阶把BP-PI从仿真推向工程之前先做这三件事6.1 离线训练加在线微调给BP一个靠谱的出生体重纯在线BP的一个痛点是启动阶段权值从随机值开始学前几百毫秒的性能没有保障。我的习惯是在Simulink里先跑一组典型工况额定转速阶跃、突加减载把训练收敛后的W1、W2导出成mat文件再作为MATLAB Function里persistent变量的初值。这样控制器上电时的Kp、Ki就在基准值附近小范围浮动不会出现起步即振荡。% 在离线训练脚本的末尾把权值存下来 save(bp_weights_init.mat, W1, b1, W2, b2);在线运行时只做小步长微调学习率可以比纯在线版本更低比如0.005到0.01这样既保留自适应能力又不会让参数漂移太快。这个“离线出生体重加在线微调”的思路是BP-PI真正能落地到项目里的关键。6.2 记录ΔKp、ΔKi和误差看网络是否在收敛在线运行的BP-PI最怕成为黑匣子。我每做一个版本都会把e、ΔKp、ΔKi这三个量引出来接给Scope或者存到工作区。判断标准很简单启动和负载突变时三个量有大的动态波动是正常的稳态时ΔKp、ΔKi应该在某个小范围内波动或者趋于常数。如果稳态时它们还在大幅振荡说明学习率偏大或者误差信号没滤波这时不要急着调网络结构先降学习率再看。6.3 控制器采样周期与仿真步长必须一致往DSP移植之前一定把Simulink的定步长设成和硬件中断周期相同的值。速度环周期我常用0.5ms到1ms电流环仍保持0.05ms到0.1ms。BP网络只挂在速度环上所以1ms的更新周期完全够用。这里有个血泪经验在仿真里用变步长跑出来的BP-PI性能会好于实际控制器因为求解器在动态变化时偷跑了更小步长相当于给了网络额外的学习机会移植到定点DSP上如果优化不够一次前向加反向传播可能吃掉十几微秒要提前预算时序余量。我的习惯是每一版模型都固定一个版本号仿真设置、求解器步长、初始权值、基准PI参数全部记录在模型描述里。这样后续想复现任何一组对比结果都有据可查。这个习惯帮我避开了很多次“上周我明明跑出过这个波形”的尴尬也希望帮你在BP神经网络PI控制这条路上少走几个来回。本文还有配套的精品资源点击获取
返回列表