简介:基于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 (id=0控制时)这里Rs是定子电阻,Ls是电感,we是电角速度,psif是永磁磁链。表面看是一个二阶非线性系统,但在id=0的矢量控制框架下,转矩和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不改
整个系统是一个典型的id=0矢量控制结构:外环是速度环,输出iq参考值;内环是d、q轴电流环,输出ud、uq;再接PWM逆变器和PMSM。BP-PI的接入点在速度环——它替代原来的固定PI控制器,输出仍然是iq_ref,只是内部Kp、Ki在变。
电流环为什么不一起换成BP-PI?两个原因。第一,电流环带宽一般设计在1kHz以上,采样周期很短,BP网络一次前向传播加反向传播在低成本处理器上可能占掉大半个控制周期,时序上很紧张。第二,电流环的对象是电机的电气方程,电阻电感参数相对稳定,传统PI配合前馈解耦已经能获得很好的动态;真正频繁变化的负载和惯量主要作用在速度环。所以,速度环用BP-PI,电流环保持PI加电压前馈补偿,这是工程上性价比最高的分工。
3.2 从公式到Simulink:MATLAB 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 % 输入归一化,额定转速Nn=1500rpm可作为参数传入,这里按定值处理 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)); % 在线学习:以性能指标J=0.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],这在上面的代码里就是这么写的——目的就是让网络初始输出接近0,Kp、Ki从基准值平滑起跑。
| 参数 | 建议值 | 影响方向 | 过大后果 | 过小后果 |
|---|---|---|---|---|
| 学习率lr | 0.01~0.05 | 收敛速度 | 高频振荡 | 收敛过慢 |
| 动量因子xite | 0.05~0.3 | 平滑程度 | 响应迟钝 | 振荡抑制弱 |
| 隐含节点数 | 6~10 | 学习能力 | 过拟合/计算量大 | 欠拟合 |
| Kp_scale | 30%~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上的速度环是按固定周期运行的。
改成定步长之后,尤其在步长较大时(比如速度环周期1ms),BP网络每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,就是为了应对模型参数的不确定性。
| 对比维度 | 具体指标 | 固定PI | BP-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控制这条路上少走几个来回。
本文还有配套的精品资源,点击获取