深入解析C2000 ePWM动作限定与死区控制:从寄存器到电机驱动实战

1. 从寄存器手册到实战:ePWM动作限定与死区控制的核心逻辑

如果你正在用TI的C2000系列DSP做电机控制或者数字电源,那么ePWM模块绝对是你绕不开的核心。手册上那几十上百页的寄存器描述,是不是看得你头大?尤其是动作限定(Action-Qualifier)和死区(Dead-Band)这两个子模块,寄存器位域一堆,光看名字就让人发怵。别急,今天我就结合自己这些年调板子的经验,把这两个最常用也最关键的模块给你掰开揉碎了讲清楚。我们不讲那些空洞的理论,就盯着TMS320F2803x的寄存器,看看每一个比特位到底在控制什么,在实际电路中又对应着什么样的波形变化。理解了这些,你才能从“配置寄存器”进阶到“设计波形”,真正玩转ePWM。

很多人觉得看寄存器手册是枯燥的体力活,但我认为这是最高效的学习路径。手册是芯片设计者与使用者之间的契约,每一个位域都对应着硬件电路的一个具体开关或逻辑。动作限定模块,说白了就是告诉ePWM:“当计数器跑到某个特定值(比如比较值A、比较值B、周期值、零值)时,你该让输出引脚干什么——是立刻拉高、拉低,还是翻转一下?” 这是生成一切PWM波形的基石。而死区模块,则是为了安全而生。在驱动H桥或半桥电路时,上下两个开关管绝对不能同时导通,否则就是直通短路,瞬间烧管。死区就是在互补的PWM信号中,插入一个极短的时间延迟,确保一个管子完全关断后,另一个管子才缓缓打开。

接下来的内容,我会带你深入AQCTLA、AQCTLB、AQSFRC、AQCSFRC、DBCTL、DBRED、DBFED这些关键寄存器,并结合TZSEL、TZCTL等故障保护寄存器,构建一个从基础波形生成到高级安全控制的完整知识体系。你会发现,一旦理清了这些寄存器之间的联动关系,编写ePWM驱动代码就会变得像搭积木一样直观。

2. 动作限定子模块:PWM波形生成的“导演”

动作限定模块是ePWM的“大脑”,它根据时间基准计数器(TBCTR)的实时状态,指挥输出引脚(EPWMxA和EPWMxB)做出动作。它的核心寄存器就是AQCTLA和AQCTLB,分别控制A和B两个输出。别看这两个寄存器结构一样,但独立配置才能产生互补、对称或者各种复杂的PWM模式。

2.1 AQCTLA/AQCTLB寄存器:定义动作的“剧本”

手册上给出的寄存器位图很清晰,我们直接看核心。每个寄存器控制6个“事件点”的动作:

  • CAU/CAD: 计数器等于活动CMPA寄存器值且正在递增(Up)/递减(Down)时。
  • CBU/CBD: 计数器等于活动CMPB寄存器值且正在递增(Up)/递减(Down)时。
  • ZRO: 计数器等于时。
  • PRD: 计数器等于**周期值(TBPRD)**时。

每个事件点有2个比特位,可以配置4种动作:00(无动作)、01(强制拉低,Clear)、10(强制拉高,Set)、11(翻转输出,Toggle)。

这里的关键是理解“活动寄存器”(Active Register)和“影子寄存器”(Shadow Register)的概念。以CMPA为例,你代码里写EPwm1Regs.CMPA.half.CMPA = 1000;,这个值通常是写入了影子寄存器。硬件会在一个安全的时刻(比如计数器为零时),自动将影子寄存器的值加载到活动寄存器中。动作限定模块只认活动寄存器的值。这样做的好处是避免了在PWM周期中间修改比较值可能导致的脉冲毛刺或宽度异常,对于电机控制这种需要平滑改变占空比的场景至关重要。

