3. 三相永磁同步电机数学模型

各位同学,欢迎来到第三章。这一章我们聊聊电机控制里最基础、也最关键的部分——PWM生成。说实话,我见过不少新手,FOC算法写得飞起,结果电机一跑就炸,查到最后发现是PWM配置出了问题。嗯,这章咱们就把ePWM模块的每个环节掰开揉碎,讲清楚。

3.1 ePWM模块的整体架构

C2000的ePWM模块,说白了就是一个高度可配置的PWM发生器。每个模块包含7个子模块:时基(TB)、比较器(CC)、动作限定器(AQ)、死区(DB)、斩波(PC)、陷阱(TZ)和事件触发(ET)。做FOC,我们最常用的是前四个。

我个人习惯把ePWM想象成一条流水线:

  • 时基计数器(TB):产生时间基准,决定PWM频率
  • 比较器(CC):设定占空比阈值
  • 动作限定器(AQ):根据比较结果决定输出电平
  • 死区模块(DB):插入死区时间,防止上下管直通

下面这张图能帮你快速建立整体认知:

ePWM模块内部流水线结构 TB 时基计数器 TBPRD, TBPHS, CTR CC 比较器 CMPA, CMPB AQ 动作限定器 SET / CLEAR / TOGGLE DB 死区模块 RED / FED ePWMxA / B 关键流程说明: 1. TB产生锯齿波/三角波,决定PWM周期 2. CC将CMPA值与计数器比较,产生匹配事件 3. AQ根据匹配事件决定输出动作(置高/置低/翻转) 4. DB在上升沿/下降沿插入死区,生成互补信号

3.2 时基计数器(TB)—— PWM的节拍器

时基计数器是整个ePWM的心脏。它决定了PWM的频率和计数模式。C2000支持三种计数模式:

计数模式 波形形状 典型应用 周期计算
递增计数(Up) 锯齿波 非对称PWM Fsw = TBCLK / (TBPRD + 1)
递减计数(Down) 反向锯齿波 非对称PWM Fsw = TBCLK / (TBPRD + 1)
增减计数(Up-Down) 三角波 对称PWM(FOC常用) Fsw = TBCLK / (2 × TBPRD)

做FOC时,我强烈建议使用增减计数模式。为什么?因为对称PWM的中心对齐特性,能有效降低电流采样时的谐波干扰。我在项目里吃过亏——一开始用递增计数,电流波形总有点毛刺,换成增减计数后,干净多了。

配置要点:

  • TBCTL寄存器选择计数模式(CTRMODE位)
  • TBPRD寄存器设定周期值
  • TBPHS寄存器设定相位偏移(多模块同步时用)

3.3 比较器(CC)—— 占空比的翻译官

比较器的任务很简单:把数字化的占空比指令,翻译成时间轴上的匹配事件。每个ePWM模块有两个比较寄存器:CMPA和CMPB。

举个例子,假设TBPRD=2000,你想输出50%占空比:

  • 递增模式:CMPA = 1000(计数器从0到2000,在1000处匹配)
  • 增减模式:CMPA = 1000(计数器从0到2000再回0,在上升段1000和下降段1000各匹配一次)

这里有个坑——CMPA的值是影子寄存器。你写入后,它不会立即生效,而是等到下一个周期开始才加载。这个机制是为了防止占空比在周期中间突变,导致脉冲畸形。嗯,TI这个设计很贴心。

我的习惯:在FOC中断服务函数里,先算好新的占空比,然后一次性写入CMPA。利用影子寄存器特性,所有通道的更新会同步生效,不会出现半个周期用旧值、半个周期用新值的尴尬情况。

3.4 动作限定器(AQ)—— 输出电平的指挥官

动作限定器决定了:当比较事件发生时,PWM引脚该做什么动作。可选的动作为:置高(SET)、置低(CLEAR)、翻转(TOGGLE)、无动作(NONE)。

对于FOC常用的对称PWM,典型的配置是:

  • 计数器等于0时:置高(SET)
  • 计数器等于CMPA时(递增段):置低(CLEAR)
  • 计数器等于CMPA时(递减段):置高(SET)
  • 计数器等于TBPRD时:置低(CLEAR)

这样就能生成一个中心对齐的PWM波形。你想想看,这种波形在开关切换时,电流纹波最小,对电机绕组最友好。

