1. 为什么要用PSO去整定PMSM速度环参数
做PMSM驱动控制这几年,速度环PI参数整定一直是道绕不过去的坎。我最早接触PMSM速度环参数整定的时候,用的还是最传统的工程试凑法:先把Kp调到临界振荡,再退回来,然后慢慢加Ki消静态误差。一套参数调下来少说也得半天,换一个负载工况、换一块驱动板,之前的经验就基本作废了。后面接触到PSO参数整定,才意识到这种靠手感、靠经验的活,完全可以交给智能算法去干,而且效果往往比我手动调出来的更稳、更均匀。
先说清楚为什么传统的试凑法在PMSM速度环上这么痛苦。永磁同步电机的速度环不是简单的一阶或二阶对象,它的内层还有电流环,电流环本身又包含PI调节器、逆变器滞后、开关周期离散化误差这些环节。所以速度环实际面对的是一个带延迟的高阶被控对象。你调Kp的时候,响应变快了,但延迟环节会带来相位裕度下降,很容易出现转速超调、甚至低频振荡;你调Ki的时候,抗扰能力上去了,但Ki过大会让速度环和电流环产生耦合谐振,严重的时候电机在启动阶段就会发出刺耳的“嗡嗡”声。这种多个参数互相牵连的调法,最消耗调试者的耐心。
PSO的思路很简单,就是把你手动调参数时脑子里那套“试一下、看波形、再改一点”的逻辑,变成一个自动寻优的数学模型。把Kp和Ki当作粒子的位置坐标,让几十个粒子在二维参数空间里飞,每飞到一个位置就做一次阶跃响应测试,算出超调量、调节时间、ITAE这些性能指标,然后把指标换算成一个适应度值。粒子之间共享最优位置信息,逐步向最优参数组合靠拢。我在实际项目中用下来,一套不太好调的PMSM速度环参数,PSO一般跑20到40代就能搜出可用的结果,比纯手工试凑快一个数量级。
这篇文章主要想分享我在PMSM速度环参数整定上的完整实践,包括速度环数学模型的简化方法、PSO算法的关键设计、仿真到实机的踩坑记录、最终的实验数据对比,以及一些排查问题的经验。无论你是刚接触永磁同步电机控制的初学者,还是正在为某个项目参数调不动而头疼的工程师,这些内容应该都能给你提供一套可直接落地的参考方案。
2. PMSM速度环数学模型与PSO算法关键设计
2.1 速度环被控对象建模:从电机方程到传递函数
要整定PMSM速度环参数,先得知道你在整定一个什么样的对象。这一步偷懒的话,后面PSO搜出来的参数很可能在仿真里没问题,一上实机就发散。我自己习惯从PMSM的dq轴数学模型开始推导。
在转子磁场定向坐标系下,PMSM的电压方程是:
ud = Rs·id + Ld·(did/dt) - ωe·Lq·iq
uq = Rs·iq + Lq·(diq/dt) + ωe·(Ld·id + ψf)
电磁转矩方程是:
Te = 1.5·p·(ψf·iq + (Ld - Lq)·id·iq)
机械运动方程是:
J·(dωm/dt) = Te - TL - B·ωm
对于表贴式PMSM,Ld和Lq近似相等,转矩方程化简为 Te = 1.5·p·ψf·iq = Kt·iq。也就是说,电磁转矩和iq电流呈线性关系,此时的转矩系数Kt是一个常数。这是速度环被控对象中最关键的一个参数。
速度环的外面还有电流环。工程上通常把电流环等效成一个一阶惯性环节,时间常数大约是2倍的电流环采样周期。而电流环采样周期一般等于PMSM的开关周期。所以一套典型的控制结构是:速度环采样频率1kHz,电流环采样频率10kHz,那么电流环等效时间常数Tc约等于100微秒,逆变器死区时间大约2到3微秒。把这些串起来,速度环被控对象的传递函数可以近似表达为:
Gv(s) = Kt / (J·s + B) × 1 / (2·Tc·s + 1)
这个模型虽然粗糙,但对于PSO整定来说完全够用了。要注意的是,它里面包含了延迟环节,这正是PSO去搜索比手工试凑更有优势的地方。因为延迟项的存在会约束Kp的上限,手工调的时候很难直观判断某个Kp值会不会引起振荡,而PSO可以通过适应度函数自动把这些约束吃进去。
2.2 PSO维度映射与适应度函数设计
PSO要把速度环参数整定问题转换成寻优问题,首先要定义粒子位置和速度的含义。我在项目中只整定Kp和Ki两个参数,所以粒子就是二维的,每个粒子的位置向量是 [Kp, Ki],粒子的速度向量是 [ΔKp, ΔKi]。这里有个设计细节:Ki这个维度的搜索范围不能直接给任意值,最好先用电机机电时间常数估算一个初始区域。电机机电时间常数可以用 J / B 来估算,Ki的量纲是1/秒,所以Ki的搜索上限大致取 Kp / 机电时间常数 的两倍左右,这样能避免随机初始化的粒子大多落在不稳定区域。
适应度函数的设计是整个PSO整定的灵魂。如果适应度函数选得不好,算法即使收敛了,得到的参数也可能不符合工程要求。我最常用的是带超调惩罚的ITAE指标:
J = ∫₀ᵀ t·|e(t)| dt + w₁·Mp + w₂·t_settle
其中e(t)是转速误差,Mp是超调量,t_settle是进入稳态区间的时间,w₁和w₂是加权系数。为什么要加超调惩罚和调节时间惩罚?因为纯ITAE指标倾向于优化整个误差曲线的积分,它可能允许一个比较明显的超调来换取更快的上升时间。而在实际PMSM驱动中,转速超调意味着母线电流冲击,严重时会触发驱动板的过流保护,甚至造成机械传动部分的冲击振动。我在项目中把超调量权重w₁设得比较大,取0.3左右,让搜索空间里超调较大的粒子适应度被明显拉低。
还有一个容易被忽略的适应度细节:稳态误差必须单独检查。有些粒子会让系统进入一个不太稳定的振荡状态,但积分指标计算周期恰好覆盖了振荡区间,导致误差积分反而不大,被误判为优秀个体。解决办法是在适应度计算结束后增加一个判断,如果最后0.2秒的转速误差超过额定转速的1%,直接把适应度设置为一个大数。这个硬过滤条件在实机整定时尤为重要。
2.3 PSO参数选取与迭代策略
PSO算法自身的参数也会直接影响最终整定效果。粒子数、迭代次数、学习因子、惯性权重这四样东西需要根据实际计算预算来权衡。
我的常用配置是:
- 粒子数N = 30,迭代次数T = 60
- c1 = 1.5,c2 = 1.5
- 惯性权重w从0.9线性递减到0.4
- 粒子速度上限vmax = 0.2 × (参数上限 - 参数下限)
惯性权重线性递减是最稳妥的策略。前期w较大,粒子全局探索能力更强,能够跳出局部最优;后期w减小,粒子在最优解附近精细搜索。c1和c2相等时,粒子的个体经验和群体经验权重相当,适合参数空间维度较低的情况。如果你的整定对象比较复杂,比如同时整定Kp、Ki、Kff前馈系数,三维搜索空间下我会把c1稍微调大到1.6,提升粒子探索自身经验的权重,降低早熟收敛的概率。
迭代20代以后,我一般会看一眼适应度收敛曲线。如果连续5代全局最优适应度都没有变化,就要考虑是否发生了早熟收敛。我的处理方式是引入随机重启机制:选择适应度最差的5个粒子,把它们的当前位置重新随机初始化,同时保留全局最优信息。这样能在不打断整体搜索进程的前提下,增加种群多样性。
3. 仿真到实机:驱动板选型与开关频率的配合
3.1 仿真平台搭建:隐藏的坑
在MATLAB/Simulink里搭建PMSM双闭环仿真模型时,我建议不要用自带的PMSM模型直接整定。自带的理想模型忽略了逆变器死区、ADC量化误差、速度反馈滤波延迟,PSO在这种干净模型里搜出的参数,切换到实机后经常出现两个问题:一是Kp偏大,实机上一启动就振荡;二是Ki偏大,实机在负载突变时电流冲击明显。
我的做法是在仿真模型里主动加入这些“不干净”的因素。电流环采样频率设置成和实机驱动板一样的10kHz,逆变器模型加上死区时间3微秒,电流反馈加上量化误差约为1%满量程的白噪声。速度环采样频率固定1kHz,速度反馈通道加一阶低通滤波器,截止频率通常取300到500Hz。这样仿真环境和实机驱动板的特性高度接近,PSO搜索出来的参数区间有很高的参考价值。
在仿真阶段,PSO的适应度评估可以批量并行执行。每次阶跃测试耗时1秒,30个粒子迭代60次,理论上要1800次阶跃测试,如果串行跑要半小时以上。我一般用MATLAB的parfor或者并行计算工具箱把粒子评估循环并行化,20分钟内能把一轮整定跑完。如果不想折腾并行,也可以用简化方式:先把粒子数降到15、迭代次数降到30,配合前文提到的稳定域约束,足以圈出一个不错的参数区间。
3.2 实机平台配置与PSO整定流程
实机整定使用的驱动板是我基于STM32F405自己画的一块板子,主控频率168MHz,三相逆变器用的是IR2136驱动芯片加IRFP460 MOS管,母线电压48V。PMSM开关频率设置成10kHz,速度环执行周期1kHz,电流环执行周期100微秒。编码器用1000线的增量式光电编码器,四倍频后每圈4000个计数,速度反馈通过M法测速得出,分辨率在全速范围内约1rpm。
实机整定和仿真整定有一个巨大的区别:实机评估每个粒子的适应度,是一次真实的电机阶跃运行,时间成本和设备安全都要考虑。实机上30个粒子跑60次迭代,每次阶跃测试2秒,总耗时将近1小时,这还没算参数下载时间和波形保存时间。所以我建议实机阶段采用“仿真粗搜+实机精调”的两级策略:仿真先把粒子收敛到参数空间的某个区域,实机只用窄范围进行二次搜索,粒子数10个、迭代次数15次,总共150次阶跃测试,20分钟左右就能跑完。
实机搜索前还有几个安全方面的准备。第一,电流环的d轴、q轴电流限幅必须设置好,出厂的默认值一般是额定电流的1.5倍,如果某个粒子的Kp过大导致电流暴涨,限幅能保住MOS管。第二,转速保护值要设置,搜索过程中转速一旦超过额定转速的120%,程序立即切断PWM输出。第三,电机轴最好脱开负载,只保留一个惯量较小的飞轮,这样即使参数发散,对机械部分的冲击也有限。第四,把PSO每代的最优参数实时显示在上位机上,一旦发现参数在向明显异常的方向演化,可以手动停止。
3.3 开关频率与无感场合的特殊考量
PMSM开关频率的选择对速度环整定结果有直接影响。开关频率越高,电流环的等效延迟越小,允许的速度环带宽就越高,整定出来的Kp可以更大。我自己对比过10kHz和20kHz两种开关频率对整定结果的影响,在相同的电机和负载条件下,20kHz开关频率下整定出的Kp大约比10kHz能高20%到30%,速度环响应速度有可感知的提升。但代价是开关损耗变大,驱动板温升明显,逆变器的散热开销更高。对大多数项目来说,10kHz是性价比最高的选择,既能保证足够的速度环带宽,又不至于让驱动板的温度处理成为瓶颈。
如果你做的是pmsm无感控制,整定时候还要多考虑一步:速度反馈噪声。无感算法(比如滑模观测器或磁链观测器)估算出的转速里,混有比较明显的基波和高频噪声,直接送给速度环会导致Kp稍微调大就出现转速抖动。我的做法是先对估计转速做一阶低通滤波,截止频率取500Hz左右,滤完波再做速度环PI运算。但滤波器本身会引入相位延迟,这个延迟又占掉了额外的相位裕度。所以无感场合整定出的速度环Kp,通常要比带编码器的有感控制低20%到30%。这也是为什么同一个电机,无感控制跑起来总觉得“肉”一些,而带编码器时又能“燥”起来。
4. 整定结果对比与实验数据分析
4.1 阶跃响应:PSO参数 vs 经验参数
我在一套额定转速3000rpm、额定电流6A的PMSM测试平台上做了对比实验。电机用M法测速反馈,负载是一个可调磁粉制动器,分别用传统经验调参和PSO整定参数做了两组阶跃实验。
先看空载启动阶跃,目标转速1000rpm。经验参数是我手动调的,整体思路是“先稳住、再调快”,Kp取0.12,Ki取18。PSO整定出来的参数是Kp = 0.086,Ki = 12.4。从结果看,经验参数的超调量约12%,第一次超调后需要振荡两个周期才稳定下来,调节时间约0.85秒;PSO参数的超调量只有3%,基本一次到位,调节时间约0.36秒。这里有个有意思的细节:PSO整定出的Kp反而比经验参数小,但它用更合理的Ki配合,让系统在保持临界阻尼的同时加快了响应。这说明“Kp越大越快”这个直觉在带延迟的系统中并不总是成立。
再看突加负载实验。转速稳定在1200rpm后,突加50%额定负载。经验参数下,转速跌落约65rpm,恢复到稳态需要1.2秒,中间还伴随一次小幅振荡;PSO参数下,转速跌落38rpm,恢复时间0.28秒,几乎没有可见的二次振荡。这个结果特别能体现PSO参数的价值:虽然Kp小了点,但Ki的配置更贴合被控对象的机电时间常数,抗扰能力明显更好。
4.2 参数鲁棒性与工况适应性
整定出的参数不是一次性的,还需要验证在不同工况下的表现。我做了母线电压波动和惯量负载变化两组测试。
母线电压从48V降到36V时,经验参数的表现会略微变差,转速阶跃的超调从12%升到15%,振荡幅度也有增加。原因在于较低的母线电压限制了电流环的dq轴电压输出能力,等效降低了电流环的响应速度,速度环的相位裕度进一步下降。PSO整定参数在这个场景下表现稍好一些,超调从3%升到6%,调节时间从0.36秒升到0.42秒,仍在可接受范围内。
惯量变化方面,我测试了电机轴上加装一个2倍转子惯量的飞轮。此时PSO参数的速度阶跃出现约8%的超调,但很快能稳定下来;经验参数则出现了持续三个周期的低频振荡,需要把Kp调小30%才能稳定。结论是:PSO参数对惯量变化的鲁棒性优于手动参数,但一旦惯量变化超过设计值的2倍,建议重新跑一轮整定。这一轮整定可以只做窄范围精调,耗时不长,没必要从全局重新搜索。
4.3 PSO收敛过程记录
我记录了一轮30粒子、60迭代的收敛过程。前5代,粒子群在参数空间内分布很散,适应度值从几千到几万都有,全局最优适应度快速下降。第8代以后,最优解基本锁定在Kp ≈ 0.08到0.1、Ki ≈ 10到14的区域内。第15代到第30代,适应度曲线下降开始放缓,粒子们主要在做局部精细搜索。到第40代以后,适应度几乎没有变化,表示搜索已经收敛。
这个收敛过程告诉我一件事:在实际项目中,PSO迭代到30代左右就足够得到高质量结果了,继续迭代的边际收益很小。如果你的时间预算紧张,跑20代也好,配合惯性权重线性递减策略,最终参数的工程可用度已经不错。如果用的是随机重启策略,偶尔会出现适应度先平稳、然后突然跳降的现象,那一般是某个被重置的粒子发现了更优区域,属于正常情况。
5. 常见问题排查与避坑速查表
5.1 算法层面:早熟收敛、适应度震荡与耗时优化
早熟收敛是PSO整定最常遇到的问题。症状是适应度曲线在某一个数值上卡住很多代不动,或者粒子群全部聚集在一个局部最优区域。除了前面提到的随机重启机制,我还会检查粒子速度上限vmax是否设置过小。如果vmax小于参数搜索范围的5%,粒子群会迅速收缩到初始最优附近,几乎没有机会探索其他区域。把vmax放宽到搜索范围的20%左右,一般能缓解这个问题。
适应度震荡是另一个高频问题。现象是同一个粒子的参数在多次阶跃测试中,适应度计算结果差异巨大,导致PSO无法正确比较粒子优劣。我排查后发现,最常见的罪魁祸首是阶跃测试的初始状态不一致。实机整定中,每次阶跃测试前必须确保电机已经稳定在同一个转速起始值,比如都从0rpm阶跃到目标转速。如果上一次测试结束后电机还没完全停止就开始了下一次测试,转速初速会随机漂移,适应度自然就抖了。解决方法是每次测试前增加一个固定时长的准备阶段,让电机稳定运行在起始转速并持续0.5秒后再执行阶跃。
耗时方面,如果你的整定时间预算紧张,可以考虑降低粒子数和迭代次数,但应优先降低粒子数而不是迭代次数。经验上,粒子数不足会导致探索不充分,而迭代次数不足会导致整个粒子群的收敛不充分。我推荐的最小配置是粒子数15、迭代次数20,再低的话结果质量就很难保证了。
5.2 控制与驱动层面:电流饱和、反馈噪声与开关频率
实机调试时,如果速度环参数偏大,首要症状是电流环进入饱和状态。电流给定的波形出现削顶,dq轴电流跟踪不上给定值,电机会发出明显的噪声。这种情况如果不加限制,PSO会把适应度评估带偏,因为电流饱和已经破坏了线性系统的前提。我的做法是在适应度函数中增加一个电流限幅惩罚项:如果阶跃过程中任意时刻的q轴电流超过额定电流的1.5倍,直接给这个粒子的适应度乘一个惩罚系数。这样PSO会自动避开那些会让电流环饱和的参数组合。
速度反馈噪声问题在无感控制中更为突出。我在整定无感PMSM速度环时,观察到适应度曲线会在某几个粒子参数处出现“尖峰”式跳变,排查下来是观测器转速噪声过大,导致速度误差积分值异常偏大。这种情况下先不要急着改PSO参数,应该先优化速度反馈通路。比如把速度反馈滤波器的截止频率从500Hz降到200Hz,或者改用带通滤波器滤除特定频段的噪声,然后再重新整定。
开关频率的选择也会影响整定结果的可移植性。如果你把仿真中10kHz开关频率下整定出的参数直接用到20kHz开关频率的驱动板上,理论上系统会更稳,但实际上可能因为电流环模型差异导致性能不最优。反过来,把20kHz整定的参数用到10kHz上,就很容易发散。所以换驱动板时如果开关频率变了,参数必须重新整定。
5.3 实机安全与调试环境注意事项
实机整定过程中最重要的一条原则:任何时候都不要让粒子参数在未经限制的情况下直接作用于电机。我在第一次实机PSO整定时吃过亏。当时有一个粒子的Kp特别大,Kp又恰好能让系统在一个临界稳定状态运行,结果转速出现了剧烈振荡,母线电流瞬间冲到额定电流的3倍,直接把驱动板的保险丝烧了。后来我加了两个硬保护:一是在速度环输出端加一个限幅,限制iq给定值的最大绝对值;二是在上位机里实时监控母线电流,一旦超过阈值自动发送停机指令。有了这两层保护,后面几百次粒子测试都运行得很平稳。
还有一个容易忽略的环境因素是机械共振。当整定出的速度环带宽恰好落在机械传动系统的共振峰范围内,电机会在某个转速区间发出异常的共振噪声。这种问题在仿真里完全看不到,因为仿真模型里没有机械谐振。我在实机测试中遇到过一台带减速箱的电机,速度环带宽调到一定程度后,启动瞬间减速箱箱体出现明显的周期性撞击声。解决办法不是去调PI参数,而是先确认机械系统的固有频率,然后在速度环输出端加一个陷波滤波器来抑制共振峰的放大效应。
6. 最后说两个小技巧
第一个小技巧是,实机整定完第一轮之后,别急着把参数固化。我通常会把PSO搜出的最优参数做一次±20%的邻域扫描,生成一张参数-性能热力图,这样能直观看到最优解附近还有没有更平坦的区域。如果某个参数组合在邻域扫描中表现出较强的鲁棒性,即使它在数值上不是适应度最优的那一组,我也会优先选择它作为最终参数。因为生产环境的工况波动远比测试时复杂,一个对参数不那么敏感的解,远比一个最优但处于陡峭峡谷边缘的解更可靠。
第二个小技巧是关于PSO初值设置的。如果项目中有历史调试数据,或者你大致知道某台电机之前用过的有效PI参数范围,可以把这个参数范围作为PSO初始粒子群的分布中心。设置中心后初始粒子群的一半围绕该中心随机分布,另一半在全局范围内均匀分布。这样既能利用历史经验,又不至于完全放弃全局搜索。我试过纯随机初始化和带先验信息的初始化两种方式,在相同的迭代预算下,带先验信息的一组收敛速度大约快30%,最终适应度也更优。
我在实际项目中用PSO整定PMSM速度环参数已经跑通了多个平台,从24V的小功率驱动板到48V的工业驱动板都验证过。这套“数学模型简化 + PSO离线粗搜 + 实机窄域精调 + 安全保护兜底”的流程,把我的调试时间从以天为单位压缩到了以小时为单位。如果你也在被PMSM速度环参数整定折磨,不妨试着搭一个仿真模型,让粒子群先把参数范围圈出来,再带着这个范围上实机去跑,你会发现调参这件事远没有想象中那么玄学。