1. eHRPWM核心架构与寄存器概览
在嵌入式电机控制、数字电源和逆变器领域,生成精确、稳定且可灵活配置的PWM波形是系统成败的关键。德州仪器(TI)在其C2000系列等微控制器中集成的增强型高分辨率脉宽调制器(eHRPWM)模块,正是为此类高性能应用而设计。与基础PWM模块相比,eHRPWM的强大之处在于其高度模块化和可编程性,而这一切都通过一系列精心设计的寄存器来实现。理解这些寄存器,就如同拿到了驾驭这匹“电控烈马”的缰绳。
eHRPWM模块可以看作一个由多个功能子模块串联而成的精密流水线。其核心数据流始于时基(Time-Base)子模块,这里有一个核心计数器(TBCNT)在不停地循环计数,计数范围由周期寄存器(TBPRD)定义,从而决定了PWM的基波频率。计数器的计数模式(递增、递减、递增-递减)和相位(TBPHS)也在此设定,为多模块同步运行奠定了基础。
当时基计数器的值与比较(Counter-Compare)子模块中预设的CMPA或CMPB寄存器值匹配时,就会产生一个“匹配事件”。这个事件本身只是一个内部信号,它需要被翻译成具体的硬件引脚动作。这个翻译官就是动作限定器(Action-Qualifier)子模块。AQCTLA和AQCTLB等寄存器定义了当“计数器等于CMPA且正在递增”、“计数器等于周期值”、“计数器等于零”等多种事件发生时,对应的EPWMxA和EPWMxB输出引脚应该执行什么操作:保持原样、拉高、拉低还是翻转。通过组合这些事件和动作,我们就能构造出中心对称、边沿对齐等不同模式的PWM波。
生成的原始PWM信号还会经过后续的死区(Dead-Band)子模块,插入可编程的上升沿或下降沿延迟,防止桥式电路中的上下管直通;可能经过PWM斩波器(PWM-Chopper)生成高频载波,用于驱动栅极驱动器;最后,故障保护(Trip-Zone)子模块像一位警觉的哨兵,随时监控外部故障引脚,一旦发生异常,能立即按照预设策略(如强制输出高、低或高阻态)保护系统。
整个流程的每一个环节,其行为模式、参数、使能状态都由对应的寄存器控制。因此,寄存器编程是eHRPWM应用的基石。下面,我们将深入最核心的时基和动作限定器寄存器,拆解每一个比特位的含义,并结合实际应用场景,探讨如何配置它们来实现具体的波形。
2. 时基子模块:PWM的节拍器与同步引擎
时基子模块是eHRPWM的心脏,它定义了PWM波形的“时间基准”。想象一下音乐中的节拍器,它以一个固定的频率发出滴答声,所有乐器的节奏都以此为准。TBCNT就是这个节拍器的指针,TBPRD定义了指针摆动的范围(一小节有多少拍),而TBPHS则允许你微调某个乐器的起拍时机,实现复杂的合奏。
2.1 时基周期寄存器(TBPRD):定义PWM频率
TBPRD寄存器直接决定了PWM载波的频率。在递增计数模式下,计数器从0开始计数到TBPRD值,然后归零,如此循环。因此,PWM的频率(Fpwm)由系统时钟(TBCLK)和TBPRD共同决定:Fpwm = TBCLK / (TBPRD + 1)。
这里有一个至关重要的概念:影子寄存器(Shadow Register)。TBPRD寄存器通常工作在影子模式下(通过TBCTL[PRDLD]位控制)。这意味着你通过软件写入的值,并不会立即改变正在运行的PWM周期,而是先存入一个“影子寄存器”。只有当时间基计数器(TBCNT)归零的那个瞬间,影子寄存器中的值才会被加载到“活动寄存器(Active Register)”中,从而真正改变下一个PWM周期的频率。
注意:这种影子机制是eHRPWM实现无毛刺、平滑改变PWM参数的关键。试想一下,如果你在计数器运行到一半时直接改写周期值,可能会导致当前周期被突然截断或拉长,产生一个畸变的脉冲,这在电机驱动中可能引发电流冲击。影子寄存器确保了参数变更只在周期边界安全地生效。
TBPRD配置示例: 假设系统时钟TBCLK = 100 MHz,我们需要产生一个20 kHz的PWM波用于电机控制。 计算过程:TBPRD = (TBCLK / Fpwm) - 1 = (100e6 / 20e3) - 1 = 5000 - 1 = 4999。 因此,我们需要将十进制数4999(十六进制0x1387)写入TBPRD寄存器。在影子模式下,这个写入操作会发生在下一个PWM周期开始时。
2.2 时基计数器寄存器(TBCNT):系统的核心节拍
TBCNT是一个16位可读写的寄存器,它实时反映了时基计数器的当前值。你可以读取它来了解PWM周期当前的进度,这在某些需要与计数器值同步的复杂控制算法中很有用。你也可以直接写入一个值来强制改变计数器的当前位置,但这通常用于非常特殊的调试或同步场景,需要格外小心。
实操心得:直接写入TBCNT寄存器是“立即生效”的,没有影子缓冲。这意味着你的写入操作与TBCLK时钟不同步,可能会在计数器时钟周期的任意时刻生效,导致不可预测的、短于一个时钟周期的毛刺。在绝大多数应用场景中,应避免在运行时直接写TBCNT。同步和相位调整应通过TBPHS寄存器配合同步事件来完成,这才是安全可靠的方法。
2.3 时基相位寄存器(TBPHS):实现多PWM模块的精确同步
在复杂的多相电机驱动或交错并联电源中,经常需要多个eHRPWM模块输出彼此之间存在固定相位差的PWM信号。TBPHS寄存器就是实现这一功能的核心。
它的工作原理是:当一个eHRPWM模块接收到一个同步输入信号(EPWMxSYNCI)或一个软件强制同步信号时,如果其相位使能位(TBCTL[PHSEN])被置位,那么它的TBCNT计数器不会从0开始计数,而是立即被加载为TBPHS寄存器中设定的相位值,然后从这个值开始继续计数。
同步配置步骤解析:
- 确定主从关系:选择一个eHRPWM模块作为主模块(Master),将其配置为在特定事件(如计数器为零)时产生同步输出信号(EPWMxSYNCO)。
- 配置从模块相位:在从模块(Slave)中,写入TBPHS寄存器为目标相位值。例如,如果主从模块的TBPRD都设置为1000,从模块的TBPHS设置为250,那么从模块的波形将滞后主模块90度(250/1000 * 360°)。
- 使能从模块相位加载:将从模块的TBCTL[PHSEN]位设置为1,使其在接收到同步信号时加载相位。
- 连接同步链:将主模块的同步输出(EPWMxSYNCO)连接到从模块的同步输入(EPWMxSYNCI)。
这样,每当主模块的计数器归零并发出同步脉冲时,所有配置好的从模块都会将自己的计数器设置为各自的TBPHS值,从而实现精确的、可编程的相位差同步。这种硬件同步的精度远高于软件干预,且没有延迟和抖动。
3. 比较子模块:PWM脉宽的设定者
时基子模块产生了均匀的时间流,而比较子模块则负责在这个时间流上“刻下标记”,决定PWM脉冲的边沿位置。它包含两个主要的比较寄存器:CMPA和CMPB。
3.1 比较寄存器(CMPA/CMPB)与影子机制
CMPA和CMPB寄存器的工作原理非常直观:硬件持续将TBCNT的值与CMPA/CMPB活动寄存器的值进行比较。当两者相等时,就会产生一个“匹配事件”(CTR = CMPA 或 CTR = CMPB)。这个事件被发送给动作限定器,进而控制输出引脚。
与TBPRD类似,CMPA和CMPB也支持强大的影子寄存器机制,由CMPCTL寄存器中的SHDWAMODE和SHDWBMODE位控制。在影子模式下,软件对CMPA/CMPB的写入操作只是更新了影子寄存器,而活动寄存器在何��加载影子值,则由CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]位精细控制。
加载模式(LOADAMODE/LOADBMODE)详解:
- 00b:在CTR=0时加载。这是最常用的模式,新的比较值在每个PWM周期开始时(计数器归零)生效,确保整个周期的脉宽一致,避免周期中间出现脉宽突变。
- 01b:在CTR=PRD时加载。在递增-递减计数模式下,计数器先增后减。此模式允许新的比较值在计数器达到峰值(TBPRD)时生效。
- 10b:在CTR=0或CTR=PRD时加载。结合了上述两者,在周期开始或中间(峰值点)都可以更新,为一些高级调制算法(如周期中点更新)提供了可能。
- 11b:冻结,不加载。影子寄存器的值不会被自动加载到活动寄存器,需要软件切换到立即模式或改变加载模式来触发。
CMPAHR高分辨率寄存器:对于支持高分辨率PWM(HRPWM)的ePWM实例,CMPAHR寄存器与CMPA配合,可以将边沿定位的精度从传统的TBCLK周期级别,提升到皮秒(ps)级别。这是通过微边沿定位器(MEP)技术实现的,CMPAHR提供了子TBCLK周期的精细调整位。这对于需要极高开关频率或对谐波有严格要求的数字电源应用至关重要。
3.2 比较控制寄存器(CMPCTL)的深度应用
CMPCTL寄存器除了控制影子模式,还提供了两个重要的状态位:SHDWAFULL和SHDWBFULL。这两个位指示CMPA和CMPB的影子FIFO是否已满。
避坑指南:这是一个极易被忽视但可能导致严重错误的细节。在影子模式下,对CMPA/CMPAHR的32位写入或对CMPA的16位写入,会设置SHDWAFULL标志。该标志在发生一次加载事件(如CTR=0)后自动清零。如果在SHDWAFULL=1时再次写入CMPA,新值会覆盖尚未被加载的旧影子值。这意味着你预设的脉宽可能永远不会生效。安全的编程实践是,在需要频繁更新比较值的应用中(如实时电流环),采用“乒乓”缓冲策略,或者使用立即模式(SHDWAMODE=1)进行单次更新。更稳妥的方法是,在写入前检查SHDWAFULL位,确保影子缓冲区为空。
4. 动作限定器子模块:波形生成的导演
动作限定器(AQ)是eHRPWM中最具艺术性的部分。时基和比较器定义了“何时”(When),而动作限定器则定义了“做什么”(What)。它将枯燥的计数器匹配事件,翻译成丰富多彩的引脚电平变化,最终塑造出我们需要的PWM波形。
4.1 动作限定控制寄存器(AQCTLA/AQCTLB)的位域精解
AQCTLA和AQCTLB寄存器结构对称,分别控制EPWMxA和EPWMxB输出引脚。每个寄存器都包含6个关键的2位字段(CAU, CAD, CBU, CBD, PRD, ZRO),每个字段对应一种特定的事件,并定义在该事件发生时引脚应执行的动作(00-无动作,01-拉低,10-拉高,11-翻转)。
理解这些事件的关键在于结合计数器的方向。在递增-递减计数模式下,计数器先向上计数到TBPRD,再向下计数到0。
- CAU (Counter equals CMPA when incrementing):计数器向上计数时等于CMPA。
- CAD (Counter equals CMPA when decrementing):计数器向下计数时等于CMPA。
- ZRO (Counter equals zero):计数器等于0。注意,在递增-递减模式下,此时方向被定义为向上(递增)。
- PRD (Counter equals period):计数器等于TBPRD。在递增-递减模式下,此时方向被定义为向下(递减)。
通过组合这些事件和动作,我们可以构建出各种标准PWM波形:
示例1:生成一对互补的、带死区的PWM信号(用于半桥驱动)假设我们使用递增-递减计数模式,希望EPWMxA在主功率管导通时为高电平,EPWMxB在互补功率管导通时为高电平。
- 配置CMPA:CMPA的值决定了脉冲宽度。假设TBPRD=1000,需要50%占空比,则设置CMPA=500。
- 配置AQCTLA (控制EPWMxA):
ZRO = 10b (Set):计数器从0开始向上计数时,将EPWMxA置高。CAU = 01b (Clear):计数器向上计数到CMPA(500)时,将EPWMxA拉低。CAD = 01b (Clear):计数器向下计数到CMPA(500)时,保持低电平(或设为无动作,因为此时已是低电平)。PRD = 01b (Clear):计数器到周期值时,保持低电平。
- 配置AQCTLB (控制EPWMxB):
ZRO = 01b (Clear):计数器从0开始时,EPWMxB为低。CAU = 10b (Set):计数器向上到CMPA(500)时,将EPWMxB置高。CAD = 10b (Set):计数器向下到CMPA(500)时,保持高电平。PRD = 01b (Clear):计数器到周期值时,将EPWMxB拉低。
这样,我们就得到了中心对称的PWM波形。EPWMxA在计数区间[0, 500)为高,EPWMxB在计数区间[500, 1000)为高,两者之间存在一个死区(两者都为低的区域)。实际的死区时间还需要通过后续的死区模块来精确插入。
示例2:生成边沿对齐的PWM波形使用递增计数模式,TBPRD=1000。
- 配置AQCTLA:
ZRO = 10b (Set):周期开始时置高。CAU = 01b (Clear):计数到CMPA时拉低,形成下降沿。PRD事件在递增模式下不会发生(计数器到PRD后归零,产生的是ZRO事件),可配置为无动作。
4.2 软件强制寄存器(AQSFRC/AQCSFRC):动态干预的利器
动作限定器不仅响应硬件事件,还能响应软件命令,这为动态控制、测试和故障恢复提供了极大便利。
一次性软件强制(AQSFRC):通过设置OTSFA/OTSFB位可以立即产生一个强制事件,并根据ACTSFA/ACTSFB位的配置执行一次性的置高、拉低或翻转操作。该位在事件触发后自动清零。这非常适用于在调试阶段手动触发一个特定的边沿变化,或者在特定算法条件下覆盖当前的PWM输出状态。
连续软件强制(AQCSFRC):通过配置CSFA/CSFB位,可以持续强制输出为高、低或禁用强制。在立即模式下,强制效果在下个TBCLK边沿生效;在影子模式下,则要等到影子寄存器被加载到活动寄存器后才生效(由AQSFRC[RLDCSF]控制加载时机)。这个功能在系统启动初始化、故障安全状态维持或者需要将PWM输出锁定在某个固定电平时极其有用。例如,在系统上电初始化期间,你可以先将PWM输出连续强制为低电平,确保功率开关管处于关断状态,待所有参数配置完成、系统稳定后再解除强制,切换到正常的硬件比较模式。
重要提示:软件强制事件的优先级高于由计数器比较产生的常规事件。这意味着,一旦你启用了连续强制输出高,那么无论CMPA/CMPB如何匹配,AQCTLA/AQCTLB如何配置,输出引脚都会被锁定在高电平。在使用强制功能后,务必记得在适当的时候将其禁用(CSFA/CSFB=0或3),否则PWM将失去调制功能。
5. 高级配置与故障保护机制
在掌握了时基、比较和动作限定这三个核心子模块后,eHRPWM的骨架已经搭建完成。但要应对真实的工业环境,尤其是电机驱动和电源这类高可靠性要求的场景,还需要死区控制和故障保护这两个“安全卫士”。
5.1 死区生成器控制:防止桥臂直通的守护者
在半桥或全桥电路中,同一桥臂的上下两个开关管绝不能同时导通,否则会造成电源短路,瞬间烧毁器件。死区时间就是在控制信号中插入的一段两个管子都关断的小��时。
eHRPWM的死区模块(DB)通过DBRED(上升沿延迟)和DBFED(下降沿延迟)两个10位寄存器来独立设置延迟的时钟周期数。其核心控制逻辑在DBCTL寄存器中:
- IN_MODE:选择哪个输入信号(EPWMxA或EPWMxB)作为上升沿和下降沿延迟的源。经典配置是EPWMxA作为两路延迟的源。
- POLSEL:选择是否对延迟后的信号进行反相。这可以方便地生成适合驱动P-MOS和N-MOS,或者带互补输出的驱动芯片的信号。
- OUT_MODE:决定是否启用死区功能。你可以选择完全旁路、仅启用上升沿延迟、仅启用下降沿延迟或两者都启用。
典型死区配置流程:
- 根据开关管的开通/关断时间以及驱动电路延迟,计算出需要插入的死区时间
T_dead。 - 根据系统时钟
TBCLK周期,计算延迟计数值:DEL_Val = T_dead / T_TBCLK。将结果分别写入DBRED和DBFED。 - 配置DBCTL:
IN_MODE = 00b:使用EPWMxA作为两路延迟的输入源。POLSEL = 00b:采用主动高模式(AH),输出不反相。OUT_MODE = 11b:完全启用上升沿和下降沿延迟。
经过此配置,从动作限定器输出的原始EPWMxA信号,其上升沿将被延迟DBRED个时钟,下降沿被延迟DBFED个时钟,生成最终的EPWMxA_DB信号。同时,模块内部会生成一个与EPWMxA_DB互补的EPWMxB_DB信号(具体逻辑由IN_MODE和POLSEL决定),从而得到一对自带死区的互补PWM信号。
5.2 故障保护子模块:系统的紧急制动
故障保护(Trip-Zone)是eHRPWM的硬件安全回路。它允许外部故障信号(如过流、过温、过压传感器的输出)直接连接到微控制器的TZn引脚,无需CPU干预,即可在数百纳秒内强制PWM输出进入安全状态。
故障保护工作流程与关键寄存器:
故障源选择(TZSEL):首先,你需要通过TZSEL寄存器告诉ePWM模块,哪些TZn引脚被用作故障源,以及它们是“一次性(OSHT)”还是“逐周期(CBC)”触发模式。
- 一次性触发(One-Shot):当故障引脚有效时,立即触发保护动作,并且这个故障状态会被锁存,直到软件通过TZCLR寄存器明确清除它。适用于严重的、需要系统完全停机的故障,如硬件过流。
- 逐周期触发(Cycle-By-Cycle):当故障引脚有效时,触发保护动作,但该故障状态会在每个PWM周期开始时(TBCNT=0)自动清零。如果此时故障条件仍然存在,则会再次触发。适用于需要限流但不必完全停机的场景,如峰值电流保护。
保护动作配置(TZCTL):当故障发生时,你希望PWM输出引脚做什么?TZCTL寄存器为EPWMxA和EPWMxB分别定义了四种动作:
- 00b:高阻态(High-Z)。这是最常用的安全状态,直接关闭驱动,让功率管处于浮空状态。
- 01b:强制高。
- 10b:强制低。
- 11b:无动作。
对于大多数桥式电路,在故障时设置为高阻态是最安全的,可以快速关断所有开关管。
中断使能与状态管理(TZEINT, TZFLG, TZCLR):
- TZEINT:你可以选择在发生一次性或逐周期故障时,是否向CPU产生一个中断(EPWMxTZINT),以便在中断服务程序中进行故障记录、系统状态恢复等操作。
- TZFLG:该寄存器包含了故障标志位(OST, CBC)和一个总的中断状态标志位(INT)。你可以通过读取它们来判断故障类型。
- TZCLR:用于清除TZFLG中的标志位。对于一次性故障,必须在故障条件解除后,手动写入TZCLR来清除OST标志,否则PWM输出将一直被强制在安全状态。
故障保护配置示例: 假设我们将过流信号连接至TZ1引脚,希望它在故障时立即关闭PWM并产生中断。
// 1. 配置TZ1为一次性故障源 EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能TZ1为OSHT源 // 2. 配置故障动作:输出高阻态 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HIZ; // TZA动作:高阻 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_HIZ; // TZB动作:高阻 // 3. 使能一次性故障中断 EPwm1Regs.TZEINT.bit.OST = 1; // 在中断服务程序中: void EPWM1_TZ_ISR(void) { if (EPwm1Regs.TZFLG.bit.OST == 1) { // 1. 记录故障,进行系统诊断... SystemLogFault(); // 2. 清除故障标志(前提是外部故障信号已消失) EPwm1Regs.TZCLR.bit.OST = 1; // 3. 清除中断标志 EPwm1Regs.TZCLR.bit.INT = 1; // 4. 可能需要软件重新使能PWM输出(例如,重新配置AQ输出模式) EALLOW; EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // ... 其他AQ配置 EDIS; } PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; }6. 实战配置案例与常见问题排查
理论最终要服务于实践。我们以一个典型的无刷直流电机(BLDC)六步换相控制中的PWM配置为例,串联起多个寄存器的使用。
场景:使用一个eHRPWM模块(EPWM1)生成一对带死区的互补PWM信号(EPWM1A和EPWM1B),用于驱动一个半桥。PWM频率为20kHz,死区时间为1us,系统时钟SYSCLKOUT为100MHz,ePWM时钟预分频后TBCLK=100MHz。
配置步骤与代码解析:
初始化时基模块:
// 设置时基时钟预分频(假设已在InitSysCtrl中配置为/1) EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT // 设置计数模式为递增-递减,以产生中心对称PWM(降低谐波) EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 设置相位寄存器为0(作为主模块) EPwm1Regs.TBPHS.half.TBPHS = 0; // 禁止相位加载(主模块通常不需要) EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 设置周期值,决定PWM频率 // Fpwm = TBCLK / (2 * TBPRD) 因为上下计数模式周期是2*TBPRD // TBPRD = (TBCLK / (2 * Fpwm)) - 1? 这里注意:在Up-Down模式下,计数器从0计数到TBPRD再回到0,一个完整周期是2*TBPRD个时钟。 // 公式应为:PWM_Period = (TBCLK / Fpwm) 个时钟周期。 // 在Up-Down模式下,TBPRD = (PWM_Period / 2) - 1? 不完全是。在TI的库中,通常直接设置TBPRD为 (PWM_Period / 2)。 // 更准确的计算:PWM_Period (in TBCLK cycles) = TBCLK / Fpwm. // 在Up-Down模式,计数器从0到TBPRD再到0,计数值变化了 2 * TBPRD 次。 // 因此,令 2 * TBPRD = PWM_Period => TBPRD = PWM_Period / 2. // 代入数值:PWM_Period = 100e6 / 20e3 = 5000 TBCLK cycles. // TBPRD = 5000 / 2 = 2500. EPwm1Regs.TBPRD = 2500; // 对应20kHz中心对称PWM // 使能影子寄存器加载模式,在CTR=0时加载新周期值 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 清除计数器 EPwm1Regs.TBCNT = 0;配置比较模块:
// 设置初始占空比为50% -> CMPA = TBPRD / 2 = 1250 EPwm1Regs.CMPA.half.CMPA = 1250; // 配置CMPA为影子模式,并在CTR=0时加载(每个PWM周期开始更新) EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 我们暂时不使用CMPB EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;配置动作限定器:
// 配置EPWM1A输出:在计数器=0时置高,在向上计数到CMPA时拉低,向下计数到CMPA时无动作(保持低),在计数器=周期时无动作。 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 计数开始,输出高 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 向上匹配CMPA,输出低 EPwm1Regs.AQCTLA.bit.CAD = AQ_NO_ACTION; // 向下匹配CMPA,无动作 EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; // 计数到周期值,无动作 // 配置EPWM1B输出为互补信号:在计数器=0时置低,在向上���数到CMPA时置高,向下计数到CMPA时无动作(保持高),在计数器=周期时拉低。 EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; EPwm1Regs.AQCTLB.bit.CAD = AQ_NO_ACTION; EPwm1Regs.AQCTLB.bit.PRD = AQ_CLEAR;配置死区模块:
// 计算死区计数值:死区时间1us, TBCLK周期 = 1/100MHz = 10ns。 // 所需延迟时钟数 = 1us / 10ns = 100。 Uint16 dbValue = 100; EPwm1Regs.DBRED = dbValue; // 上升沿延迟 EPwm1Regs.DBFED = dbValue; // 下降沿延迟 // 配置死区控制:输入源为EPWMxA,输出不反相,完全启用死区 EPwm1Regs.DBCTL.bit.IN_MODE = DBA_IN_MODE; // 00b: EPWMxA as source for both EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HI; // 00b: Active high, no inversion EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 11b: Enable both rising and falling edge delay
常见问题排查速查表:
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| 无PWM输出 | 1. 模块未使能或时钟未开启。 2. 输出引脚未正确映射到GPIO。 3. TBCNT未启动计数(CTRMODE配置错误)。 4. AQCTLA/AQCTLB所有动作位均配置为“无动作”。 | 1. 检查外设时钟控制寄存器(PCLKCRx)中对应ePWM模块的使能位。 2. 检查GPIO多路复用器(GPxMUX)配置,将引脚设置为ePWM功能。 3. 确认TBCTL.CTRMODE不为“冻结”模式(00b)。 4. 检查AQCTLA/AQCTLB,确保至少有一个事件(如ZRO或PRD)配置了SET或CLEAR动作。 |
| PWM频率不对 | 1. TBPRD计算或设置错误。 2. TBCLK时钟源或分频配置错误。 3. 计数模式理解有误(递增 vs 递增-递减)。 | 1. 重新计算TBPRD,并检查写入的寄存器值。使用示波器测量周期验证。 2. 检查TBCTL.HSPCLKDIV和CLKDIV分频设置,确认TBCLK频率符合预期。 3. 牢记:递增模式下,频率 = TBCLK / (TBPRD+1);递增-递减模式下,频率 = TBCLK / (2 * TBPRD)。 |
| 占空比无法改变 | 1. CMPA/CMPB影子寄存器未成功加载到活动寄存器。 2. 写入CMPA时SHDWAFULL=1,导致新值覆盖未生效的旧值。 3. LOADAMODE/LOADBMODE配置为“冻结”模式。 4. 比较值大于或等于TBPRD(在递增模式下会导致100%或0%占空比)。 | 1. 检查CMPCTL.SHDWAMODE和LOADAMODE配置,确保影子模式已使能并设置了正确的加载点(如CTR=0)。 2. 在更新CMPA前,读取CMPCTL.SHDWAFULL位,确保其为0。或采用“先读后写”策略规避。 3. 确认LOADAMODE不为11b(冻结)。 4. 确保CMPA值在0到TBPRD之间(递增模式)。 |
| 死区时间不生效 | 1. 死区模块未使能(DBCTL.OUT_MODE配置错误)。 2. DBRED/DBFED寄存器值为0。 3. 输入信号源选择(DBCTL.IN_MODE)错误,导致延迟应用到了错误的信号上。 | 1. 确认DBCTL.OUT_MODE设置为01b, 10b或11b以启用至少一路延迟。 2. 检查并计算正确的死区计数值写入DBRED/DBFED。 3. 根据硬件连接(是使用EPWMxA还是EPWMxB作为延迟源),正确配置DBCTL.IN_MODE。 |
| 故障保护不动作 | 1. TZn引脚未配置为ePWM故障输入功能。 2. TZSEL寄存器未使能对应的故障源(OSHTn/CBCn)。 3. TZCTL配置为“无动作”(11b)。 4. 一次性故障发生后未清除TZFLG.OST标志,导致输出持续被强制。 | 1. 检查GPIO配置,将TZn引脚功能选择为ePWM故障输入。 2. 确认TZSEL中对应故障引脚和触发模式(OSHT/CBC)的位已置1。 3. 检查TZCTL寄存器,为TZA和TZB配置了所需的安全动作(如00b高阻态)。 4. 在故障条件解除后,在软件中向TZCLR.OST位写1以清除锁存标志。 |
| 多模块同步相位错乱 | 1. 从模块的TBCTL.PHSEN未使能。 2. 主模块未产生同步输出信号(EPWMxSYNCO)。 3. 同步链连接错误或存在环路。 4. 从模块的TBPHS值设置错误。 | 1. 确认所有需要同步的从模块TBCTL.PHSEN = 1。 2. 配置主模块的TBCTL.SYNCOSEL,使其在特定事件(如CTR=0)时产生同步输出。 3. 仔细检查硬件同步链的连接,确保是单向的,避免形成闭环。 4. 根据相位差计算公式(相位差 = TBPHS / TBPRD * 360°)重新计算并设置从模块的TBPHS值。 |
调试eHRPWM时,最有效的工具是结合代码审查、寄存器查看器(在CCS等IDE中)和示波器。首先确保软件配置与设计意图完全一致,然后通过示波器观察实际波形,将两者对比,就能快速定位问题所在。