实操要点一:如何生成一个简单的递增计数PWM?假设我们只需要EPWMxA输出一个占空比可变的PWM,EPWMxB暂时不用。采用递增计数模式(TBCTR从0数到TBPRD,然后归零重启)。

  1. 设置动作:我们希望计数器从0开始递增,当计数值小于CMPA时输出高电平,大于等于CMPA时输出低电平,并在计数器归零时重新拉高,开始下一个周期。
  2. 对应配置:在AQCTLA寄存器中,我们只需配置两个点:
    • CAU = 10(Set high): 当计数器递增到等于CMPA时,将输出置高。等等,这好像不对?我们想要的是小于CMPA时高,大于等于时低。这里有个思维转换:在递增模式下,CAU是计数器从小于CMPA增加到等于CMPA的那个瞬间触发的动作。如果我们在这个瞬间设为10(置高),那输出就会在等于CMPA时突然变高,之后保持高电平直到周期结束,这显然不是我们想要的。
    • 正确的配置是:ZRO = 10(Set high),CAU = 01(Clear low)。意思是:在计数器为零的瞬间,将输出置高;当计数器递增到等于CMPA的瞬间,将输出拉低。这样,输出高电平的时间就是从0到CMPA的这段时间,占空比 = CMPA / TBPRD。

实操要点二:生成互补对称PWM(用于H桥)这是电机驱动中最常用的模式。我们需要EPWMxA和EPWMxB输出一对互补的、带死区的PWM信号。通常采用递增-递减计数模式(TBCTR从0数到TBPRD,再递减回0)。

  1. 核心思路:在一个周期内,我们需要在多个点触发动作来形成对称的波形。通常配置如下:
    • AQCTLA:CAU = 01(Clear),CAD = 10(Set)。这意味着:在计数器递增到CMPA时拉低A,在递减到CMPA时拉高A。这样会生成一个以周期中心为对称点的脉冲。
    • AQCTLB:CBU = 10(Set),CBD = 01(Clear)。这意味着:在计数器递增到CMPB时拉高B,在递减到CMPB时拉低B。如果我们设置CMPB = TBPRD - CMPA,那么B的输出正好与A互补。
  2. 代码示例(片段):
    // 假设使用ePWM1模块 EPwm1Regs.TBPRD = 1000; // 设置周期值 EPwm1Regs.CMPA.half.CMPA = 300; // 设置比较值A EPwm1Regs.CMPB = 1000 - 300; // 设置比较值B,形成互补 // 配置动作限定寄存器A EPwm1Regs.AQCTLA.bit.CAU = 1; // CAU=01: 递增至CMPA时,清除(拉低) EPwm1Regs.AQCTLA.bit.CAD = 2; // CAD=10: 递减至CMPA时,置位(拉高) // 配置动作限定寄存器B EPwm1Regs.AQCTLB.bit.CBU = 2; // CBU=10: 递增至CMPB时,置位(拉高) EPwm1Regs.AQCTLB.bit.CBD = 1; // CBD=01: 递减至CMPB时,清除(拉低) // 注意:ZRO和PRD事件在此模式下通常不用于主要波形生成,可设为无动作。 EPwm1Regs.AQCTLA.bit.ZRO = 0; EPwm1Regs.AQCTLA.bit.PRD = 0; EPwm1Regs.AQCTLB.bit.ZRO = 0; EPwm1Regs.AQCTLB.bit.PRD = 0;
    通过示波器观察EPWM1A和EPWM1B,你应该能看到两个中心对称、互补的PWM波形。但这时的信号是“理想”的互补,没有死区,直接驱动H桥会炸管。所以接下来必须引入死区模块。

2.2 软件强制寄存器:调试与控制的“紧急按钮”

动作限定模块除了响应计数器事件,还能被软件直接干预。这就是AQSFRC(单次软件强制)和AQCSFRC(连续软件强制)寄存器的作用。

