1. 为什么SRM仿真会让很多人“一开始就崩盘”
我第一次拿到开关磁阻电机控制仿真这个课题时,心里想得比较简单:Matlab里有现成电机模块,拖出来接上桥臂,再给个电流滞环应该就能出波形了吧。结果折腾了两周,模型要么跑不动,要么转矩波形跟理论完全对不上,转速一路飙到天上。后来把开关磁阻电机(SRM)的工作原理重新捋了一遍,才明白问题出在哪:这电机跟异步电机、永磁同步电机完全不是一个路子,不能拿老经验去套。
1.1 SRM这个电机“不正常”在哪
开关磁阻电机是典型的双凸极结构,定子和转子都有凸极,转子上没有任何绕组、磁钢、鼠笼条,全靠定子绕组通电后产生磁拉力把转子凸极“吸”过去。所以它的出力原理不依赖于旋转磁场,而是依赖于电感随转子位置的变化率。电磁转矩公式可以写成:
T = 0.5 * i² * dL/dθ
也就是说,转矩大小和电流方向无关,只跟电流幅值的平方、以及电感对转子位置的变化率有关。这带来一个很关键的控制逻辑:想让电机出力,必须在电感上升段(转子极靠近定子极的过程)给对应相通电;如果在电感下降段还通着电,转矩是负的,变成制动转矩,轻则效率暴跌,重则直接把转速压下来。
这也就是为什么SRM看起来“结构简单”,控制起来却不简单。很多第一次做仿真的人,用永磁电机的思路去给三相绕组通正弦电流,结果完全不对,因为SRM需要的电流是“相位对齐”的脉冲电流,而不是连续的对称交流。
1.2 仿真的两个隐藏门槛:非线性建模与开关控制
第一个门槛是强烈的非线性。SRM最核心的电感参数L不是一个常数,它同时依赖转子位置θ和相电流i。电流越大,磁路越饱和,电感反而掉下来。所以模型里必须要有“磁链-电流-位置”的三维查找表,或者等效的转矩查找表。Matlab自带的SRM模块内部也是按查找表实现的,不是简单的恒参数模型。
第二个门槛是控制方式不是连续调压,而是开关控制。SRM驱动器本质上是给每相绕组的开关管按角度规律做斩波。低速时用电流斩波(限流),高速时用角度控制(单脉冲)。这两种模式之间怎么切换、开通角和关断角怎么算,直接决定仿真结果是否合理。
1.3 动手前的知识储备清单
如果你正准备开搞SRM仿真,我建议先确认自己有没有这几个基础,不然建模过程会很痛苦:
| 知识项 | 为什么必须有 | 遇到困难时的补救方法 |
|---|---|---|
| 绕组电感与转子位置的关系 | SRM转矩全靠dL/dθ,不认识电感随角度变化规律就无从下手 | 先看几个经典SRM教材里的电感和转矩特性图,理解“不对齐位置”和“对齐位置” |
| 不对称半桥功率变换器 | SRM电流需要单方向脉动,必须用每相独立的半桥拓扑 | 先从单个IGBT续流回路理解起,再扩展到三相 |
| 电流斩波和角度位置控制 | 低速和高速两种主流的控制策略 | 先用滞环电流斩波跑通开环,再谈角度优化 |
| Simulink求解器基本设置 | 非线性开关电路容易不收敛或步长过小 | 先学会切换ode23tb和设置MaxStep |
这些内容不一定都要背得滚瓜烂熟,但脑子里得有图景。我最开始就是没把dL/dθ和导通区间的关系吃透,导致仿真里开通角设置错,电流波形看起来还行,转速却上不去,浪费了很多时间。
2. Matlab 2016版环境准备:库组件与自带模块的版本差异
用2016版做电机仿真,网络上的教程大多针对2018、2020甚至更高版本,模块路径变了,有时候连库都找不到。这不是你菜,是版本差异确实坑。
2.1 安装与组件检查
2016版里提供SRM仿真能力的核心组件叫SimPowerSystems,在后续版本中逐步改名为Simscape Electrical。如果你安装Matlab时没有勾选相关组件,打开Simulink库浏览器后搜索“Switched Reluctance Motor”,结果会是空白。
检查方法很简单,在命令行窗口输入:
ver('SimscapeElectrical')如果提示找不到组件,说明电气仿真模块没装。2016版在安装包管理界面里可以补安装,选择“Simscape Power Systems”或“Simscape Electrical”相关选项即可。需要注意的是,16版和后来的版本在库浏览器里模块分类名不一样,有时候叫“SimPowerSystems”,有时候叫“Specialized Technology”。无论它叫啥,搜索“SRM”或“Switched Reluctance”都比自己翻目录快得多。
2.2 自带SRM电机模块在哪、参数面板如何理解
在2016版中,SRM电机模块通常在如下路径附近(各小版本略有差异,建议搜索):
Simscape -> SimPowerSystems -> Specialized Technology -> Machines(或 Electric Drives)
搜索结果里会出现“Switched Reluctance Motor (12/8)”这类预置模型。双击打开参数面板,你会看到几个关键区:
- 绕组电阻和极数设置
- 磁链特性查找表(Flux Linkage vs Current vs Angle)
- 转矩特性查找表(Torque vs Current vs Angle)
很多教程会告诉你“用默认参数就行”,但我不建议直接默认。你至少要把电机极数、额定电压、额定功率和你的应用方向校核一遍。12/8结构的三相SRM电角度极对数是4,机械角度15度对应60度电角度,这些细节直接影响后续控制信号的换算。
2.3 2016版与其他版本打交道的三个注意点
第一个注意点:老版本的“Switched Reluctance Motor”模块在某些2016版里不支持直接输出内部角度信号,需要从电机模块的测量端口引出。如果测量端口里没有“theta”这一项,就查一下模块文档,看输出顺序是按什么排的。
第二个注意点:模块的输入信号单位。2016版里部分电机模块要求角度输入单位是rad,但也有模型内部使用degree的,角度源接错单位是最常见的错误之一。我的习惯是,把所有角度相关的物理量统一转成机械角度,在控制链路里最后一步再做单位变换。
第三个注意点:模型文件不能放在中文路径下。2016版对中文路径的支持很差,模型里一旦涉及查找表数据文件、MAT文件读取,中文路径就报错。工程目录最好全英文,包括文件名、变量名不要用中文,省得踩坑。
3. 仿真模型搭建:从不对称半桥到控制链路
搭建整套SRM仿真模型,我一般分成三块:功率主电路、电机本体、控制逻辑。电机本体用自带模块,剩下两块的搭法很关键。
3.1 功率变换器拓扑与器件选型
SRM不能用普通三相全桥驱动,因为电流方向是单方向的,而且每相绕组必须独立控制。最经典的是不对称半桥拓扑,每相配两个IGBT和两个二极管。A相接线方式如下:
- 上管连接母线正极到绕组一端
- 绕组另一端接上桥臂的下管和二极管
- 上管导通、下管导通时,绕组两端施加母线电压,电流上升
- 上管关断、下管关断时,绕组电流通过两个续流二极管回馈母线
在Simulink里搭建时,我习惯直接用Simscape Specialized Technology里的IGBT和Diode模块,而不是用Universal Bridge。原因很简单:通用桥模块是给你做逆变器的,它内部对上下桥臂有死区逻辑和固定联结关系,用在SRM这种“三态调制”场景反而不灵活。IGBT模块的栅极控制信号可以直接从控制链路引出来,续流二极管反并联接法也很直观。
每相桥臂独立复制三次,A、B、C三相共六个IGBT。母线侧加一个直流电压源,电压值按照你目标电机的额定母线电压设定。比如小功率SRM用300V,较大功率的可以用540V。我早期图省事直接用了永磁电机逆变器里的“Universal Bridge”,结果斩波续流路径不对,电流波形直接畸形,这里一定要用不对称半桥。
3.2 电流斩波控制(CCC)的搭法与电流基准设定
电流斩波是SRM低速控制的基础。思路很简单:每相导通期间,设定一个电流上限和下限,电流升到上限时关断管子,电流衰减到下限时重新开通,把电流“咬”在一个平均电流附近,从而控制转矩大小。
在Simulink中实现滞环斩波,我常用的方式是:
- 用Current Measurement模块测每相瞬时电流。
- 将电流和参考电流(由你给定或转速PI输出)一起送入Relay模块。
- Relay开关阈值设成上下限,比如参考电流是25A时,上限设26A,下限设24A。
- 将Relay输出与角度导通信号做AND运算,得到最终的触发脉冲。
这里有个容易被忽略的问题:Relay模块的滞环宽度不能太窄,太窄会显著提高开关频率,导致仿真步长被压得非常小,跑一步要等半天。我一般设上下限之差在2A到3A左右,平衡波形质量和仿真速度。
参考电流从哪里来?如果只是开环验证转矩特性,可以直接给一个常数电流限幅。如果是转速闭环,转速PI输出就是参考电流。PI输出要加饱和限幅,限幅值就是斩波电流的允许峰值,这个值根据电机的额定电流和控制器功率来定。限制PI输出还有个额外好处——防止启动瞬间拔地而起的大电流把仿真搞崩。
3.3 转速闭环与角度位置控制的参数计算逻辑
单靠电流斩波无法让电机高速运行,因为反电动势上去之后电流上升速率变慢,斩波效率越来越低。所以SRM控制里高速区要切换到角度位置控制(APC),核心是调节开通角θon和关断角θoff。
以12/8三相电机为例,转子齿距角是360°/8 = 45°机械角,三相之间存在120°电角度间隔。每一相电感的上升区间是从“不对齐位置”到“对齐位置”,对应15°机械角(60°电角度),三相轮流导通,驱动转子连续旋转。
开通角θon和关断角θoff的经验设定逻辑是:
- θon一般取上升区间起点之前1°到3°,提前通电可以让电流在电感开始上升时已经建立起来。
- θoff一般取对齐位置之前1°到5°,提前关断是为了避开电感下降区,防止负转矩。
- 如果发现电流拖尾严重,就把θoff往前挪;如果转矩脉动大,检查是否开通过早,电流建立阶段吃掉了太多负转矩区间。
转速闭环的经典结构是外环PI加内环电流滞环。电机模块输出实测转速,和参考转速做差,经过PI后输出参考电流,参考电流再送给每相滞环比较器。PI参数没有万能值,我的调试办法是:比例系数先放小,比如0.1,看转速有没有明显上升趋势,再逐步加大到临界振荡再回调。积分时间常数我习惯取转速响应周期的两倍左右,再微调。
注意负反馈方向。有个很坑的点:如果转速PID输出是“正比于电流”,而SRM转矩和电流平方成正比,转速慢了应该加大电流,转速快了应该减小电流,方向搞反模型会直接发散。我在第一次搭闭环时就因为忘了加限幅加负号,转速直接爆炸冲顶,Scope里一片红。
还有一个细节:角度信号的生成。电机模块输出的机械角度要转成电角度,然后和θon、θoff比较器做区间判断。用“mod(theta, 360/三相数)”的办法生成基本相导通区间,再叠加角度偏置。相位偏置按三相分布,A相0度,B相120度电角度,C相240度电角度。这个电角度换算要在模型里专门做一个Gain模块,增益就是极对数。
4. 最容易翻车的调试环节:三条完整排查链路
模型搭完只是开始,真正花时间的往往是把各种诡异问题排查掉。这里把我在调试里踩过的三类典型故障完整写出来。
4.1 现象一:仿真报错“代数环”或卡死不动
第一次把滞环电路和控制链路连起来后,Matlab大概率会提示存在“Algebraic Loop”。原因是电流测量信号经过Relay比较又返回去控制IGBT,而IGBT又直接决定电机电流,Simulink在同一个计算步长内形成闭环依赖,解不出来。
排查链路:
- 双击错误提示,它会高亮显示构成代数环的信号线,看看是不是电流反馈回控制器的路径。
- 在反馈回路里加一个Memory模块,打破同一时刻的依赖关系。比如电流信号采样后先过Memory,再进Relay。
- 如果加了Memory还是报环,就检查功率变换器的IGBT门极控制信号是不是直接引了电机测量信号而没有经过任何延迟。
- 实在不行,把Relay滞环方案换成PWM比较方案:参考电流和三角载波做比较,三角波本身是一个独立信号源,反馈回路不会产生代数环。
调试过程中我还发现过另一种“卡死”不是报错,而是仿真进度条卡在99%。这种情况多半是开关频率太高,求解器在一个周期里反复碰撞开关事件。解决方式是限制Relay滞环最小宽度,或者把求解器从变步长换成定步长1e-6,牺牲一点精度换稳定。
4.2 现象二:电流不降反升、转矩乱跳
看起来像是斩波在正常工作,但电流波形毛刺特别多,转矩输出忽正忽负,转速平稳性很差。这通常不是控制器问题,而是角度设置错误。
我之前在参数面板里把角度单位搞混,开通角设在了电感下降区,结果每个周期先出来一段制动转矩,电流被反电动势顶上去,再靠滞环硬压下来。波形上你会发现电流平坦的区间很短,转矩波形里有明显的负向脉冲。
排查链路:
- 先把开通角设到不对齐位置之前3°左右,关断角设到对齐位置之前5°左右,跑一次开环,看转矩是否全程为正。
- 再把θon逐步前移,看平均转矩是变大还是变小。
- 如果转矩仍然有周期性负值,在Scope里叠加观察电感和电流波形,直接把导通区间和dL/dθ区间对齐检查。
另外,角度单位是个大坑。如果Controller里用的是弧度,但比较器设置数值是按角度写进去的,出来的开通区间会偏得离谱。我的经验是在比较器之前用Gain统一转换,并且用常量“deg”和“rad”的换算值直接在参数里写表达式,比如:
on_angle_rad = deg2rad(5);这样至少角度单位不会弄错。
4.3 现象三:转速稳态偏差与转矩脉动过大
转速闭环跑起来后,转速可能达不到目标值,或者到达后上下波动。先说稳态偏差:如果相比目标转速总是低了一截,优先怀疑电流限幅太小,或者母线电压不够高。SRM的平均电磁转矩取决于电流幅值,电流限幅一顶到天花板,转速自然上不去了。
排查链路:
- 看PI输出是否一直饱和在限幅值。如果是,增大电流限幅,或者提高母线电压。
- 把θoff往前推,减少负转矩段,等效转矩会提升。
- 检查负载转矩设置,SRM起动和重载下确实需要有足够的励磁时间和电流余量。
转矩脉动大是SRM的固有痛点,因为换相过程中,前一相电流还在衰减、后一相电流在上升,两相转矩叠加时出现“塌陷区”,导致瞬时转矩波动。降低脉动的手段主要有:增大电流滞环频率(代价是仿真慢)、调节θon和θoff找最优脉动最小点、或者后一相提前导通搭接转矩。控制策略上还可以用转矩分配函数,这部分我放到后面再说。
5. 从“跑通”到“会用”:结果判读、性能指标与后续扩展
仿真模型终于稳定出波了,这时候不要急着截图保存,应该思考怎么从中提取有意义的数据。一个能跑通的模型,和一份能说服别人的仿真报告,中间还差一步数据分析和性能量化。
5.1 波形怎么读,数据怎么导出
Scope直接看波形最直观,但写总结或论文时需要更精确的数据。我通常把电流、转矩、转速、角度信号用To Workspace模块存到Matlab工作区,采样时间用定步长,比如1e-5秒,存成结构体或者数组,方便后续画图。
看波形时有一个重点:稳态和暂态要分开看。启动瞬间电流会冲到比较高,这是正常现象;真正要分析转矩脉动和平均转矩,应该取转速稳定后的区间。我一般让仿真跑0.5秒,取0.3秒到0.5秒这一段做分析,避开起动调整期。
5.2 转矩脉动系数等评价指标的计算方式
SRM控制仿真里最常用来评估性能的指标是转矩脉动系数和平均转矩。转矩脉动系数的定义为:
K = (T_max - T_min) / T_avg
其中T_max和T_min是稳态区间瞬时转矩的最大值和最小值,T_avg是平均值。K越小,说明转矩越平稳。这个值在不同负载下差异很大,低速重载时电流斩波下K可能达到20%到30%,高速单脉冲时可能更大。如果你做了多个方案的对比,K值是最好的量化依据。
效率计算也很重要。SRM系统效率等于输出机械功率除以输入电功率。如果模型里有直流母线电压和电流测量,可以通过Power Measurement模块测得输入功率,再结合转速和转矩计算输出功率。我做效率对比时,习惯固定输出负载转矩,只是调整θon和θoff,看不同角度组合下的效率变化,那组实验做下来会发现关断角对效率的影响非常敏感,相差几度效率就能掉七八个百分点。
5.3 进一步可以玩的三个方向
第一个方向是转矩分配函数(TSF)。核心思路是,换相时不再让后一相瞬间接管全部转矩,而是按照一个预设函数把总转矩需求分配给前一相和后一相,让合成转矩维持在给定值附近,从而明显降低换相脉动。Simulink里实现不复杂,难点在于TSF函数形式的选择和角度区间的划分。
第二个方向是直接瞬时转矩控制(DITC)。它不再用电流滞环,而是直接对瞬时转矩做滞环,根据转矩误差和转子位置,选择绕组处于励磁、续流、还是零电压回馈状态。这个方向对基本模型改动不大,但理论理解难度更高,适合想深入研究的读者。
第三个方向是参数优化。既然θon和θoff对转矩脉动、效率、电流峰值影响这么大,那就把它们作为优化变量,用遗传算法或粒子群算法在Simulink里做离线寻优。仿真环境做这种优化比较方便,跑几千组也不怕电机损坏。我记得自己早期就是把开通角和关断角在给定范围内扫描了一遍,画了一张效率等值线图,那种直观冲击力比单点仿真强太多了。
我最后想说的是,开关磁阻电机的仿真和其他的最大区别在于,它不是“搭好就完事”,而是每一步妥协和取舍都在考验你对电机物理的理解。建模的时候多回头看看电感曲线,调试的时候多想一步为什么会这样,等你把模型调明白了,这台电机你到底吃没吃透,你心里比谁都清楚。