产品展示
PRODUCTS
基于 DSP28335 的永磁同步电机DTC控制实战教程
直接转矩控制常用于希望获得较快转矩响应的交流调速场合,例如负载突变较明显的小功率伺服、教学实验平台和需要快速观察转矩变化的电机控制样机。它的优点是控制目标直接指向磁链和转矩,动态响应直观;不足是对参数、采样、母线电压和速度反馈比较敏感,低速区若磁链估算不稳,转矩输出也会随之波动。 本例程与传统滞环比较器加开关表的DTC控制不同,保留SVPWM调制方式,在FOC框架中增加磁链环和转矩环,磁链环输出d轴电压,转矩环输出q轴电压。本文以YXDSP-EMBOXC-01 PMSM-100W-DTC工程为例,说明这类DTC-SVM控制在研旭小功率带载电机实验箱上的实现和调试方法。
关键词:
DSP28335
DTC控制
永磁同步电机
SVPWM调制
所属分类:
嵌入式开发套件
嵌入式开发板
DSP实验箱
联系我们
产品描述
前言
直接转矩控制常用于希望获得较快转矩响应的交流调速场合,例如负载突变较明显的小功率伺服、教学实验平台和需要快速观察转矩变化的电机控制样机。它的优点是控制目标直接指向磁链和转矩,动态响应直观;不足是对参数、采样、母线电压和速度反馈比较敏感,低速区若磁链估算不稳,转矩输出也会随之波动。
本例程与传统滞环比较器加开关表的DTC控制不同,保留SVPWM调制方式,在FOC框架中增加磁链环和转矩环,磁链环输出d轴电压,转矩环输出q轴电压。本文以YXDSP-EMBOXC-01 PMSM-100W-DTC工程为例,说明这类DTC-SVM控制在研旭小功率带载电机实验箱上的实现和调试方法。
一、DTC-SVM控制原理
1.1 DTC与DTC-SVM
传统DTC通常根据转矩误差、磁链误差和磁链扇区直接选择逆变器电压矢量。它的控制结构非常直接,但开关频率和转矩脉动往往不够均匀。DTC-SVM则把“直接控制转矩和磁链”的目标保留下来,把最终电压矢量交给SVPWM合成,从而让开关频率和调制输出套用常规矢量控制。
本工程采用的就是后一种结构。速度环给出转矩参考,磁链参考与估算磁链形成磁链误差,转矩参考与估算转矩形成转矩误差,两个PI环分别生成d轴和q轴电压指令,再通过反Park变换和SVPWM更新三相PWM。这种结构的本质是通过q轴电流直接控制转矩。
1.2 磁链与转矩估算
磁链描述的是电机内部磁场建立的程度。对于近似表贴式永磁同步电机,d轴磁链主要由永磁体磁链和d轴电流产生的磁链组成,q轴磁链主要来自q轴电流。工程中的磁链估算先在d/q坐标系计算磁链分量,再反变换到α/β坐标系。



式中,ψd和ψq分别表示d/q轴磁链,Ld和Lq表示d/q轴电感,id和iq为d/q轴电流,ψf为永磁体磁链。定子磁链幅值用于与磁链给定比较。工程把d/q轴磁链反变换到α/β坐标系后,再计算磁链幅值。

式中,ψα和ψβ表示静止坐标系下的磁链分量,|ψs|表示定子磁链幅值。这个量并不直接描述某一相电流,而是描述电机磁场状态的整体强弱。
转矩估算反映的是当前q轴电流和永磁体磁链共同产生的电磁转矩。本工程使用简化表贴式PMSM转矩模型:

式中,Te表示电磁转矩估计值,p表示极对数,ψf表示永磁体磁链,iq表示q轴电流。该公式的作用是把转矩反馈压缩成一个便于闭环比较的量,后续转矩环就围绕Te与转矩参考之间的误差工作。
1.3 双环电压指令生成
DTC-SVM的控制指令形式是电压矢量。磁链环根据磁链误差生成d轴电压,转矩环根据转矩误差生成q轴电压。


式中,ud*和uq*分别是d/q轴电压指令,ψref为磁链给定,Tref为转矩给定。工程随后用当前电角度把电压指令转换到α/β坐标系,并用母线电压Vdc归一化后送入SVPWM。这样既保留DTC对磁链和转矩的直接调节目标,又避免开关表输出造成的离散矢量跳变。
二、硬件设计与故障指令
2.1 硬件整体架构
本例程面向研旭小功率电机带载控制实验箱和100W永磁同步电机台架。硬件接线图如下:

