
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里做离线寻优。仿真环境做这种优化比较方便跑几千组也不怕电机损坏。我记得自己早期就是把开通角和关断角在给定范围内扫描了一遍画了一张效率等值线图那种直观冲击力比单点仿真强太多了。我最后想说的是开关磁阻电机的仿真和其他的最大区别在于它不是“搭好就完事”而是每一步妥协和取舍都在考验你对电机物理的理解。建模的时候多回头看看电感曲线调试的时候多想一步为什么会这样等你把模型调明白了这台电机你到底吃没吃透你心里比谁都清楚。