深入解析C2000 EPWM模块:斩波、故障保护与事件触发的工程实践

📅 2026/7/21 23:16:13 👁️ 阅读次数 📝 编程学习
深入解析C2000 EPWM模块:斩波、故障保护与事件触发的工程实践

1. EPWM模块核心功能再认识:不止于基础PWM

在电力电子和电机驱动的世界里,脉宽调制(PWM)是工程师手中最基础的“画笔”。我们用它描绘出变频器的V/F曲线,勾勒出伺服电机的精准轨迹,也构建了各类电源的稳定输出。但如果你认为PWM仅仅是设置一个周期和占空比,那可能就错过了现代数字电源控制器一半的威力。以TI C2000系列DSP中的增强型PWM(EPWM)模块为例,它早已超越简单的信号发生器角色,进化成一个集成了精密时序控制、多重安全保护和智能事件调度于一体的子系统。

基础的PWM生成,依靠时基(TB)、计数比较(CC)和动作限定(AQ)子模块协作,这相当于我们有了一个精准的时钟和一把可以任意设定刻度的尺子,能决定在周期的哪个时刻让输出跳变。但这对于驱动一个实际的功率桥臂,尤其是使用脉冲变压器或隔离驱动器时,还远远不够。你可能会遇到这些问题:如何确保功率管在复杂噪声环境下可靠开通?系统检测到过流后,如何在纳秒级内关闭驱动,避免炸管?ADC采样如何与PWM波形的特定点(比如周期中心)严格同步,以获取最准确的电流值?

EPWM模块中的斩波(PC)、故障保护(TZ)和事件触发(ET)这三个子模块,正是为解决这些工程实践中的核心痛点而生。PWM斩波模块,你可以把它理解为一个“高频调制器”,它能在你生成的主PWM波形上,叠加一个更高频率的载波,这个特性对于驱动脉冲变压器门极至关重要,因为它能优化变压器的磁复位,防止饱和。故障保护模块则像是一个反应极快的“安全卫士”,它通过独立的硬件路径监控多个外部故障信号(如过流、过温),一旦出事,无需CPU干预,直接对PWM输出执行强制动作(拉高、拉低或高阻),实现硬件级的保护。事件触发模块则扮演了“系统协调员”的角色,它时刻监视着PWM波形上的关键事件点(比如计数器为零、等于比较值A/B),并能在这些精确时刻产生中断或启动ADC转换的脉冲,让CPU采样、算法计算与功率开关动作完美同步。

理解并熟练运用这三个模块,意味着你能从“让电机转起来”进阶到“让系统安全、高效、精准地运行”。接下来,我们就深入AM275x的EPWM模块,拆解这三个子模块的运作机理与配置细节。

2. PWM斩波(PC)子模块:驱动脉冲变压器的关键

2.1 为什么需要斩波?从脉冲变压器驱动说起

在高压或需要电气隔离的场合,比如IGBT、SiC MOSFET的驱动,我们常使用脉冲变压器或基于变压器的隔离驱动器。直接用一个宽脉冲的PWM波去驱动变压器原边会有一个问题:变压器铁芯可能饱和。变压器依靠交变的磁通工作,如果施加的单向脉冲宽度过大,磁通会持续朝一个方向增加,最终导致铁芯饱和,励磁电流激增,驱动器发热甚至损坏。

PWM斩波模块的引入,就是为了解决这个问题。它的核心思想是:将一个宽的主PWM脉冲(比如代表一个开关周期内导通的部分),用另一个频率高得多的载波信号进行“斩切”,将其变成一连串高频的窄脉冲序列。这样,施加在变压器原边的电压就是交变的,每个高频脉冲的上升沿和下降沿都会在变压器中产生反向的电动势,帮助磁芯复位,从而避免了直流偏磁导致的饱和。

2.2 模块结构与核心寄存器一览

从系统框图中可以看到,PWM斩波模块位于动作限定器(AQ)和死区(DB)模块之后。这意味着,AQ和DB模块生成的、已经处理好死区和逻辑的最终PWM波形(EPWMxA和EPWMxB),会送入PC模块进行最后的“加工”。

