很多人在后台问我:永磁同步电机(PMSM)的直接转矩控制(DTC),为什么MATLAB仿真里搭出来了,转矩曲线却不干净?转速外环和转矩、磁链内环到底怎么配合才算"控住了"?
这个题目我前后鼓捣了好几周。从最早的查表式DTC,到后来加占空比调制的改进方案,一步步把转速外环、转矩滞环、磁链滞环、开关表、磁链观测器全部在Simulink里复现了一遍。我尽量把整套建模过程、参数整定思路,以及最头疼的转矩脉动问题怎么压下去,都摊开讲清楚。这篇文章适合已经在做电机控制仿真、或者准备用MATLAB完成DTC课题的人,内容从控制结构拆到底层排查都有,希望能帮大家少走一点弯路。
1. PMSM直接转矩控制的整体逻辑:转速环在外面,转矩和磁链环在里面的原因
1.1 从电机方程看,为什么DTC把磁链和转矩当成两个直接控制目标
要搞懂DTC,最好先把PMSM的电磁转矩表达式拿出来看一遍。对于表贴式永磁同步电机,忽略凸极效应后,电磁转矩可以写成:
Te = 1.5 × p × ψ_f × i_q
也就是说,转矩大小基本由交轴电流和永磁磁链决定。但在定子磁链定向的视角下,还有另一种更直观的表达式。把定子磁链ψ_s和转子磁链ψ_f的夹角记为δ,那么:
Te = 1.5 × p × (ψ_s × ψ_f / L_s) × sinδ
这个式子非常关键。它告诉我们,只要把定子磁链的幅值保持恒定,转矩就近似只和负载角δ相关。DTC的思路从这里就清楚了:不再去调节电流,而是直接控制"定子磁链幅值"和"转矩大小",因为控制了磁链幅值,转矩就等于控制了定、转子磁链之间的夹角。这就是为什么DTC内环要做成"磁链环 + 转矩环"两个并行滞环结构,而不是像FOC那样把电流环放在内层。
转速外环就比较传统了。用户给一个转速参考,转速环PI输出转矩指令Te_ref,给到内环作为目标值。把转速环放在最外面,是因为转速是系统的"最终性能指标",转矩则是实现这个指标的直接手段。这种外环转速、内环转矩/磁链的级联结构,本质上和FOC的转速-电流级联相同,只不过内环的控制对象和控制方式完全不同。
1.2 滞环比较器加开关表,为什么传统DTC不需要调制器
大多数初次接触DTC的人都会有一个疑问:为什么FOC后面要接SVPWM,而DTC却直接输出六个开关管的脉冲?
答案在于滞环比较器。以转矩内环为例,转矩误差Te_err = Te_ref - Te,经过一个两电平滞环比较器后,输出只能是两个状态:误差在上边界以上,输出"增大转矩"标志1,误差在下边界以下,输出"减小转矩"标志0,误差在滞环带内则保持上一个状态。磁链环也类似,输出的是"增大磁链"或"减小磁链"标志。这两个标志共同决定一个控制周期内应该选用哪个电压矢量。
后半部分的开关表,本质上是根据定子磁链所在扇区,从逆变器八个基本电压矢量(六个有效矢量V1到V6,两个零矢量V0和V7)里挑一个最合适的。比如定子磁链在扇区I的时候,如果要同时增大磁链和增大转矩,经典开关表会选择V2(110);如果磁链偏大但转矩偏小,可能选择V3(010)。这样一个周期内最多只需要一次查表,完全不需要PWM调制器,实现结构非常简洁。
1.3 传统DTC的优缺点,以及为什么争议都在转矩脉动上
把这种结构看清楚以后,优缺点也自然浮出水面。优点相当明显:动态响应极快,转矩能够在很短的控制周期内到达目标,理论上比FOC更快;结构简单,不依赖精确的转子位置,只需要磁链角参与扇区判断;对电机参数依赖相对小,主要是定子电阻参与了磁链估算。
缺点也很致命,就是标题里那句"转矩脉动"。滞环比较器的工作特性决定了开关频率不固定,逆变器在低转速、轻负载工况下开关频率会明显下降,转矩波形天然带有锯齿状的脉动。再加上扇区切换时刻电压矢量的跳变、零矢量作用期间磁链幅值的缓慢衰减,都会在转矩曲线上留下周期性毛刺。后面我会专门讲这个问题的仿真级解决方案,这部分先记住结论:转矩脉动不是某个参数调错了,而是传统DTC的结构性弱点,必须在控制器层面做改进。
2. Simulink里的DTC仿真建模:模块划分与核心参数设置
2.1 模型顶层架构怎么搭
我在Simulink里搭的DTC模型,顶层一共分成五块:PMSM本体模块、逆变器模型、坐标变换与状态估算模块、滞环控制与开关表模块、转速外环PI模块。
信号流向大概是这样的:转速参考和实际转速送入PI,输出Te_ref,经过限幅后进入转矩滞环比较器;电机的三相电流和直流母线电压送入坐标变换与观测器,得到定子磁链在αβ轴的分量,进而算出磁链幅值和扇区;磁链幅值跟磁链参考做差,进磁链滞环;两个滞环输出加上扇区编号,一起进开关表查表,最终生成六个开关管脉冲驱动逆变器。
这套架构既适合经典查表式DTC,也方便后续替换成占空比调制或模型预测方案。建议刚开始搭的时候不要直接优化结构,先按最经典的两电平滞环查表式DTC搭通,确认磁链圆、转矩波形都是预期形态,再逐步改块。
2.2 电机与逆变器的选型要点
PMSM本体我建议直接用库里的电机模型,块名一般是PMSM或者对应版本的永磁同步电机模型。原因很简单:库模型内部已经实现了完整的d-q方程、反电动势计算和机械方程,我们关心的是控制策略本身,没必要再用Simulink基本模块重新写一套电机方程,那是另一门课程的任务。
唯一要提醒的是,库模型默认的理想正弦反电势模型,不会体现齿槽转矩、饱和等真实电机效应。这意味着仿真里看到的转矩脉动纯粹来自控制策略,不是电机本体特性。如果你想让仿真更接近实际,需要额外给转矩输出叠加一个齿槽转矩分量模型,或者改用有限元数据插值的方式。大多数做算法验证的场景不需要这个环节。
逆变器部分,我推荐用Three-Phase Bridge这样的理想开关模型,门极信号直接由DTC开关状态驱动。母线电压就用恒定直流源。死区时间在这个阶段可以设为零,因为死区效应主要影响电流谐波和低速转矩品质,对验证DTC算法逻辑不是必需项。若后续要在实验结果和仿真结果之间做对照,再补上死区时间,同时把开关管的导通压降也加上。
2.3 定子磁链观测器的实现与积分漂移对策
磁链观测是整个DTC仿真中最容易出问题的一环。我这里用的是电压模型:
ψ_sα = ∫(u_sα - R_s × i_sα) dt ψ_sβ = ∫(u_sβ - R_s × i_sβ) dt
电压模型的好处是结构简单,只需要定子电阻和反电动势积分。但纯积分器有两个致命问题:一是初始值不确定,二是积分漂移。仿真里如果积分器初值设为零,而电机初始磁链并不为零,启动瞬间磁链圆会歪掉,紧接着开关表选错扇区,整个系统可能发散去。
我的做法是给积分器换成"带反馈校正的准积分器",也就是在纯积分环节旁边并联一个低增益反馈通道。核心公式近似为:
ψ_sα = 1/(s + ω_c) × (u_sα - R_s × i_sα)
这里的ω_c选得很关键,通常取基波角频率的0.2倍左右。太低则滤不掉直流漂移,太高则会产生明显的相位和幅值偏差。仿真中固定转速工况下,可以先用低通型公式跑通,再评估磁链圆的形状是否正常。顺便提一句,低速工况下反电动势幅值小,电压模型误差占比急剧上升,此时更可靠的做法是切换成电流模型,利用转速和电感和转子磁链来估算定子磁链。
2.4 转速环PI参数与滞环带宽的整定逻辑
转速外环的设计,我用的是常规PI加输出限幅。控制对象简化为一阶机械方程,J × dωm/dt = Te - TL,所以PI参数可以按期望闭环带宽来打底。比如我仿真用的样机参数,转动惯量J = 0.0018 kg·m²,极对数p = 4,永磁磁链ψ_f = 0.125 Wb,额定转矩接近7 N·m。期望转速环带宽设在10~20 rad/s左右,那么Kp可以先按J × ω_c / (1.5 × p × ψ_f)来估算,得到大概0.6的量级,再配上Ki ≈ Kp × ω_c / 4到Kp × ω_c / 2之间的数值,后面根据阶跃响应微调。
滞环带宽的经验值我总结如下表,直接在仿真里按这个区间试就行:
| 参数 | 推荐范围 | 我的最终取值 | 说明 |
|---|---|---|---|
| 转矩滞环带宽 | 额定转矩的2%~5% | ±0.3 N·m | 太小开关频率过高,太大脉动明显 |
| 磁链滞环带宽 | 额定磁链的1%~3% | ±0.0035 Wb | 磁链额定值约0.125 Wb |
| 转速环限幅 | 额定转矩的1.2~1.5倍 | ±8 N·m | 防止启动电流过冲 |
| 采样/控制周期 | 5e-5 s ~ 1e-4 s | 5e-5 s | 等效开关频率受此限制 |
这里有个容易忽略的点:Simulink里的离散滞环比较器模块必须统一采样时间。如果你用了多个采样时间的离散模块混在一起,没加单位延迟的地方很容易报出代数环,波形看起来正常但实际运算时序混乱。建议一切控制相关离散模块都用同一个Ts,电机本体用连续模型,两者之间通过zero-order hold衔接。
3. 转矩脉动到底从哪里来:仿真波形背后的三个根源
3.1 扇区切换时的电压矢量跳变
转矩脉动最直观的来源,是磁链扇区边界处的电压矢量切换。传统DTC把360°的电角度分成六个60°扇区,每个扇区里电压矢量的选择组合是固定的。当定子磁链扫过扇区边界时,开关表会让电压矢量从某一个直接跳到另一个,这个切换在理想情况下是瞬时的,但电压矢量的方向变化并不连续。
结果就是磁链轨迹上出现一个棱角,转矩曲线上出现一个周期性的尖峰。磁链转速越高,每个扇区扫过越快,这个尖峰的频率等于六倍基波频率,所以你在频谱分析里很容易看到6、12、18等6的倍数次谐波分量。要降低这一部分脉动,思路要么是缩小扇区角度(比如改成十二扇区),要么是用连续调制的方式平滑切换电压矢量。
3.2 一个控制周期内单一矢量作用时间过长
第二个根源来自控制周期和滞环的配合。假设转矩误差刚越过滞环上边界,开关表选了一个"增大转矩"的有效矢量。在理想情况下,我们希望这个矢量的作用时间刚好让转矩达到目标值就停止。但传统DTC做不到这点,它在一个控制周期内从开始到结束都施加同一个电压矢量,等到下个采样点才发现转矩已经过头了。
作用时间过长带来的就是转矩超调和欠调交替出现,在波形上表现为锯齿状脉动,锯齿的幅度与控制周期、逆变器母线电压成正比。这也是我后来改占空比DTC的核心动机——把"整周期单矢量"改成"有效矢量作用d×Ts,零矢量作用(1-d)×Ts",让转矩增量在一个周期内正好补上缺口,超调能大幅收窄。
3.3 零矢量对磁链幅值的隐性消耗
第三个根源特别隐蔽,很多人在仿真里看到转矩波形正常但磁链圆半径慢慢缩小,最后磁链环频繁动作,开关表也跟着乱,基本就是这个问题。
传统开关表在"减小转矩"时通常选择零矢量。零矢量作用下定子电压为零,磁链方程只剩电阻压降项,磁链幅值会缓慢衰减。如果转矩滞环带宽设置得很宽,零矢量作用时间变长,磁链幅值会被"偷走"不少,系统为了把磁链拉回来,又不得不选一个大幅增加磁链的电压矢量,此时转矩增量也可能同时变大,形成一次低频率的转矩冲击。
用生活化的方式理解:有效矢量是油门,零矢量是滑行。转速(转矩)高的时候我们需要滑行来减速,但滑行太久了车子的能量(磁链)也会掉,后面再给油时,加速度就会往前窜一下。DTC想同时管住转矩和磁链,就得在滞环带宽、矢量选择策略上做平衡。
4. 仿真中直接能用的降脉动方案:三电平滞环与占空比DTC
4.1 三电平滞环加扇区细分,改动最小见效最快
如果你的课题只需要把转矩脉动降下来一点,不改控制大框架,那么三电平滞环是最保守但实用的选择。
两电平滞环的转矩比较器只有"增大/减小"两个状态,三电平则在中间加了"维持不动"状态,等于把滞环分成几个不同的输出等级。比如误差超过正阈值输出+1,在正负阈值之间输出0,低于负阈值输出-1。开关表需要同步扩展成三档转矩选择,磁链也可以做成两电平或三电平。
扇区细分也很简单,把六个扇区改成十二个扇区,每个扇区30°,电压矢量的选择更靠近理想方向。这两种手段组合后,电压矢量切换的突兀感会明显减小,我实测转矩脉动峰峰值大约能降20%~30%,开关频率也更稳定一些。代价是开关表行数变多,查表逻辑稍微复杂一点,但仿真里无非就是多写几个case分支,难度不大。
4.2 占空比DTC:固定采样周期内插入零矢量的实现方案
真正想看到转矩脉动显著下降,我会推荐做占空比DTC。它的基本思想是每个控制周期Ts内,先让选定的有效电压矢量作用d×Ts时间,再用零矢量作用(1-d)×Ts时间,通过调节d让转矩增量正好到达参考值附近。
在线计算占空比的手段有好几种,最简单的做法是查表。预先离线计算不同转速、不同转矩误差、不同磁链角下,使转矩增量等于误差所需的d值,做成一维或二维表格;仿真时根据当前工况查表得到d。我在Simulink里偷懒,直接用一个小型MATLAB Function实时计算d:
function d = calc_duty(Te_err, dTe_max, dTe_min) % 假设有效矢量作用时转矩斜率为dTe_max,零矢量作用时转矩斜率为dTe_min % 目标:一个周期内转矩增量恰好等于Te_err if Te_err > 0 d = Te_err / (dTe_max * Ts); else d = -Te_err / (dTe_min * Ts); end d = min(max(d, 0), 1); end这个写法只是个示意,实际使用时要让dTe_max和dTe_min根据当前磁链位置、转速实时估算,否则精度受影响。更精确的做法是在线预测每个候选矢量的转矩变化率,从中选最优d。仿真中有一个非常实用的简化方式:用两个周期并行计算,前半周期给有效矢量脉冲,后半周期给零矢量脉冲,最后把两路门极信号相加,即可通过一个PWM信号发生器输出。
占空比DTC的仿真效果会非常直观:转矩锯齿从明显的大幅锯齿变成高频小幅波纹,脉动峰峰值往往能降到传统DTC的一半以下。代价是控制代码量多了一截,而且需要额外调d的计算参数,对初学者稍微不友好。
4.3 模型预测DTC作为进阶方向
如果你不满足于占空比,还可以考虑模型预测转矩控制,也就是MPTC。它的思想是在每个控制周期,把逆变器所有可能的状态(单矢量方案8种,双矢量方案更多)都代入电机模型,预测选择电压矢量后的下一时刻磁链和转矩,再通过一个代价函数挑出最优矢量。
MPTC对转矩脉动的抑制效果通常比占空比DTC更好,尤其擅长处理约束和多目标优化,但它的计算量也高,纯仿真里无所谓,如果以后要移植到单片机,就得考虑存算资源和采样频率的取舍。三种方案在仿真里的特性对比如下,数据是我同一套样机参数下做出来的典型值,仅供参考:
| 方案 | 转矩脉动峰峰值(稳态) | 响应时间(典型) | 开关频率特征 | 实现难度 |
|---|---|---|---|---|
| 传统两电平DTC | 约1.0~1.2 N·m | 约1~2 ms | 不固定,波动大 | 低 |
| 三电平滞环 | 约0.7~0.9 N·m | 约1~2 ms | 略有改善 | 低 |
| 占空比DTC | 约0.4~0.6 N·m | 约1~2 ms | 固定 | 中 |
| 模型预测MPTC | 约0.3~0.5 N·m | 约0.5~1 ms | 固定或近固定 | 高 |
注意,这些数值受滞环带宽、控制频率、母线电压影响很大,不要直接拿我的参数去压你的数据,方向对了才是最重要的。
5. 调试DTC仿真时最容易踩的坑:五种异常现象与排查思路
5.1 磁链圆从圆滑曲线变成多边形甚至内六边形
如果你把磁链轨迹画出来,发现它不是圆润的圆,而是一个明显的多边形,特别是内凹成六边形,第一件事不是去看控制器,而是查母线电压和磁链参考。
原因通常是两个:一是磁链参考值设置得超过了电机在该转速下的电压极限,导致定子磁链实际达不到参考值,滞环持续输出"增大磁链",电压矢量长期处于饱和约束下,磁链轨迹就被拉成多边形。二是转矩环或磁链环的限幅过于紧张,导致有效矢量作用时间占比过高。排查时先看滞环输出的动作频繁程度,如果增大磁链的标志长时间为1,就说明磁链控制已经饱和了,要减小磁链参考或者提高母线电压。
5.2 启动瞬间磁链圆错乱,转矩震荡甚至反转
启动阶段的异常,我踩过很深。现象是转速没上去,转矩波形先剧烈振荡,磁链圆从零开始画出一个歪七扭八的轨迹,严重时直接跑飞。
根因基本都在磁链观测器的初值上。库里的PMSM模块有初始转子位置,但电压模型积分器的初始磁链分量通常默认是0,二者对不上,导致第一阶段估算出来的磁链角和实际磁链方向差得离谱,开关表自然选错矢量。
解决办法是给积分器赋初值。在启动前先把转子位置对齐到某个已知角度,然后按照ψ_sα = ψ_f × cos(θ)和ψ_sβ = ψ_f × sin(θ)给积分器设置初始值。如果用的是准积分器,最好先把控制器断开,单独让电机空载运行一小段,让观测器收敛到正确的磁链圆后再切入DTC控制,这个"预运行校准"的方法在工程上很常用。
5.3 转速环PI输出饱和导致的启动电流尖峰
转速环PI的输出若直接接到转矩滞环比较器,必须要加限幅,而且限幅值要和电机的峰值转矩能力匹配。我有一次把速度环限幅设成了额定转矩的五倍,启动时转矩指令直接冲顶,电流尖峰高得离谱,磁链观测也因为强电流谐波开始漂移,整个系统带崩。
限幅设计建议是:额定转矩的1.2~1.5倍作为临时加速转矩裕量,稳态时PI输出自然落到负载转矩附近。除了幅值限幅,PI的积分饱和也要处理,Simulink里用带Anti-Windup的PI控制器模块,或者自己在积分器前面加条件判断。启动阶段如果不想看到巨大的电流尖峰,可以额外加一条斜坡限幅,让Te_ref从零慢慢升上去。
5.4 离散控制周期与连续电机模型混用造成的时序问题
这个坑比较隐蔽,因为报错不一定出现,但波形时好时坏,偶尔还出现莫名其妙的振荡。问题出在Simulink连续和离散模块混合使用时的数据衔接上。
我的经验是把控制周期Ts固定下来,所有离散模块都使用相同的采样时间;连续PMSM模块的输出经过零阶保持器再进控制逻辑;开关表输出到逆变器的脉冲信号,在进入逆变器之前加一个适当传输延时的单位延迟模块,避免形成代数环。仿真求解器一定要选固定步长,我常用ode3或ode4,步长设成控制周期的十分之一到二十分之一,比如Ts=5e-5 s,仿真步长取1e-6 s到2e-6 s。变步长求解器在滞环这种强非线性开关环节下,步长自适应会很慢,而且波形抖动大,不太适合DTC。
5.5 评价转矩脉动时,指标和测量窗口怎么选才科学
说到最后,怎么判断你的降脉动方案有没有效?只看仿真图目测是不严谨的,至少要定两个指标。
最常用的是稳态脉动峰峰值:在转速、负载都稳定的一段窗口内,取转矩波形的最大值减最小值,记为T_ripple_pp。更严谨一点的指标是RMS脉动值,也就是相对于平均转矩的标准差。还可以算脉动率,把峰峰值除以此时的平均转矩再乘100%。
测量窗口要注意避开启动、加载的过渡阶段。我通常的做法是让系统稳定运行1秒以上,然后取稳定区间后0.1~0.2秒的数据做统计。做方案对比时,唯一变量应该是控制器方案本身,其余全部保持一致:同样的直流母线电压、同样的转速给定、同样的负载力矩、同样的控制周期、同样的观测器参数。否则你根本说不清脉动降低是方案带来的,还是因为母线电压调高了。
6. 调试时帮助最大的一个习惯:磁链圆和转矩波形一起看
最后分享一个我个人特别受益的习惯。很多人调DTC只看转速和转矩曲线,磁链圆的画面常年不开。但实际上,磁链圆的形状把这个控制系统几乎所有问题都写在脸上:圆形完整说明磁链控制正常,六边形说明电压饱和,内陷说明扇区切换或矢量选择有问题,圆心偏移说明观测器初值或漂移没处理好。
我在仿真调试时,会把磁链轨迹、转矩波形、转速响应三个图形窗口同时摆开。启动之后先不看转矩,先看磁链圆有没有画成一个稳定的圆,只要磁链圆是健康旋转的,再往下调转矩脉动就轻松很多。这个习惯在后来换占空比方案、做十二扇区改进时帮了大忙,每次改完代码都是先等磁链圆稳定,再盯着转矩纹波看统计量,效率远高于单看一个波形瞎猜。
如果你现在照着这篇文章去搭一个DTC仿真,我强烈建议你也按这个顺序来:先把传统两电平查表DTC调到磁链圆稳定、转速能跟上给定,再做三电平或占空比改进。基础不稳就急着上先进方案,只会让问题更难定位。