AQSFRC (Action-Qualifier Software Force Register)这个寄存器用于产生一次性的强制动作。比如,你想在某个特定时刻(与计数器无关)让输出瞬间拉高或拉低一下,就可以用它。

  • OTSFA/OTSFB位:写1即对输出A/B产生一次单次强制事件。该位会在写操作完成后自动清零。
  • ACTSFA/ACTSFB位:定义当单次强制事件发生时,输出执行什么动作(清除、置位、翻转)。
  • RLDCSF位:这个很重要,它决定了AQCSFRC寄存器的加载方式。AQCSFRC也有影子寄存器。RLDCSF可以选择在TBCTR=0TBCTR=TBPRD、两者之一或立即加载。在需要同步改变强制状态的系统中,务必将其配置为在计数器零��或周期点加载,以避免输出毛刺。

AQCSFRC (Action-Qualifier Continuous Software Force Register)这个寄存器用于产生持续的强制状态。一旦设置,输出将被强制锁定在指定电平(高或低),直到你清除该设置。这在故障安全控制中非常有用,比如当检测到过流时,可以立即通过软件将PWM输出强制拉低,关闭功率管。

  • CSFA/CSFB位:01强制输出持续低,10强制输出持续高,0011禁用强制。
  • 它同样受AQSFRC[RLDCSF]位控制的加载模式影响。

经验分享:软件强制的典型应用场景

  1. 系统初始化或紧急停机:在程序启动或收到急停命令时,使用AQCSFRC将PWM输出强制拉低,确保功率级处于安全状态。
  2. 调试与测试:在调试硬件时,你可以用AQSFRC手动产生一个脉冲,测试驱动电路和功率管是否正常响应,而无需复杂的PWM波形。
  3. 实现特定序列:在某些复杂的控制算法中,可能需要在一个PWM周期内插入一个非周期性的特殊脉冲,这时可以结合中断和AQSFRC来实现。

注意:软件强制信号的优先级非常高。一旦启用连续强制,它将覆盖动作限定模块基于计数器事件产生的所有动作。使用单次强制后,输出会在强制动作执行后,立刻回归到由动作限定事件控制的状态。务必理清这个优先级关系,否则会出现意想不到的波形。

3. 死区生成子模块:功率电路的安全卫士

生成了互补PWM信号后,绝对不能直接送到桥臂的上下管。因为MOSFET或IGBT的开关不是理想的,有关断延时和存储时间。如果互补信号同时变化,会在极短时间内出现上下管同时导通的情况,称为“直通”(Shoot-Through),会产生巨大的短路电流,损坏器件。死区模块就是在互补信号的边沿插入一段可控的延迟时间。

3.1 DBCTL寄存器:死区工作模式的“总开关”

DBCTL寄存器是配置死区的核心,它主要控制三个部分:输入选择、输出模式和极性控制。

OUT_MODE (位1-0):输出模式控制这是首先要配置的。它决定死区功能是否启用,以及启用在哪条通路上。

  • 00旁路模式。死区模块完全被绕过,AQ模块的输出直接送给后面的PWM斩波模块。这是默认值,在不需要死区的场合使用。
  • 01仅启用下降沿延迟。AQ模块的EPWMxA信号直通输出(到最终的EPWMxA),而AQ模块的EPWMxB信号则经过一个下降沿延迟器后输出(到最终的EPWMxB)。这个延迟量由DBFED寄存器设定。
  • 10仅启用上升沿延迟。与上一种相反,AQ模块的EPWMxB信号直通输出,而AQ模块的EPWMxA信号经过一个上升沿延迟器后输出。延迟量由DBRED寄存器设定。
  • 11完全启用模式。这是最常用的模式。AQ模块的EPWMxA信号经过上升沿延迟后输出(到最终的EPWMxA),AQ模块的EPWMxB信号经过下降沿延迟后输出(到最终的EPWMxB)。延迟量分别由DBREDDBFED控制。

IN_MODE (位5-4):输入模式控制这个位域比较巧妙,它决定了延迟模块的输入信号来源。默认是00,即两个延迟器的输入都来自AQ模块的EPWMxA输出。但在一些高级应用中,你可以交换输入。

  • 00:EPWMxA作为两个延迟器的输入源(经典模式)。
  • 01:EPWMxA作为下降沿延迟输入,EPWMxB作为上升沿延迟输入。
  • 10:EPWMxA作为上升沿延迟输入,EPWMxB作为下降沿延迟输入。
  • 11:EPWMxB作为两个延迟器的输入源。什么时候需要改IN_MODE?举个例子,如果你通过AQ模块生成的原始信号,EPWMxA是上管驱动信号,EPWMxB是下管驱动信号,并且是低电平有效。那么你可能希望上管信号在关闭(上升沿)时插入延迟,下管信号在开启(下降沿)时插入延迟。这时就需要根据你的信号定义和有效电平来调整IN_MODEPOLSEL