控制这个模块的寄存器只有一个:EPWM_PCCTL(偏移地址 0x3C)。它是一个非影子寄存器,意味着修改立即生效,这在动态调整斩波参数时需要特别注意。其关键控制位如下:

  • CHPEN (Bit 0): 斩波使能位。0=禁用(直通模式),1=使能斩波功能。
  • OSHTWTH (Bits 4:1): 首脉冲宽度控制位。4位可编程,值范围1-16,决定了第一个脉冲的宽度。
  • CHPFREQ (Bits 7:5): 斩波(载波)频率分频系数。控制载波时钟(PSCLK)相对于系统时钟(FICLK)的分频比。
  • CHPDUTY (Bits 10:8): 后续脉冲占空比控制位。3位可编程,可选择7种不同的占空比(12.5% 到 87.5%)。

2.3 工作波形与参数计算详解

PC模块的工作流程可以清晰地分为两个阶段:首脉冲生成阶段后续维持脉冲阶段

首脉冲(One-Shot Pulse):当输入的PWM信号(来自AQ模块)从低变高时,PC模块会先产生一个宽度可编程的独立脉冲。这个脉冲通常被设计得比较宽,目的是在开关管开通瞬间,为栅极电容提供足够大的充电电流,实现快速、坚决的“硬开通”,减小开通损耗,并增强抗干扰能力。其宽度计算公式为:T_first_pulse = T_FICLK × 8 × OSHTWTH其中,T_FICLK是系统时钟FICLK的周期,OSHTWTH是寄存器中设置的1到16的数值。例如,若FICLK = 100MHz (周期10ns),设置OSHTWTH=4,则首脉冲宽度为 10ns × 8 × 4 = 320ns。

后续维持脉冲(Sustaining Pulses):首脉冲结束后,PC模块会启动高频载波发生器,用其去调制剩余的PWM高电平部分,产生一串连续的窄脉冲。这串脉冲的作用是在开关管整个导通期间,维持其栅极电压,确保管子完全导通且状态稳定。

  • 载波频率:由CHPFREQ位控制,载波时钟PSCLK = FICLK / (2 * (CHPFREQ+1))。例如,CHPFREQ=0表示2分频,CHPFREQ=1表示4分频,以此类推。
  • 维持脉冲占空比:由CHPDUTY位控制,可选值为1/8 (12.5%), 2/8 (25%), ..., 7/8 (87.5%)。选择合适的占空比,需要综合考虑变压器复位能量和驱动能力。占空比太小,维持电压可能不足;占空比太大,又不利于磁复位。通常需要根据变压器参数和实验调试来确定。

实操心得:斩波参数调试在调试基于脉冲变压器的驱动板时,PC模块的参数是需要重点关注的。一个实用的调试方法是:先用示波器观察变压器原边的电压波形。理想的波形应该是一串幅值稳定、没有明显衰减的脉冲。如果发现脉冲幅值随着主PWM脉宽增加而下降,说明占空比可能太大,变压器磁复位不充分,应调低CHPDUTY。如果开关管开通速度慢、发热大,可以尝试增加OSHTWTH来加宽首脉冲,提供更强的开通驱动能力。载波频率CHPFREQ的选择要避开系统的谐振频率点,以免引发振荡。

2.4 配置示例与代码片段

假设我们需要配置EPWM1A通道的斩波功能,系统时钟FICLK为100MHz,要求首脉冲宽度约500ns,载波频率约5MHz,维持脉冲占空比50%。

  1. 计算参数

    • 首脉冲宽度T_first = 500nsT_FICLK = 10ns。由公式OSHTWTH = T_first / (8 * T_FICLK) = 500 / 80 = 6.25,取整为6。实际脉冲宽度为10ns * 8 * 6 = 480ns
    • 载波频率F_carrier = 5MHz,周期T_carrier = 200ns。载波时钟PSCLK周期应为T_carrier / 2 = 100ns(因为占空比调整是在半个载波周期内进行的)。PSCLK频率为10MHz。FICLK=100MHz,所以分频系数N = 100MHz / 10MHz = 10。根据公式PSCLK = FICLK / (2*(CHPFREQ+1)),可得CHPFREQ+1 = 100 / (2*10) = 5,因此CHPFREQ = 4
    • 占空比50%,对应CHPDUTY = 4(即4/8)。
  2. 寄存器配置