2.2接线检查和故障指令
GPIO48和GPIO59参与PWM/辅助使能,故障动作中会同时DisablePWM和DisablePWM1。
GPIO12配置为TZ1作为硬件过流故障指示信号,一旦触发,程序通过fault_action关断输出并清除运行状态。
母线瞬时过压阈值为40V,平均欠压阈值为22V,恢复运行条件为大于23V。
三、软件环境与工程架构
3.1 开发环境配置
工程为CCS C2000项目,目标器件配置为TMS320F28335,编译优化等级2,链接命令文件为28335_RAM_lnk.cmd。源码文件位于source目录,头文件位于include目录,调试输出位于Debug目录。
工程仍采用CCS下的DSP28335裸机工程结构,控制中断由EPWM1触发,ADC采样、编码器读取、保护判断、控制计算和SVPWM更新都围绕该中断展开。与普通FOC工程相比,本文重点关注DTC-SVM新增的磁链估算、转矩估算、磁链环和转矩环。
3.2 工程文件结构
表1 工程文件结构
文件 | 关注内容 |
|---|---|
main.c | DTC控制参数、开环启动、转矩/磁链环接入 |
DTC_PMSM.c | 估算磁链和电磁转矩 |
DSP2833x_UserDefine.h | FEstimator结构体、PWM装载宏定义 |
DSP2833x_EQep.c | eQEP2位置计数、1ms速度更新和index事件 |
DSP2833x_EPwm.c / svpwm.c | 10kHz控制周期和SVPWM输出 |
四、工程参数与关键逻辑
参数分析应以main.c中最终赋值为准,而不是只看默认宏。100W永磁同步电机参数已在工程中的FEstimator结构体下示出,具体参数如下:Ld/Lq值为1.1e-4H,磁链值为0.0052Wb,定子电阻值为0.17Ω。
表2 DTC工程参数
参数/变量 | 当前配置 | 配置理由 |
|---|---|---|
Speed_set | 初始值为-1000 rpm | |
Flux_pidreg.Ref | 初始值为永磁磁链值 | 等效于Id参考值设为0 |
Flux_pidreg | Kp=3,Ki=0.3 | 磁链误差生成d轴电压指令 |
Torque_pidreg | Kp=3,Ki=0.3 | 转矩误差生成q轴电压指令 |
Speed_pidreg | Kp=0.001,Ki=0.001,OutMax=±9 | 速度外环生成转矩参考 |
FEstimator.Ts | 1e-4 s | 控制采样周期100 μs |
4.1 最终参数赋值
下面的代码摘录保留了主函数中生效的DTC-SVM参数。可以看到,磁链环和转矩环都输出电压指令,速度环输出转矩参考,FEstimator结构体保存电机模型参数。
代码摘录:DTC-SVM最终参数
Flux_pidreg.Kp = 3; Flux_pidreg.Ki = 0.3; Flux_pidreg.OutMax = 24.0; Flux_pidreg.OutMin = -24.0; Flux_pidreg.ErrMax = 1; Flux_pidreg.ErrMin = -1; Torque_pidreg.Kp = 3; Torque_pidreg.Ki = 0.3; Torque_pidreg.OutMax = 24.0; Torque_pidreg.OutMin = -24.0; Torque_pidreg.ErrMax = 1; Torque_pidreg.ErrMin = -1; Speed_pidreg.Kp = 0.001; Speed_pidreg.Ki = 0.001; Speed_pidreg.OutMax = 9; Speed_pidreg.OutMin = -9; Speed_pidreg.ErrMax = 1000; Speed_pidreg.ErrMin = -1000; FEstimator.Rs = 0.17f; FEstimator.Ld = 1.1e-4f; FEstimator.Lq = 1.1e-4f; FEstimator.Flux_pm = 0.0052f; FEstimator.pole_pairs = 5.0f; FEstimator.Ts = 1e-4f; Speed_pidreg.Ref = Speed_set; Flux_pidreg.Ref = FEstimator.Flux_pm; |
4.2 开环启动与闭环切换
程序上电后不会立即进入DTC-SVM闭环,而是先用小幅旋转电压矢量带动转子寻找编码器index。只有EQEP2检测到index事件并置位start_done后,才开始使用编码器角度、电流反馈和转矩/磁链闭环。
代码摘录:开环启动逻辑
if(!start_done) { if(!QEP_CLR) { QEP_CLR = 1; EQep2Regs.QCLR.bit.IEL = 1; } svgen.Ualpha = 0.05 * cos(step * 0.0031416); svgen.Ubeta = 0.05 * sin(step * 0.0031416); if(Speed_pidreg.Ref < 0) { temp = svgen.Ualpha; svgen.Ualpha = svgen.Ubeta; svgen.Ubeta = temp; } step++; if(step > 1999) step = 0; } if(EQep2Regs.QFLG.bit.IEL) { start_done = 1; } |
4.3 磁链和转矩计算
闭环阶段先由三相电流得到d/q轴电流,再把电流送入FEstimator。工程没有启用传统电压积分磁链模型,而是按电感和永磁体磁链得到d/q轴磁链,再反变换到静止坐标系计算磁链幅值。
代码摘录:磁链与转矩估算
v->Psi_d = v->Ld * v->I_d + v->Flux_pm; v->Psi_q = v->Lq * v->I_q; v->Psi_est = sqrtf(v->Psi_alpha * v->Psi_alpha + v->Psi_beta * v->Psi_beta); v->Te_est = 1.5f * v->pole_pairs * v->I_q * v->Flux_pm; |
这段代码决定了DTC-SVM两个反馈量的来源:Psi_est代表磁链幅值,Te_est代表电磁转矩估计值。若电机参数不准或电流采样方向反了,两个闭环会同时受到影响。
4.4 转矩磁链双环接入
工程先用开环SVPWM牵引转子,并用QEP index确认转子0位置。闭环后,估算磁链和转矩,再在速度外环中更新转矩参考并控制速度给定斜坡,磁链参考被限制在永磁体磁链附近;随后磁链环和转矩环分别计算电压指令,并按母线电压归一化后送入反Park和SVPWM。
代码摘录:DTC-SVM闭环接入
FEstimator.I_d = I_park.PDs; FEstimator.I_q = I_park.PQs; Fdq_Calc(&FEstimator); Psi_ipark.IPDs = FEstimator.Psi_d; Psi_ipark.IPQs = FEstimator.Psi_q; Psi_ipark.IPSine = I_park.PSine; Psi_ipark.IPCosine= I_park.PCosine; ipark_calc(&Psi_ipark); FEstimator.Psi_alpha = Psi_ipark.IPAlpha; FEstimator.Psi_beta = Psi_ipark.IPBeta; FsTe_Calc(&FEstimator); if((!motor_dat.pos_cnt) && (mode_select & 0x1)) { if(Flux_pidreg.Ref > 0.006) { Flux_pidreg.Ref = 0.006; } else if(Flux_pidreg.Ref < 0.004) { Flux_pidreg.Ref = 0.004; } } pid_reg_calc(&Torque_pidreg); I_ipark.IPQs = Torque_pidreg.Out; pid_reg_calc(&Flux_pidreg); I_ipark.IPDs = Flux_pidreg.Out; |
从信号传递看,速度误差并不直接生成Iq参考,而是生成转矩参考;磁链误差和转矩误差最终生成电压矢量。这是本工程区别于普通FOC速度电流双闭环的地方。
4.5 QEP速度反馈
eQEP2仍然是启动牵引和估算结果对照的基准。工程用1ms位置差计算motor_dat.speed,并与扭矩传感器采样得到的速度Speed_sensor进行比较。
五、实验运行与观察
建议先空载运行,观察速度是否稳定,之后再加载观察转矩、磁链变化。
表3 建议仿真器观察的实验变量
记录对象 | 变量 | 用于说明的问题 |
|---|---|---|
开环寻零 | start_done | 寻零完成标志 |
速度外环 | Speed_set / motor_dat.speed | 实际速度是否跟随目标速度 |
磁链反馈 | FEstimator.Psi_d / FEstimator.Psi_q | 磁链估算是否稳定 |
转矩反馈 | FEstimator.Te_est / Torque_pidreg.Ref | 估算转矩是否跟踪参考转矩 |
双环输出 | Flux_pidreg.Out / Torque_pidreg.Out | 参考电压输出是否饱和 |
扭矩传感器 | Speed_sensor / Torque | 查看速度和输出转矩 |
保护状态 | run_sts.fault1/fault2 | 启停控制、故障监测 |