POLSEL (位3-2):输出极性选择这个位可以在信号输出前,对某一路进行取反。

  • 00:Active High (AH)模式,两路都不反相。
  • 01:Active Low Complementary (ALC)模式,只反相EPWMxA。
  • 10:Active High Complementary (AHC)模式,只反相EPWMxB。
  • 11:Active Low (AL)模式,两路都反相。这个配置需要与你的功率驱动芯片(如栅极驱动器)的输入逻辑相匹配。很多栅极驱动器是低电平有效关断,高电平有效导通。如果你的MOSFET是高端N管,可能需要自举电路或隔离驱动,这时驱动逻辑可能就需要反相。POLSEL给了你硬件层面的反相能力,比在软件里生成反相波形更可靠、更及时。

HALFCYCLE (位15):半周期时钟使能这是一个性能优化位。当死区延迟值很小时(比如只需要几个TBCLK周期),为了获得更精细的延迟分辨率,可以开启此位。开启后,死区延迟计数器以2 * TBCLK的频率运行,相当于将延迟分辨率提高了一倍。例如,DBRED=5,在HALFCYCLE=0时,延迟是5个TBCLK周期;在HALFCYCLE=1时,延迟是5个半TBCLK周期,即2.5个全周期。注意:这要求你的系统时钟(SYSCLKOUT)和时基时钟(TBCLK)能满足这个更高的计时要求。

3.2 DBRED与DBFED寄存器:设定安全的“时间栅栏”

这两个寄存器就很简单了,分别是10位宽的上升沿延迟计数器和下降沿延迟计数器。

  • DBRED:上升沿延迟值。当输入信号出现上升沿时,输出信号会延迟DBRED个(或半个)TBCLK周期后才出现上升沿。
  • DBFED:下降沿延迟值。当输入信号出现下降沿时,输出信号会延迟DBFED个(或半个)TBCLK周期后才出现下降沿。

如何计算和设置死区时间?死区时间T_dead必须大于功率开关管的最大关断延迟时间T_off(max)。通常会在数据手册中给出。

  1. 确定TBCLK周期T_tbclk = 1 / (EPWM时钟频率)。例如,系统时钟SYSCLKOUT=100MHz,ePWM时钟预分频器设为/2,则TBCLK = 50MHz,周期为20ns。
  2. 计算所需计数DBRED_Value = T_dead / T_tbclk。如果HALFCYCLE=1,则DBRED_Value = T_dead / (T_tbclk / 2)
  3. 取整与验证:将计算结果向上取整为整数,并确保不超过1023(10位最大值)。同时,要确保死区时间加上PWM最小脉宽不会超过半个开关周期,否则会导致有效占空比范围被压缩。

配置示例:为互补对称PWM加入死区接续2.1节的互补PWM配置,我们现在为其加入死区。

// 假设TBCLK周期为20ns,需要插入500ns的死区时间。 // 所需计数值 = 500ns / 20ns = 25 Uint16 dead_time_counts = 25; // 配置死区控制寄存器DBCTL // 完全启用死区,上升沿延迟作用于A路,下降沿延迟作用于B路,极性不反相(AH模式) EPwm1Regs.DBCTL.bit.OUT_MODE = 3; // 0b11: 完全启用 EPwm1Regs.DBCTL.bit.POLSEL = 0; // 0b00: AH模式,不反相 EPwm1Regs.DBCTL.bit.IN_MODE = 0; // 0b00: 两路延迟输入均来自AQ的EPWMxA(经典配置) EPwm1Regs.DBCTL.bit.HALFCYCLE = 0; // 全周期时钟 // 设置死区时间 EPwm1Regs.DBRED = dead_time_counts; EPwm1Regs.DBFED = dead_time_counts;