// 假设 EPWM1 模块的寄存器基地址为 0x4000_0000 volatile struct EPWM_REGS* ePwm1 = (volatile struct EPWM_REGS*)0x40000000; // 首先,使能斩波功能,并设置参数 // PCCTL 寄存器:CHPEN=1, OSHTWTH=6, CHPFREQ=4, CHPDUTY=4 // 位域:[15:11]保留, [10:8]CHPDUTY, [7:5]CHPFREQ, [4:1]OSHTWTH, [0]CHPEN // 计算值:CHPDUTY=4 (0b100), CHPFREQ=4 (0b100), OSHTWTH=6 (0b0110), CHPEN=1 // 合并:0b00000_100_100_0110_1 = 0x121D ePwm1->PCCTL = 0x121D; // 注意:在实际工程中,更安全的做法是使用位域操作或宏定义,避免直接使用魔数 // 例如: #define EPWM_PCCTL_CHPEN 0x0001 #define EPWM_PCCTL_OSHTWTH_S 1 #define EPWM_PCCTL_CHPFREQ_S 5 #define EPWM_PCCTL_CHPDUTY_S 8 ePwm1->PCCTL = (4 << EPWM_PCCTL_CHPDUTY_S) | // CHPDUTY = 4 (50%) (4 << EPWM_PCCTL_CHPFREQ_S) | // CHPFREQ = 4 (6 << EPWM_PCCTL_OSHTWTH_S) | // OSHTWTH = 6 EPWM_PCCTL_CHPEN; // 使能斩波

3. 故障保护(TZ)子模块:硬件级的安全屏障

3.1 故障保护的必要性与设计哲学

在电机驱动、逆变器等大功率场合,功率器件(IGBT、MOSFET)非常昂贵且脆弱。过流、短路、过温等故障必须在微秒甚至纳秒级别内得到响应,如果等到CPU检测到中断再执行软件保护动作,往往为时已晚,结果就是“炸管”。因此,一个独立于CPU、由纯硬件实现的快速保护回路至关重要。

EPWM的故障保护(Trip-Zone)子模块正是为此而生。它提供了多达6路(TZ0至TZ5)异步故障输入引脚,这些引脚通常连接到电流采样比较器的输出、温度传感器的报警输出或其它故障信号。一旦故障发生,信号变低,TZ模块会立即行动,绕过所有软件流程,直接对指定的EPWM输出通道执行强制动作,将风险扼杀在萌芽状态。

3.2 核心机制:单次触发与逐周期保护

TZ模块支持两种保护模式,应对不同性质的故障:

  1. 单次触发(One-Shot, OSHT)模式:适用于严重的、不可自恢复的故障,例如硬件短路、严重过流、驱动电源欠压等。一旦触发,EPWM输出会被强制为预设的安全状态(高、低或高阻),并且这个状态会一直保持,直到软件主动清除故障标志位。这相当于一个“锁存”保护,防止故障未消除时系统自动重启造成二次损坏。
  2. 逐周期(Cycle-By-Cycle, CBC)模式:适用于可自恢复的、需要限流的场景,比如电机的瞬时过载。在该模式下,当故障信号有效时,EPWM输出立即被强制动作。但是,在每个PWM周期开始时(计数器归零时),如果故障信号已经消失,输出会自动恢复正常调制。这种模式允许PWM在每个周期都尝试重新开通,但一旦过流又立即关断,实现了动态的电流峰值限制。

3.3 寄存器组与配置流程

