前阵子一个做课程设计的同学,拿着“BLDC无刷直流电机仿真设计,Simulink转速电流双闭环调速系统”这个题目来问我,说自己把三相桥搭出来了,转速也能转起来,但一加负载波形就开始抖,PI参数来回试了很多组都不对。这种现象我做仿真时也经历过:模型能跑,但跑得不好,根本原因往往是没搞清模型怎么简化、闭环带宽怎么分配、参数按什么逻辑来整定。
这篇文章就围绕BLDC无刷直流电机仿真设计这件事,把Simulink里转速电流双闭环调速系统从建模选择、整体框架、PI整定到波形排查完整捋一遍。适合正在做课程设计、毕业设计、准备毕设答辩,或者刚接触电机控制的工程师。内容偏向“能直接照着做”,同时也尽量把每一步背后的逻辑讲清楚。
1. 建Simulink模型前,先确定BLDC用哪种建模方式更合适
1.1 三种常见建模方式与适用场景
在Simulink里搭BLDC仿真,最常见的路线有三条:直接用Simscape电气库里的现成电机模块、全部用基础模块现场搭、写S函数或Matlab Function做自定义模型。
第一种最快,从库浏览器里拖一个无刷直流电机模块,再接上三相全桥、控制逻辑,一个看起来完整的系统很快就能转起来。但它的缺点是很多中间量被封装了,反电动势波形、相电流的换相过程以及转矩脉动不容易暴露出来。对需要写仿真分析报告、讲清楚原理的同学来说,答辩时容易一问就卡住。适合只想快速看一个整体结果的场景。
第二种最直观,电阻、电感、反电动势源、机械方程都用模块搭出来,每一个量都能拉线观察。但模块数量一多,模型看起来非常乱,而且BLDC的反电动势是梯形波,需要用查表或者分段函数实现,接线和函数设置都麻烦。适合教学演示,不太适合反复调试参数的场景。
第三种是S函数或Matlab Function,把三相电压方程、反电动势函数、机械方程直接写在代码里。模型顶层接口非常简洁,调试参数时只改脚本,不用在模型图里翻找。这也是我印象里课程设计和毕设中用得最多、也最容易控制运行效率的方式。
1.2 我采用的模型:电压方程、反电动势和机械方程
先说清楚BLDC核心的数学表达式,建模时所有工作都是围绕这三组方程展开的。
三相绕组的电压方程可以写成:
u_a = R·i_a + L·di_a/dt + e_a u_b = R·i_b + L·di_b/dt + e_b u_c = R·i_c + L·di_c/dt + e_c
这里的R是相电阻,L是相电感,e_a、e_b、e_c是三相绕组的反电动势。BLDC的反电动势是梯形波,宽度一般是120°电角度,幅值正比于转速,表达式上是反电动势系数和转速的乘积,再乘一个随转子电角度变化的梯形波函数。
电磁转矩方程写成:
T_e = (e_a·i_a + e_b·i_b + e_c·i_c) / ω
但这个写法在转速等于0的时候会出现除零问题,所以仿真里我一般换一种写法,用转矩系数加转子位置函数:
T_e = K_t·(f_a(θ)·i_a + f_b(θ)·i_b + f_c(θ)·i_c)
机械方程是:
J·dω/dt = T_e - T_L - B·ω
J是转动惯量,B是阻尼系数,T_L是负载转矩。速度反馈直接由ω积分得到,转子电角度θ也由ω积分得到,只是记得θ要按极对数换算。
1.3 为什么不建议直接套用正弦PMSM模型
有人做BLDC仿真时直接拖一个永磁同步电机模块,再用SPM的dq控制方式去跑。这样系统也能转,但严格来说已经不是BLDC六步方波控制的本意了。
BLDC的理想反电动势是梯形波,控制方式通常采用120°两两导通、每60°电角度换相一次,电流波形更接近方波。PMSM模块内部走的是正弦反电动势和旋转坐标系解耦,把两者混在一起虽然波形宏观上很像,但换相带来的转矩脉动、反电动势换相拐点这些关键特征都被抹掉了。
对做“BLDC无刷直流电机仿真设计”这个主题的人而言,我建议至少要意识到这个差别。如果只是为了练双闭环思想,用PMSM模型并不是不能用,但如果论文里写明研究的是BLDC,独立建模更稳妥。我也见过有人为了省事,在S函数里直接用正弦反电动势,答辩被问到梯形波特征与自己模型不一致时很尴尬,这是能避则避的。
2. 双闭环系统的整体框架:信号从转速给定到PWM是怎么串起来的
2.1 双闭环在结构和时间尺度上的分工
电流环和转速环是典型的串级控制结构。转速环在外面,电流环在里面。为什么必须把电流环放在内层?因为电流环控制的电气量变化更快,响应时间在毫秒级甚至更短,转速环控制的机械量变化慢,响应时间通常是几十毫秒甚至几百毫秒。内环必须比外环快,外环输出一个电流指令之后,内环要能近似立即跟踪上,整个系统才稳定。
电流环最直接的作用就是把电枢电流限制在安全范围。电机启动瞬间转速偏差很大,外环会直接把输出打到限幅值,如果只有转速单闭环,这个时候电枢电流可能冲到几十倍额定值,电源模块和绕组都受不了。有了内环对电流的限制,系统启动过程就变成恒流加速:电流稳定在限幅值附近,转速平稳上升,等转速接近给定值,外环从饱和区退出来,电流再逐步回落。
转速环负责稳态精度和抗负载扰动。负载转矩突变导致转速下降时,外环会加大电流指令来补偿转矩,让转速恢复。它的输出不能直接接PWM,因为PWM控制的是电压量,而BLDC的机械特性决定了电流变化能快速反映转矩变化,所以外环输出的是电流给定信号。
2.2 顶层模块清单与信号连接顺序
我在Simulink里的顶层结构大致是一条单向信号链,外加反馈回路。从转速给定开始,经过比较器、转速PI控制器、限幅环节,输出电流参考;电流参考与实测相电流比较后进入电流环PI,输出经过换相逻辑映射给三相桥臂,驱动三个相电阻电感;电机模块输出转速反馈、电流反馈和转子角度。
给一个模块清单做参考:
| 模块 | 作用 | 关键设置 |
|---|---|---|
| 转速阶跃给定 | 设定目标转速,可以是常数或阶跃 | 注意目标转速单位 |
| 转速PI+限幅 | 稳态精度、抗负载扰动,输出电流参考 | 输出限幅设为允许最大电流 |
| 电流PI+限幅 | 快速跟踪电流参考,限制电流 | 输出限幅设为占空比或电压范围 |
| 换相逻辑 | 由电角度确定导通相和方向 | 用查表或状态机实现 |
| BLDC电机模型 | 三相电流、反电动势、转速、角度 | 参数在m脚本中统一设置 |
| 示波器组 | 观察转速、三相电流、反电动势、占空比 | 建议用To Workspace保存 |
接线时务必注意单位问题。转速环输出是安培(A),电流环输出是电压(V)或占空比(0到1),每个环节的限幅范围要按实际物理量设置。很多模型跑出来转速曲线正常但数值大得离谱,往往是转速单位在rad/s和rpm之间混用,或者电流限幅没有跟上额定参数。
2.3 电流环的两种实现:三相PI选通与滞环控制
BLDC六步换相过程中任意时刻只有两相导通,第三相悬空,所以电流环的具体实现有两种常见做法。
第一种是我比较推荐的“三相PI选通”。只设置一组PI参数,但电流误差的计算对象随扇区切换。比如某个时刻A相高侧导通、B相低侧导通,那么就把电流参考与A相电流或母线电流比较,PI输出作为导通两相的端电压命令,第三相赋值为0。换相查表每60°电角度更新一次导通相组合。这种结构贴近经典双闭环教材,PI整定的思路可以直接迁移到实物控制。
第二种是滞环电流控制。不再用连续PI输出占空比,而是把电流误差与一个滞环带宽做比较,误差超上限就关断功率管,低于下限就导通。这个方法实现起来最简单,开关频率不固定,但电流波形跟踪效果直观。由于开关频率不固定,Simulink里仿真步长需要设得足够小,否则滞环比较抖动明显。
两种方式我都跑过,如果目标是展示“转速电流双闭环调速系统”,第一种更容易把电流环PI的物理意义讲清楚,所以下面参数整定也以它为默认方案。
3. PI参数整定顺序与一组可直接起步的初值
3.1 电流环PI的近似推导
电流环整定是整个系统的地基。实践里应该分两步走,先把电流环当作独立系统调稳,再带上转速环。如果把两个环一起调,波形一乱根本不知道问题出在哪层。
电流环的对象是绕组,忽略反电动势产生的耦合后,相电流对端电压的关系近似为一阶惯性环节。PI控制器的传递函数写成kp + ki/s,它能提供一个零点,用来对消电气对象极点。取PI零点与绕组极点对消,即:
ki / kp = R / L
那么电流环闭环可以近似成一阶低通,其带宽约等于kp / L。反过来,给定电流环期望带宽ω_c之后:
kp = ω_c · L ki = ω_c · R
这个公式推导起来很简单,却能直接给出一组能用的初值。设L = 5e-5 H,R = 0.02Ω,期望电流环带宽2000 rad/s,那么kp = 0.1,ki = 40。带宽取多少要看PWM开关周期和采样周期,一般电流环带宽取PWM频率的1/20到1/10比较安全,取太高会导致数字离散化误差明显。
3.2 转速环PI的工程粗调思路
转速环对象是机械方程,转动惯量J的存在使转速对转矩呈现积分特性。电流环被整定好之后,可以看成是一个快速的一阶环节,这样转速环面对的近似对象就是积分加小惯性,更适合用“按带宽比例粗调,再看阶跃响应微调”的方式。
工程上我会先取转速环带宽为电流环带宽的1/10左右。转速环的kp初值按J乘以ω_n计算,积分时间常数初值按电流环等效时间常数的4到10倍来给。Simulink里波形转起来之后,再用超调量和调节时间做微调:超调大,就减小kp或增大ki的积分时间;恢复太慢,就增加kp或减小积分时间。
转速环整定比电流环更依赖手动经验,因为机械阻尼、负载特性都可能变。我通常先在m脚本里算一组理论初值,然后在Simulink里跑阶跃启动波再微调。千万不要一上来就追求“一次算准”,串级系统里理论初值只负责“能跑”,手感负责“跑得好”。
3.3 限幅和抗积分饱和
双闭环系统里,限幅是不可或缺的部分。转速环输出如果允许跑到上千安培,电流环再强也会被直接打穿;电流环输出如果不限幅,占空比设成好几倍,PWM计算完也是无效输出。
但限幅会带来积分饱和问题:PI输出被限幅以后,误差仍然存在,积分项会继续累积,等误差反向时输出还停留在饱和值上,于是出现“该刹车时还在加速”的现象。Simulink的PI控制器模块里可以配置anti-windup,采用back-calculation方式,反馈系数一般取1到10。我在双闭环系统里都会把抗饱和打开,否则启动过程几乎一定会出现电流超调。
转速外环更需要抗饱和:启动阶段外环输出维持在最大电流限幅值,转速一旦超过给定,外环要从饱和中退出来,这个过程如果积分饱和严重,转速会冲过给定很多,调节时间明显拉长。串级系统是否稳定,很大程度就看这个退饱和过程干不干净。
3.4 一组示例参数与m脚本
直接给一组可以起步的示例参数,电机参数单位全部用SI。
% BLDC双闭环初始参数 R = 0.02; % 相电阻 Ω L = 5e-5; % 相电感 H Ke = 0.012; % 反电动势系数 V/(rad/s) Kt = 0.012; % 转矩系数 Nm/A J = 1e-4; % 转动惯量 kg·m^2 B = 5e-6; % 阻尼系数 Nm·s/rad Vdc = 24; % 母线电压 V Imax = 10; % 最大电流限幅 A % 电流环带宽,单位 rad/s wc_i = 2000; kp_i = wc_i * L; ki_i = wc_i * R; % 转速环粗调初值 wc_n = wc_i / 10; tau_n = 4 / wc_i; kp_n = wc_n * J; ki_n = kp_n / tau_n; fprintf('电流环 kp=%.4f, ki=%.4f\n', kp_i, ki_i); fprintf('转速环 kp=%.4f, ki=%.4f\n', kp_n, ki_n);这组参数不是最优解,但能让模型稳定转起来,然后你再用阶跃响应微调。我实测下来,把电流环带宽从2000调到3000,启动电流的峰值会略降但振荡风险上升;转速环kp加倍后动态速降变小,但超调也可能变明显。调参时一次只改一个量,改完跑一组波形存下来对比,不要同时动好几个参数。
4. 仿真跑飞、振荡、静差的排查链路
4.1 代数环报错:原因和最小代价解决方案
Simulink里双闭环模型最常见的第一个报错就是Algebraic Loop。代数环的本质是模型中存在一个瞬时反馈路径:信号从某个模块输出,没有经过任何连续动态环节或单位延迟就绕回自身输入。
BLDC模型中出现代数环,常见位置是反电动势计算环节。转速、电流、端电压之间如果在一个计算步内互相依赖,Simulink就检测到代数环。之前我遇到一次,是在S函数里把反电动势写成直接把端电压代入电流导数的形式,而端电压的分配又依赖当前电流方向,绕了一圈就成代数环了。
排查代数环,先看Simulink诊断信息里标出的模块位置。最简单的处理方法是把反电动势计算延迟一拍,比如在换相逻辑和电流指令之间加一个Memory块,或者在反馈通道里用单位延迟。物理上这相当于采样滞后,只要延迟时间远小于电气时间常数,对结果影响很小。另一种彻底一点的办法是用连续状态建模,让电流和转速都成为状态量,避免纯代数依赖。
4.2 高频振荡:先怀疑仿真配置而不是PI参数
波形出现高频振荡时,很多人第一反应是去调PI,但实际上更常见的原因是仿真步长和PWM频率不匹配。固定步长设得太大会导致PWM开关动作在一个步长里被平滑掉,PI离散化误差被放大,波形看起来就像振荡。
我给这类模型的排查顺序是先看步长。PWM开关频率如果是10kHz,周期就是1e-4秒,固定步长建议至少取1e-6到5e-6秒,否则PWM边沿的宽度都看不出来。然后是PWM比较方式,连续PI输出经过PWM调制时,如果直接把PI输出当作端电压而不是按母线电压做占空比换算,那高频振荡也在所难免。
电流环PI参数不太离谱的情况下还振荡,可以尝试降低带宽。电流环响应越快,对模型离散化误差和换相瞬间尖峰越敏感。很多人把一个看似“性能更好”的大带宽值填进去,结果反而崩了,就是这个道理。
4.3 转速静差和转矩脉动:单位、极对数与换相表
转速静差消不掉,先怀疑外环积分作用不够,再怀疑单位不一致。比如机械方程里转速按rad/s积分,但示波器里你按rpm显示,两者数值差将近60倍。我调试时遇到过转速始终差一大截的情况,查到最后是电机模型里转速状态是电角速度,而反馈没有除以极对数,导致换相频率、反电动势幅值全部翻倍。
BLDC的极对数在仿真中很容易被忽略。转子机械角度和电角度之间要乘极对数,反电动势和换相表都是按电角度转的。极对数设错,换相点就错位,反电动势和电流相位对不上,转矩脉动会非常剧烈,转速波形出现周期性毛刺。
换相表本身也要核对扇区顺序。BLDC有正反转之分,霍尔逻辑或角度区间定义不同,换相顺序就不同。如果只做了顺时针的换相表,当负载把转速反向拖过去时,模型会乱。这种问题仿真中常见,表现就是转速稳定后转矩脉动突然变大,电流波形在换相点出现尖峰。
4.4 排查顺序:把系统拆到最小闭环再逐层恢复
调试双闭环模型最容易迷路的地方在于太多信号同时变化。我的习惯是拆成几级来排查。
第一步,把换相逻辑固定,给定一个恒定的导通组合,只观察电机单电流响应,确认电机模型和电压方程正确。第二步,单独加电流环,给定阶跃电流参考,看电流能不能无静差跟踪,这一步要是都稳不住,就只调电流环PI。第三步,加转速环,给定恒速参考,观察启动过程和稳态。第四步,再加负载阶跃。
这套顺序看起来慢,但每一次出现异常,变量都被压缩到了最小范围。我见过很多同学一次性把整个系统跑起来,波形不对就开始乱调PI,绕了很久才发现是换相表写错了位置。把闭环拆开调试,看起来多花了时间,实际上是最快路径。
5. 用波形评价调速性能:启动、负载突变和稳态指标怎么看
5.1 启动过程:电流限制与“退饱和”
评价转速电流双闭环调速系统,第一张要看的图就是启动波形。把转速给定设为阶跃,观察转速和电流两条曲线。
理想的启动过程是:电流迅速冲到限幅值并保持一段时间,转速近似线性上升;当转速接近给定值时,电流从限幅值回落,转速曲线平滑逼近目标。如果电流刚启动就来回震荡,说明电流环动态不够稳,先回第4章检查内环。如果转速上升后期明显变慢,或者提示“退饱和”过程拖泥带水,重点检查转速环抗积分饱和设置。
电流限幅值本身就是一个系统设计指标,它决定了最大启动转矩。启动过程其实是“电流源加速”过程,限幅值设多大,就决定了最大加速度和时间。示波器里看一眼启动电流有没有超过限幅,能够快速判断内环是否失真。
5.2 突加负载:动态速降和恢复时间
双闭环的核心性能在负载突变时最能体现。仿真中可以使用一个Step模块,在转速稳定运行后(比如0.2秒)叠加一个负载转矩阶跃,观察转速的动态降落和恢复时间。
如果转速明显下跌后能很快恢复到家值,说明转速环积分作用有效。如果转速恢复很慢,可以增大转速环ki。如果动态速降太大,且恢复过程中有振荡,一般是转速环带宽和相位裕量不足,可以适当增大转速环kp并减小积分时间,再观察。
动态速降多少算合格,取决于任务要求。很多课程设计里,负载突变后转速恢复时间在几百毫秒内,动态速降不超过5%,就算比较理想。这个数字要在报告里写清楚,并且和波形对应起来。示波器建议把转速曲线、电流曲线、负载曲线放在同一个图中观察,时间轴对齐才能看出因果关系。
5.3 稳态精度和转矩脉动率:常见指标表
稳定运行阶段,要检查转速是否存在静差,电流波形是否平稳,反电动势与电流的相位关系是否合理。
| 指标 | 含义 | 常见评价方式 |
|---|---|---|
| 稳态转速误差 | 运行稳定后给定与实际转速的差 | 相对误差百分比 |
| 调节时间 | 启动或扰动后进入5%误差带的时间 | 从波形读出 |
| 电流峰值 | 启动或突变过程中的最大相电流 | 应低于限幅值 |
| 转矩脉动率 | (Tmax - Tmin) / 平均转矩 | 越高越接近真实BLDC特征 |
BLDC方波控制的转矩脉动本身就比正弦PMSM大,这是正常的。如果你的仿真里转矩脉动小到几乎为零,反而说明模型里丢失了换相过程,用了理想正弦模型。波形里有周期性脉动不一定代表模型错误,需要结合换相点位置判断。
6. 从仿真到实物前还差几步:容易忽略的边界条件
6.1 加入功率管压降和死区
纯仿真的三相桥是理想开关,导通压降、开关死区、续流二极管压降全部被忽略。这三个因素在低速、低压工况下影响非常大。
功率管导通压降会让实际作用在绕组上的电压比指令低,低速时占空比本身很小,压降占比就很大。死区会影响换相时刻的电流流通路径,导致相电压畸变,换相转矩脉动变大。仿真里如果之后要移植到实物,强烈建议先把这两个因素以近似模块加进模型里,否则在仿真上调好的参数,在实物上往往会有明显偏差,而且表现为电流波形畸变。
在Simulink里实现也不难:PWM输出经过一个饱和和延迟模块模拟死区,功率管支路串联一小段压降模型。这些改动会让模型更接近真实,也让报告里的分析更有说服力。
6.2 采样延迟和低速换相处理
实物系统里电流采样和转速采样都有固定时间延迟,仿真里如果是连续状态模型,采样的离散噪声就体现不出来。做控制器离散化时,采样延迟会降低相位裕量,等效于闭环带宽上限变小。所以想认真做控制器参数的,建议把PI控制器模块用离散PID实现,并设置一个与实际控制频率一致的采样时间。
低速运行时,换相时刻的分辨率对转子位置检测精度极敏感。仿真里可以通过连续积分得到精确角度,看起来一切正常;但实物如果只靠霍尔信号,一个霍尔码表周期是60°电角度,在低速下位置更新频率很低,换相精度会下降。仿真里想提前验证这个问题的,可以在位置反馈通道加一个量化模块,模拟霍尔分辨率。这样能看出低速下的转速波动是否还在可接受范围。
6.3 调参心态:仿真里最容易忽略的是“物理量单位”
整个项目做完,我发现身边人出问题最多的地方其实不是算法,而是物理量单位不统一。转速用rad/s定PI,示波器却用rpm显示;反电动势系数取线间值还是单相值;极对数有没有乘进去。这些细节错一个,波形表现出的症状完全不同,但都不容易立刻发现。
我的习惯是把所有单位写进m脚本注释里,模型里的每个增益模块都标上单位变换关系。调试过程中每改一次电机参数,就重新跑一遍整定脚本,不手动去改Simulink里埋着的常量。这样既保证参数整定过程可复现,也方便答辩时直接展示参数来源。
双闭环调速系统是一个入门门槛不高、但做到稳定可靠需要付出不少耐心的仿真项目。只要建模方式选对、内环外环顺序调定、限幅与抗饱和处理到位,大部分问题都能在波形中找到明确答案。希望这篇文章能把你在Simulink前发愣的时间压缩一点。