六、参数整定与故障调试
● 先确认三相电流零点和方向,再观察FEstimator.Psi_est与FEstimator.Te_est。采样方向错误时,转矩和磁链反馈可能看似有数值,但闭环方向会整体错误。
● FEstimator.Rs、Ld、Lq和Flux_pm决定磁链与转矩模型。Ld/Lq过大时磁链反馈对电流过于敏感,过小时磁链环难以体现电流变化;Flux_pm不准会同时影响磁链限幅和转矩估算。
● Flux_pidreg.Ref在代码中被限制到±0.00935附近,调试时不要只修改初始0.2而忽略后续限幅。若Psi_est长期接近0或跳变,应先检查FEstimator.Psi_alpha/Psi_beta的计算链路。
● Torque_pidreg.Out和Flux_pidreg.Out最终会除以Vdc并限幅到±1。若母线电压采样不准,SVPWM输入会被错误放大或压缩,表现为输出饱和或转速无力。
●速度环只在motor_dat.pos_cnt清零时更新,节拍约为1 ms。若motor_dat.pos_cnt长时间不变化,应检查EQEP2的UTO事件和QEP初始化。
● 第一次运行建议在空载或小负载下进行,先降低Speed_set幅值,再逐步增加转速或负载。若出现冲击,优先降低Torque_pidreg.Kp/Ki和Speed_pidreg.OutMax。
七、实验结果附图

图1 DTC空载阶跃 -2000 rpm比较

图2 DTC磁粉加载10阶跃 -2000 rpm比较

图3 DTC磁粉加载20阶跃 -2000 rpm比较

图4 DTC 1S周期正弦响应对比图

图5 DTC 2S周期正弦响应对比图