TZ模块由一组寄存器控制,它们都是EALLOW保护的,修改前需要先执行EALLOW指令,修改后执行EDIS

  • EPWM_TZSEL (Trip-Zone Select): 选择本EPWM模块响应哪几个TZ输入引脚,以及每个引脚是OSHT模式还是CBC模式。例如,TZSEL[CBC1]=1表示TZ1引脚作为CBC事件源。
  • EPWM_TZCTL (Trip-Zone Control): 配置当故障发生时,EPWMxA和EPWMxB输出分别执行什么动作。可选动作包括:强制为高、强制为低、强制为高阻态、无动作。
  • EPWM_TZEINT (Trip-Zone Enable Interrupt): 使能特定TZ事件触发CPU中断。即使输出被硬件强制,我们通常也希望CPU能知道故障发生了,以便进行日志记录、故障分类或系统停机。
  • EPWM_TZFLG (Trip-Zone Flag): 故障标志寄存器。当CBC或OSHT事件发生时,相应的标志位会被置1。
  • EPWM_TZCLR (Trip-Zone Clear): 用于清除TZFLG中的标志位。对于CBC事件,标志位可以在中断服务程序中清除;对于OSHT事件,必须在确认故障已排除后,手动清除标志位,PWM输出才会被释放(如果配置为自动恢复)。
  • EPWM_TZFRC (Trip-Zone Force): 软件强制触发寄存器。可以通过写该寄存器来模拟一个故障事件,用于测试保护逻辑是否正常。

3.4 一个完整的故障保护配置实例

假设我们有一个三相逆变器,使用EPWM1A/B驱动第一相上/下桥臂,EPWM2A/B驱动第二相。我们将一个来自电流传感器的比较器输出连接到TZ0引脚。要求:当发生严重过流(OSHT)时,立即关闭所有6个PWM输出(即全部强制为低电平),并产生中断。

  1. 配置TZ引脚映射与模式(以EPWM1为例,EPWM2/3类似):
EALLOW; // 允许写入受保护的寄存器 // 配置 EPWM1 // 将 TZ0 配置为 EPWM1 的 OSHT 事件源 ePwm1->TZSEL.bit.OSHT0 = 1; // TZ0 作为单次触发源 // 也可以同时配置多个源,例如:ePwm1->TZSEL.bit.CBC1 = 1; // TZ1 作为逐周期源 // 配置 EPWM2 ePwm2->TZSEL.bit.OSHT0 = 1; // 配置 EPWM3 ePwm3->TZSEL.bit.OSHT0 = 1; EDIS; // 禁止写入受保护的寄存器
  1. 配置故障动作
EALLOW; // 当 OSHT 事件发生时,将 EPWM1A 和 EPWM1B 强制拉低 // TZCTL[TZA] 和 TZCTL[TZB] 字段: 00=高阻,01=强制高,10=强制低,11=无动作 ePwm1->TZCTL.bit.TZA = TZ_FORCE_LO; // 宏定义通常为 2 ePwm1->TZCTL.bit.TZB = TZ_FORCE_LO; // 同样配置 EPWM2 和 EPWM3 ePwm2->TZCTL.bit.TZA = TZ_FORCE_LO; ePwm2->TZCTL.bit.TZB = TZ_FORCE_LO; ePwm3->TZCTL.bit.TZA = TZ_FORCE_LO; ePwm3->TZCTL.bit.TZB = TZ_FORCE_LO; EDIS;
  1. 使能故障中断
EALLOW; // 使能 TZ0 引起的 OSHT 中断 ePwm1->TZEINT.bit.OST = 1; // 使能单次触发中断 // 注意:还需要在PIE控制器中配置EPWM1_TZINT对应的中断向量和使能 EDIS;
  1. 编写中断服务程序(ISR)