我曾经踩过的坑:配置AQ时,忘了设置CAU(递增匹配)和CAD(递减匹配)的对应动作。结果波形完全不对,电机嗡嗡响就是不转。查了两小时,才发现是动作限定器的配置漏了一项。所以,配置完一定要用示波器看波形,别偷懒。

3.5 死区模块(DB)—— 防止上下管直通的生命线

死区模块,是电机驱动里绝对不能省的一环。它的作用是在上下管切换时,插入一段「同时关断」的时间,防止瞬间直通烧毁MOSFET或IGBT。

死区模块有两个关键参数:

参数 含义 寄存器
RED(上升沿延迟) 输出从低变高时,延迟插入的时间 DBRED
FED(下降沿延迟) 输出从高变低时,延迟插入的时间 DBFED

死区时间怎么选?我一般遵循这个原则:

  • 死区时间 ≥ 开关管的关断延迟 + 驱动芯片的传播延迟 + 安全裕量
  • 典型值:IGBT用2-5μs,MOSFET用0.5-2μs
  • 不要贪大——死区太大,波形失真严重,电流谐波增加

3.6 互补PWM与死区插入实战

好了,理论讲完了,咱们直接上代码。下面是一个完整的ePWM配置示例,生成一对互补PWM信号,带1μs死区:

// 假设系统时钟 SYSCLKOUT = 100MHz
// TBCLK = SYSCLKOUT / 1 = 100MHz
// 目标PWM频率 = 20kHz(增减计数模式)
// TBPRD = 100MHz / (2 * 20kHz) = 2500

void EPWM_Config(void)
{
    // 1. 时基配置
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;  // 增减计数
    EPwm1Regs.TBPRD = 2500;                          // 周期值
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;        // 高速时钟不分频
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;           // 时基时钟不分频

    // 2. 比较器配置
    EPwm1Regs.CMPA.bit.CMPA = 1250;                  // 初始占空比50%

    // 3. 动作限定器配置(ePWM1A)
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;               // 计数器=0时置高
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;             // 递增匹配时置低
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;               // 递减匹配时置高
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;             // 计数器=周期时置低

    // 4. 死区配置
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;   // 使能上升沿和下降沿延迟
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIGH;       // 极性:高电平有效
    EPwm1Regs.DBRED = 100;                           // 上升沿延迟 = 100 * 10ns = 1μs
    EPwm1Regs.DBFED = 100;                           // 下降沿延迟 = 100 * 10ns = 1μs

    // 5. 输出使能
    EPwm1Regs.EPWMXA_ENABLE = 1;                     // 使能ePWM1A输出
    EPwm1Regs.EPWMXB_ENABLE = 1;                     // 使能ePWM1B输出(互补)
}

关键点解析:

  • ePWM1A和ePWM1B自动生成互补信号,无需额外配置
  • 死区时间 = DBRED × TBCLK周期 = 100 × 10ns = 1μs
  • POLSEL = DB_ACTV_HIGH 表示死区插入后,输出极性不变

3.7 死区配置的避坑指南

关于死区,我总结了几条血泪教训:

  • 死区不是越大越好:我曾经为了保险,设了5μs死区,结果电机在轻载时电流波形严重畸变,效率掉了3%。后来换成1.5μs,一切正常。
  • 注意温度影响:开关管的关断延迟会随温度升高而增加。我一般会在常温测试值上,加50%的裕量。
  • 用示波器验证:配置完死区,一定要用示波器看上下管的栅极波形。我曾经遇到过驱动芯片的传播延迟不一致,导致实际死区比设定值小了30%。
  • 死区补偿:如果对电流精度要求极高(比如伺服驱动),可以考虑在软件里做死区补偿。但那是进阶内容,咱们后面再聊。

调试小技巧:在开发阶段,可以把死区设得大一些(比如3-5μs),确保安全。等系统跑稳了,再逐步减小,找到性能和安全的平衡点。我习惯每次减0.5μs,然后用示波器观察波形,直到出现轻微的交越失真,再退回一档。

3.8 本章小结

这一章我们走通了ePWM的完整链路:从时基产生节拍,到比较器翻译占空比,再到动作限定器决定输出行为,最后死区模块保障安全。每个环节都不复杂,但环环相扣,一个地方配错,电机就不转。