配置完成后,用示波器同时观察AQ模块输出的“原始”EPWMxA(可能需要在代码中映射到另一个GPIO观察)和经过死区模块后的最终EPWMxA和EPWMxB。你会看到,��终输出的EPWMxA的上升沿比原始信号延迟了(滞后),而EPWMxB的下降沿比原始信号延迟了。这样就确保了两个信号不会同时跳变,中间有了一个500ns的“安全区”。

4. 故障联防与Trip-Zone子模块:最后的防线

动作限定和死区模块让我们能生成精确、安全的PWM波形。但实际系统中,过流、过压、过热等故障随时可能发生。ePWM的Trip-Zone(故障区)子模块就是硬件级别的快速保护机制,其响应速度远快于软件中断。

4.1 故障源选择与动作配置:构建保护网络

故障保护流程可以概括为:选择故障源 -> 定义触发动作 -> 处理故障标志。对应的核心寄存器是TZSELTZCTLTZFLGTZCLR

TZSEL (Trip-Zone Select Register):故障源“哨兵”这个寄存器决定哪些外部引脚或内部事件能触发保护。它分为两大类:

  • One-Shot (OSHT):一次性触发。一旦触发,ePWM输出将按照TZCTL配置的动作锁定,直到软件手动清除故障标志。适用于严重的、需要人工干预的故障,如短路。
  • Cycle-By-Cycle (CBC):周期循环触发。在每个PWM周期内,如果故障信号有效,则在本周期立即动作,并在下一个周期计数器归零时自动清除,如果故障已消失,则输出恢复正常。适用于可恢复的、瞬态的故障,如轻微过流。 你可以将多个TZ引脚(TZ1~TZ6)以及数字比较器事件(DCAEVT1/2, DCBEVT1/2)分别映射到OSHT或CBC。例如,将硬件过流比较器的输出接到TZ1,并在TZSEL中使能CBC1,实现每个周期的过流保护。