__interrupt void epwm1TzIsr(void) { // 1. 读取标志位,判断是哪种故障(这里只使能了OST) if (ePwm1->TZFLG.bit.OST == 1) { // 2. 进行故障处理,例如:记录故障代码、关闭系统使能、点亮故障灯等 SystemFaultCode = FAULT_OVER_CURRENT; // 3. 清除中断标志位(非常重要!否则会持续进入中断) ePwm1->TZCLR.bit.OST = 1; // 清除OST标志位 // 注意:清除标志位并不会自动恢复PWM输出!输出仍保持强制低电平状态。 // 4. 确认故障已排除后,需要软件清除OST标志并重新配置TZ模块,才能恢复PWM // 通常这需要在一个独立的故障复位流程中完成,而非在中断里。 } // 5. 清除PIE中断应答位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; // 假设EPWM1_TZINT在Group2 }

避坑指南:TZ模块常见问题

  • 故障信号毛刺:TZ输入是异步的,对毛刺敏感。务必在硬件上做好滤波(RC电路),并在软件上考虑数字防抖逻辑,避免误触发。
  • OSHT故障恢复:OSHT触发后,PWM输出被锁存。即使外部故障信号早已消失,输出也不会自动恢复。必须在软件确认安全后,先清除TZFLG寄存器中的OST标志,然后可能需要重新初始化EPWM模块或解除输出强制,这是一个容易遗漏的步骤。
  • 多个EPWM模块共享TZ引脚:如图中所示,所有EPWM模块的TZ0都连接到同一个物理引脚。这意味着一个过流信号可以同时关断所有桥臂,这是优点。但也需要注意,如果只想保护其中一相,需要通过TZSEL寄存器精细配置每个EPWM模块对TZ信号的响应。
  • 中断响应延迟:虽然输出强制是硬件即时动作,但CPU中断响应仍有延迟。中断服务程序中不宜做复杂操作,应仅设置标志、清除中断位,具体的故障处理放在主循环或低优先级任务中。

4. 事件触发(ET)子模块:精准的时序指挥官

4.1 事件触发的应用场景

在实时控制系统中,时序就是生命线。例如,在电机矢量控制(FOC)中,我们需要在PWM周期的特定时刻(通常是中心点或底部)采样相电流,以保证采样的准确性和避免开关噪声。这个“特定时刻”必须与PWM计数器严格同步。事件触发子模块就是负责产生这种精确定时事件的硬件单元。

ET模块监控着时基和计数比较子模块产生的多种事件:

  • CNT_zero: 计数器等于零(周期开始)。
  • PRD_eq: 计数器等于周期值(对于增减计数模式,这也是周期开始或结束;对于增计数,这是周期结束)。
  • CTRU=CMPA: 计数器向上计数时等于CMPA值。
  • CTRD=CMPA: 计数器向下计数时等于CMPA值。
  • CTRU=CMPB: 计数器向上计数时等于CMPB值。
  • CTRD=CMPB: 计数器向下计数时等于CMPB值。

它可以配置为当这些事件发生时,产生两种输出:

  1. 中断(EPWMx_INT):通知CPU在精确的时刻执行任务,如运行电流环、速度环算法。
  2. 启动转换脉冲(SOCA/SOCB):直接触发ADC开始采样,实现了硬件级的同步,消除了软件延迟带来的抖动。

4.2 寄存器详解与分频逻辑

ET模块的核心寄存器包括:

  • EPWM_ETSEL (Event-Trigger Selection): 选择由哪个事件来触发中断(INTSEL)和SOC脉冲(SOCASEL,SOCBSEL),并使能相应的功能(INTEN,SOCAEN,SOCBEN)。
  • EPWM_ETPS (Event-Trigger Prescale): 这是一个非常实用的功能。INTPRDSOCxPRD位域可以设置事件分频。例如,可以设置为每发生1次2次3次选定事件,才产生一次中断或SOC脉冲。这对于降低CPU中断频率或实现特定采样规律(如每两个PWM周期采样一次)非常有用。INTCNTSOCxCNT是只读计数器,显示当前已发生的事件次数。
  • EPWM_ETFLG / ETCLR / ETFRC: 标志位、清除和强制寄存器,用于状态查询、清除中断标志和软件调试触发。

其工作逻辑是一个典型的“计数器-比较器”模式:ETPS[INTCNT]计数器对选定的事件进行计数,当计数值达到ETPS[INTPRD]设定的周期值时,如果中断使能(ETSEL[INTEN]=1)且中断标志未置位(ETFLG[INT]=0),则产生中断脉冲,同时清零计数器。如果中断被禁用或标志位已置位,则计数器停止,等待标志位被清除。

4.3 典型应用:实现PWM中心对齐与ADC同步采样

在电机控制中,最常用的配置之一就是使用增减计数模式,并在计数器等于周期值(PRD)或零(CNT_zero)时触发ADC采样(SOC),这样可以在PWM波形的“中心”或“谷底”采样电流,此时开关管噪声最小。

目标:配置EPWM1工作在增减计数模式,周期为TBPRD。在计数器向下计数到达CMPA值时(即PWM占空比的中点附近)触发ADC的SOCA,开始电流采样。

  1. 配置EPWM时基与比较器
// 假设已配置EPWM1为增减计数模式,TBPRD = 1000, CMPA = 300 (占空比相关) ePwm1->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数 ePwm1->TBPRD = 1000; // 设置周期值 ePwm1->CMPA.bit.CMPA = 300; // 设置比较值A
  1. 配置ET模块,在CTRD=CMPA事件时产生SOCA脉冲
// 选择事件源:计数器向下计数等于CMPA (CTRD=CMPA) // ETSEL[SOCASEL] 位域: 010b 对应 CTRD=CMPA ePwm1->ETSEL.bit.SOCASEL = ET_CTRD_CMPA; // 设置SOCA事件分频:每个事件都产生SOC脉冲(不分频) // ETPS[SOCAPRD] 位域: 01b 表示每1个事件产生一次脉冲 ePwm1->ETPS.bit.SOCAPRD = ET_1ST; // 使能SOCA脉冲生成 ePwm1->ETSEL.bit.SOCAEN = 1; // (可选)同时使能相同事件的中断,用于在采样点执行控制算法 ePwm1->ETSEL.bit.INTSEL = ET_CTRD_CMPA; // 中断事件源相同 ePwm1->ETPS.bit.INTPRD = ET_1ST; // 中断也不分频 ePwm1->ETSEL.bit.INTEN = 1; // 使能中断 // 注意:还需要配置PIE和使能CPU中断
  1. 配置ADC模块:在ADC配置中,需要将SOC触发源选择为来自EPWM1的SOCA信号。这样,每当EPWM1的ET模块产生SOCA脉冲,ADC就会自动启动一次转换序列。

经验分享:ET模块调试技巧

  • 验证事件触发:在调试初期,可以不连接ADC,而是配置ET产生中断。在中断服务函数中翻转一个GPIO引脚,用示波器同时观察这个GPIO和EPWM输出。你可以清晰地看到中断(或SOC脉冲)是否精确地发生在你预设的事件点上(如CMPA匹配点)。
  • 灵活使用分频:如果控制算法计算量很大,无法在每个PWM周期都完成,可以将INTPRD设置为2或3,让CPU每2或3个PWM周期运行一次算法。同时,ADC采样可以保持每个周期一次(SOCAPRD=1),确保反馈数据的实时性,算法使用最新的采样值即可。
  • SOCA与SOCB:两个SOC输出可以配置不同的事件源。例如,SOCA在周期中点触发采样相电流,用于电流环;SOCB在周期结束触发采样母线电压,用于保护或观测。这提供了更灵活的时序编排能力。
  • 软件强制ETFRC:在调试或系统初始化时,可以通过写ETFRC寄存器来手动触发一次中断或SOC事件,这对于测试ADC采样链路或中断服务程序非常有用。

5. 高级应用与系统集成考量

5.1 三大子模块的协同工作模式

在实际系统中,PC、TZ、ET三个子模块是协同工作的。一个典型的电机控制场景可能是这样的:

  1. 正常运行:ET模块在每个PWM周期中点产生SOC脉冲触发ADC采样,并在采样完成后产生中断,CPU执行FOC算法,更新下一个周期的CMPA/CMPB值,实现闭环控制。PC模块对最终的PWM波形进行斩波,以驱动隔离变压器。
  2. 故障响应:电流传感器持续监控相电流。一旦发生过流,比较器输出变低,触发TZ0输入。TZ模块在数十纳秒内将EPWM输出强制拉低,封锁所有桥臂。同时,TZ模块产生中断通知CPU。
  3. 故障处理与恢复:CPU在TZ中断中记录故障。待故障原因排查并清除后,软件先清除TZFLG寄存器中的OST标志位,然后可能需要重新初始化EPWM输出或解除强制,系统才能重新启动。

5.2 寄存器初始化的正确顺序

技术文档中特别强调了EPWM中断初始化的正确顺序,这是一个关键的实践要点。在系统上电或模块复位后,寄存器处于不确定状态,可能产生伪中断。错误的初始化顺序可能导致程序一开始就误入中断服务程序。

正确的EPWM中断初始化流程如下

  1. 禁用全局中断:操作INTM位或调用DINT指令,防止初始化过程中被意外中断打断。
  2. 禁用特定EPWM中断:清除ETSEL.INTENTZEINT中相应的使能位。
  3. 初始化所有EPWM寄存器:包括TB、CC、AQ、DB、PC、TZ、ET等所有子模块的配置。确保PWM参数、故障动作、事件选择都设置正确。
  4. 清除伪中断标志:写ETCLR.INT=1TZCLR寄存器,清除可能被误置位的标志位。
  5. 使能EPWM中断:设置ETSEL.INTENTZEINT
  6. 使能全局中断:操作INTM位或调用EINT指令。
void InitEPwm1(void) { // Step 1: 禁用全局中断 DINT; // Step 2: 禁用EPWM1中断 EALLOW; ePwm1->ETSEL.bit.INTEN = 0; // 禁用ET中断 ePwm1->TZEINT.bit.OST = 0; // 禁用TZ中断 EDIS; // Step 3: 初始化EPWM1所有子模块 InitEPwm1TimeBase(); // 初始化时基 InitEPwm1Compare(); // 初始化比较器 InitEPwm1ActionQualifier(); // 初始化��作限定 InitEPwm1DeadBand(); // 初始化死区 InitEPwm1Chopper(); // 初始化斩波 (如果需要) InitEPwm1TripZone(); // 初始化故障保护 InitEPwm1EventTrigger(); // 初始化事件触发 // Step 4: 清除任何伪中断标志 ePwm1->ETCLR.bit.INT = 1; // 清除ET中断标志 ePwm1->TZCLR.bit.OST = 1; // 清除TZ单次触发标志 ePwm1->TZCLR.bit.CBC = 1; // 清除TZ逐周期标志 // Step 5: 使能EPWM1中断 EALLOW; ePwm1->ETSEL.bit.INTEN = 1; // 使能ET中断 // ePwm1->TZEINT.bit.OST = 1; // 根据需要使能TZ中断 EDIS; // Step 6: 初始化PIE向量表,将EPWM1_INT中断服务程序地址填入对应位置 // ... (PIE配置代码) // Step 7: 使能全局中断 EINT; }

5.3 性能权衡与设计建议

  • 斩波频率选择:载波频率 (PSCLK) 并非越高越好。频率太高会导致开关损耗增加(在变压器和驱动芯片上),也可能产生更强的EMI。通常需要根据脉冲变压器的磁芯材料、尺寸以及驱动芯片的开关能力,选择一个折中的值,范围可能在几百kHz到几MHz。
  • 故障响应速度 vs 抗噪能力:TZ输入是异步的,响应极快,但也易受噪声干扰。为了抗噪,可以在硬件上增加RC滤波,但这会引入延迟。需要在速度和可靠性之间取得平衡。也可以考虑使用CBC模式作为第一级较快速的限流保护,OSHT模式作为第二级终极保护。
  • 中断频率与CPU负载:ET模块虽然能产生精确定时中断,但过高的中断频率(如高开关频率下每个PWM周期都中断)会消耗大量CPU资源。务必计算好中断服务程序的最坏执行时间(WCET),确保其远小于中断间隔。合理利用ETPS分频功能是降低CPU负载的有效手段。
  • 影子寄存器的使用:对于周期(TBPRD)、比较值(CMPA/CMPB)等需要在特定时刻(如周期零点)安全更新的参数,务必使用影子寄存器功能。在AQ或CC模块中配置为在CTR=ZEROCTR=PRD时加载影子寄存器,可以避免PWM波形在更新时出现毛刺或断裂。

深入理解EPWM的斩波、故障保护和事件触发模块,是将理论上的PWM控制转化为稳定、可靠、高性能的电力电子系统的关键。这些硬件特性使得工程师能够构建出响应迅速、保护完善、时序精准的先进数字电源和电机驱动方案。