TZCTL (Trip-Zone Control Register):故障发生时的“应急预案”当故障被触发时,输出引脚该怎么办?TZCTL寄存器为每个故障源(TZA/TZB对应外部引脚,DCAEVT1/2等对应内部事件)定义了四种动作:

  • 00:高阻态(High-Z)。这是最常用的安全状态,直接让功率管栅极悬空,使其关断。
  • 01:强制输出高。
  • 10:强制输出低。
  • 11:无动作。对于电机驱动和电源,通常将OSHT故障配置为高阻态(00,实现硬关断。对于CBC故障,可以配置为强制拉低,在本周期关闭驱动,下个周期自动恢复。

4.2 故障处理流程与软件交互:化险为夷

配置好硬件自动保护后,软件还需要及时知道故障发生了,并做出相应处理(如记录日志、降低指令、尝试恢复等)。

TZFLG (Trip-Zone Flag Register):故障“记录员”这个寄存器是只读的状态标志位。当发生故障时,对应的位(CBC,OST,DCAEVT1等)会被硬件置1。INT位表示是否产生了Trip中断。软件可以通过轮询或中断的方式读取这个寄存器来判断故障类型。

TZCLR (Trip-Zone Clear Register):故障“复位键”这是一个写1清除(W1C)的寄存器。当软件处理完故障(例如,确认过流已消除)后,需要向TZCLR中对应的位写1,来清除TZFLG中相应的标志位。特别注意:对于OST故障,必须手动清除标志位输出才会恢复;对于CBC故障,虽然硬件会在计数器归零且故障消失时自动恢复输出,但TZFLG[CBC]标志位仍需软件手动清除。

TZEINT (Trip-Zone Enable Interrupt Register):中断“开关”你可以通过此寄存器使能特定故障事件触发PIE中断(EPWMx_TZINT)。这样,当故障发生时,CPU可以立即跳转到中断服务程序进行紧急处理,比轮询方式更及时。

一个完整的故障处理代码框架

// 1. 初始化Trip-Zone EPwm1Regs.TZSEL.bit.CBC1 = 1; // 使能TZ1引脚为CBC故障源 EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能TZ1引脚为OSHT故障源(可同时使能) EPwm1Regs.TZCTL.bit.TZA = 0; // TZA (EPWM1A) 故障时强制高阻 EPwm1Regs.TZCTL.bit.TZB = 0; // TZB (EPWM1B) 故障时强制高阻 // 也可以为CBC和OSHT配置不同动作,但TZCTL是针对引脚的,不是针对故障类型。 EPwm1Regs.TZEINT.bit.CBC = 1; // 使能CBC故障中断 EPwm1Regs.TZEINT.bit.OST = 1; // 使能OST故障中断 // 2. 在中断服务程序(ISR)中 interrupt void EPWM1_TZ_ISR(void) { if (EPwm1Regs.TZFLG.bit.CBC == 1) { // 处理周期循环故障 SystemState.CBC_Fault_Counter++; // 记录故障次数 if (SystemState.CBC_Fault_Counter > MAX_CBC_FAULTS) { // 如果CBC故障过于频繁,可能意味着严重问题,触发OSHT级别的关机 enterSafeState(); } EPwm1Regs.TZCLR.bit.CBC = 1; // 清除CBC标志位 } if (EPwm1Regs.TZFLG.bit.OST == 1) { // 处理一次性严重故障 SystemState.ErrorCode |= OST_FAULT_MASK; enterSafeState(); // 进入安全状态,可能关闭所有PWM EPwm1Regs.TZCLR.bit.OST = 1; // 清除OST标志位(在安全状态下) } EPwm1Regs.TZCLR.bit.INT = 1; // 清除全局中断标志 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; // 应答PIE中断 }

5. 高级应用与实战避坑指南

理解了基本寄存器配置后,我们来看看如何将这些模块组合起来,实现更复杂的功能,并避开那些我踩过的坑。

5.1 数字比较器与Trip-Zone的联动

TMS320F2803x的ePWM集成了强大的数字比较器(Digital Compare, DC)子模块,它可以将内部模拟比较器(CMPSS)的输出或外部信号,与PWM事件结合起来,实现更灵活的保护。TZDCSELTZCTL中关于DCAEVTDCBEVT的位域就是用于此。

应用场景:你想实现一个精确的逐周期峰值电流保护。硬件上,电流采样信号通过CMPSS模块与一个设定的阈值比较。当电流超过阈值时,CMPSS输出变高。你可以将这个输出配置为DCAEVT1事件,并在TZSEL中将其使能为CBC故障源,在TZCTL中配置故障动作为强制拉低。这样,一旦过流,硬件会在当前PWM周期内立即关闭输出,响应速度在纳秒级,远超软件。

配置要点

  1. 首先需要正确配置CMPSS模块和DC模块,将比较器输出映射到DCAEVT1
  2. TZDCSEL寄存器中,选择DCAEVT1的触发条件(例如,DCAH=high)。
  3. TZSEL中,使能DCAEVT1作为CBC故障源。
  4. TZCTL中,配置DCAEVT1对应的动作(如00高阻或10强制低)。

5.2 事件触发与ADC同步

ETSELETPS寄存器(后者在输入资料中未详细列出,但极其重要)用于配置ePWM模块的事件触发,特别是触发ADC开始转换(SOC)。这对于电流采样至关重要,必须保证在PWM波形的特定点(通常是开关管导通的中间点或关断点)进行采样,以获取准确的电流值。

经典配置:在互补对称PWM模式下,为了采样下桥臂的电流(或相电流),通常将ADC的SOCA触发源设置为“当时间基准计数器等于CMPB且正在递增时”(ETSEL[SOCASEL]=110)。因为CMPB通常设置在靠近周期中间的位置,此时电流已进入稳态。

避坑指南

  • 影子寄存器加载点:确保ADC的SOC触发事件发生在影子寄存器加载到活动寄存器之后。例如,如果你在计数器等于零(CTR=ZRO)时加载CMPA/CMPB的影子寄存器,那么SOC触发事件应该设置在CTR=PRD或CTR=CMPx且方向为递增/递减时,以避免使用到还未加载的新值。
  • 触发脉冲宽度:通过ETPS寄存器可以配置触发脉冲的宽度(持续多少个TBCLK周期)。确保脉冲宽度足够ADC模块可靠捕获,通常1-2个周期即可。

5.3 常见问题排查实录

问题1:配置了死区,但用示波器测量发现上下管驱动信号仍有重叠(直通风险)。

  • 可能原因1DBCTL[OUT_MODE]配置错误。检查是否配置为11(完全启用)。如果配置为0110,则只有一路信号有延迟。
  • 可能原因2DBCTL[IN_MODE]POLSEL配置与你的信号逻辑不匹配。例如,你的原始信号是EPWMxA驱动上管(高有效),EPWMxB驱动下管(低有效)。如果你在POLSEL中反相了EPWMxB,那么死区插入的边沿可能就错了。建议:先用OUT_MODE=00旁路死区,确认AQ模块产生的原始互补信号是正确的。然后再开启死区,并配合示波器观察IN_MODEPOLSEL不同组合下的波形。
  • 可能原因3DBREDDBFED值设置过小,小于功率管的关断延迟。重新计算并增大死区时间。

问题2:Trip-Zone保护似乎不生效,过流时没有关闭PWM。

  • 排查步骤
    1. 确认故障输入:首先用GPIO读取或示波器观察TZx引脚,确认故障发生时该引脚电平是否确实变低(默认低电平有效)。
    2. 检查TZSEL:确认对应引脚的CBCxOSHTx位已使能。
    3. 检查TZCTL:确认对应通道(TZA/TZB)配置的动作不是11(无动作)。
    4. 检查TZ引脚复用:确认该引脚的GPIO复用功能是否已正确配置为TZx,而不是普通的输入输出。
    5. 检查内部下拉:TZ引脚内部通常有弱上拉。如果外部故障电路是开集/开漏输出,需要确保能可靠拉低该引脚。

问题3:修改CMPA/CMPB值后,PWM波形变化不是立即生效,而是有延迟。

  • 原因:这是影子寄存器机制在起作用。你修改的是影子寄存器,需要等到指定的加载点(如CTR=PRD, CTR=ZRO)才会生效。
  • 解决方案:如果确实需要立即更新(在某些特殊控制算法中),可以将CMPA/CMPB配置为“立即加载”模式(对应的CMPCTL寄存器中LOADAMODE=0,LOADBMODE=0)。但要注意,这可能在PWM周期中间产生毛刺。绝大多数电机和电源应用都应使用影子寄存器模式以确保波形稳定。

问题4:使用软件强制(AQCSFRC)后,无法恢复正常PWM输出。

  • 原因:连续软件强制(CSFA/CSFB)的优先级最高,它会覆盖所有动作限定事件。你虽然清除了故障源,但没有清除强制状态。
  • 解决:在需要恢复时,务必记得将AQCSFRC中的CSFACSFB位写回00(禁用强制)。
    EPwm1Regs.AQCSFRC.bit.CSFA = 0; // 释放对EPWMxA的强制 EPwm1Regs.AQCSFRC.bit.CSFB = 0; // 释放对EPWMxB的强制 // 同时,确保AQSFRC[RLDCSF]配置正确,以便更改能同步生效。

通过对TMS320F2803x ePWM模块动作限定和死区控制寄存器的深入剖析,我们可以看到,强大的灵活性背后是相对复杂的配置逻辑。我的经验是,在项目初期,最好拿出一张纸,画出你期望的PWM波形图,标出每个边沿对应的计数器事件和动作,然后再去填写各个寄存器的值。充分利用仿真器和示波器,先验证基础波形,再加入死区,最后整合故障保护。这样层层递进,才能构建出稳定可靠的功率驱动系统。记住,这些寄存器配置是硬件行为的直接描述,理解它们,你就掌握了让电机精确转动的底层密码。