1. 项目概述与核心价值
在电机驱动、数字电源或者任何需要高可靠性功率控制的嵌入式系统里,PWM信号的生成只是基础,如何确保它在异常情况下能“安全停车”,以及如何精准地“抓住”特定时刻来触发采样或计算,才是真正考验设计功力的地方。很多工程师在初次接触TI C2000系列DSP的ePWM模块时,往往把大量精力花在如何产生对称或非对称的PWM波形上,这固然重要,但ePWM真正的“增强”之处,恰恰在于其背后那套精密的事件与保护联动机制。
我见过不少项目,PWM输出看起来完美,但一上电带载,稍有异常就炸管,或者ADC采样总是抓不准电流过零点的时刻,导致控制环路震荡。这些问题,多半是因为没有吃透ePWM的Trip-Zone(故障保护)、Event-Trigger(事件触发)和Digital Compare(数字比较)这三个子模块。它们不是独立的三个功能,而是一个环环相扣的“感知-决策-执行”系统。Trip-Zone是你的紧急刹车系统,Event-Trigger是定时触发数据采集的闹钟,而Digital Compare则是那个能识别特定“特征信号”(比如过流尖峰)的智能传感器。
本文将带你深入这三个子模块的寄存器级操作逻辑,我会结合自己调试变频器和伺服驱动器的实际经验,不仅告诉你每个比特位该怎么配置,更会解释为什么这么配置,以及在哪些场景下可能会遇到坑。我们的目标是把芯片手册里冰冷的框图和数据表,变成你手中可靠的设计工具。
2. 深入解析Trip-Zone子模块:系统的安全卫士
Trip-Zone,直译是“跳闸区域”,你可以把它理解成整个PWM系统的“安全气囊”或“急停按钮”。它的核心职责是实时监控外部故障信号(如过流、过压、过热),并在故障发生时,立即对PWM输出引脚采取预设的保护动作,比如将其拉高、拉低或置为高阻态,从而保护后级的功率器件(如IGBT、MOSFET)免于损坏。
2.1 核心寄存器组与功能解析
Trip-Zone子模块的配置围绕一组寄存器展开,它们是整个保护逻辑的“编程接口”。理解每个寄存器的角色是正确配置的第一步。
表 2-1: Trip-Zone子模块核心寄存器一览
| 寄存器名称 | 地址偏移 | 影子寄存器 | 核心功能描述 |
|---|---|---|---|
| TZSEL | 0x0012 | 否 | 故障源选择寄存器。决定哪些信号能触发本ePWM模块的保护。这是配置的起点,你必须明确告诉模块:“你需要注意哪几个危险信号?” |
| TZDCSEL | 0x0013 | 否 | 数字比较事件选择寄存器。用于将Digital Compare子模块产生的事件(DCAEVT1/2, DCBEVT1/2)映射为Trip-Zone的故障源。它连接了DC和TZ两个子模块。 |
| TZCTL | 0x0014 | 否 | 跳闸控制寄存器。这是“应急预案”手册。它定义当某个故障发生时,对应的EPWMxA和EPWMxB输出引脚应该执行什么动作(高、低、高阻、无动作)。 |
| TZEINT | 0x0015 | 否 | 跳闸中断使能寄存器。决定哪些故障事件会触发CPU中断。你不可能一直轮询查询是否故障,所以需要中断来及时通知CPU进行故障处理(如记录日志、尝试恢复)。 |
| TZFLG | 0x0016 | 否 | 跳闸标志寄存器。这是一个“状态公告板”。当故障发生时,对应的标志位会被硬件置1。软件通过读取此寄存器来确认是哪种故障触发了保护。 |
| TZCLR | 0x0017 | 否 | 跳闸清除寄存器。用于软件手动清除TZFLG中的标志位。注意:清除标志位不等于解除输出引脚的保护状态,后者取决于故障是否依然存在。 |
| TZFRC | 0x0018 | 否 | 跳闸强制寄存器。用于软件模拟一个故障事件。这在调试阶段极其有用,你可以不连接任何外部故障信号,直接通过写此寄存器来测试你的保护逻辑和动作是否正确。 |
重要提示:所有Trip-Zone寄存器(以及后续Digital Compare的大部分寄存器)都受EALLOW保护。这意味着在修改它们之前,必须先执行
EALLOW汇编指令,修改完成后再执行EDIS指令。这是TI C2000系列芯片为了防止软件跑飞意外修改关键系统配置而设置的安全机制。在C代码中,通常使用EALLOW;和EDIS;宏来操作。
2.2 故障类型:Cycle-by-Cycle (CBC) 与 One-Shot (OSHT)
这是Trip-Zone子模块最核心的两个概念,决定了故障响应的“持久性”。
Cycle-by-Cycle (CBC,逐周期保护):
- 行为:当CBC故障事件发生时,TZCTL寄存器中定义的保护动作(如拉低输出)立即生效。但是,这个故障状态不会锁存。
- 清除条件:在每个PWM周期的计数器归零时刻(TBCTR = 0x0000),硬件会自动检查故障信号是否已经消失。如果消失,则保护动作自动解除,PWM输出恢复正常;如果故障依然存在,则保护动作持续到下一个周期归零时刻再次检查。
- 标志位:TZFLG[CBC]标志位在故障发生时置1。即使故障在周期末消失,此标志位也不会自动清零,必须由软件写TZCLR[CBC]=1来清除。
- 应用场景:适用于可恢复的、瞬态的故障。例如,电机启动时的瞬时过流。CBC保护允许在每个PWM周期都尝试恢复正常工作,一旦电流降下来,驱动就自动恢复,系统具有“自愈”能力。这能避免因短暂的干扰而彻底停机。
One-Shot (OSHT,单次保护):
- 行为:当OSHT故障事件发生时,保护动作同样立即生效,但故障状态会被硬件锁存。
- 清除条件:无法自动清除。即使外部故障信号已经消失,PWM输出也将保持在被保护的状态(如持续拉低)。
- 恢复方法:必须由软件干预。通常的流程是:1)故障发生;2)CPU进入中断服务程序;3)软件诊断故障原因;4)在确认安全后,手动写TZCLR[OST]=1来清除标志位;5)有时还需要重新初始化ePWM模块或使能输出,才能恢复PWM输出。
- 应用场景:适用于严重的、不可逆的故障。例如,硬件短路、严重过温、母线过压。一旦发生,系统必须彻底关闭PWM输出,并等待人工干预或上级系统命令,防止故障扩大。
一个生动的类比:CBC就像汽车的“ABS防抱死系统”,在打滑时点刹,一旦恢复抓地力就正常刹车;OSHT就像“碰撞气囊”,一旦触发就必须停车检修,不能自动复位。
2.3 故障信号源:TZn引脚与Digital Compare事件
故障信号从哪里来?主要有两大类:
外部引脚信号 (TZ1~TZ6):
- 这是最直接的故障输入,通常是连接至电流采样比较器、电压检测电路或温度传感器的输出。
- 这些信号是低电平有效(Active Low)。当引脚被拉低时,表示故障发生。
- 每个ePWM模块可以独立选择关注哪几个TZn信号,这是通过配置
TZSEL[CBCn]和TZSEL[OSHTn]位实现的(n=1~6)。例如,你可以配置ePWM1只关心TZ1和TZ2,而ePWM2关心TZ3和TZ4。 - 异步跳闸特性:这是一个关键的安全设计。即使系统时钟(SYSCLKOUT)丢失,只要TZn引脚上出现有效的低电平脉冲(脉宽大于3个TBCLK周期),ePWM模块依然能异步地将输出置于安全状态。这确保了在最极端的时钟故障下,功率器件也能被保护。
内部Digital Compare事件 (DCAEVT1/2, DCBEVT1/2):
- 这是更高级的故障源,来自Digital Compare子模块。它允许你将模拟比较器(COMP)的输出等复杂信号,经过逻辑组合和滤波后��再作为故障源。
- 通过
TZDCSEL寄存器,你可以配置:DCAEVT1或DCBEVT1事件作为One-Shot (OSHT)故障源。DCAEVT2或DCBEVT2事件作为Cycle-by-Cycle (CBC)故障源。
- 这种方式的优势在于,你可以利用Digital Compare的滤波和逻辑判断能力,创建一个更智能、抗干扰能力更强的故障检测机制,而不是简单地依赖一个引脚的电平。
2.4 保护动作配置与优先级
当故障发生时,输出引脚具体做什么,由TZCTL寄存器控制。每个输出引脚(EPWMxA和EPWMxB)可以独立配置四种动作之一:
表 2-2: TZCTL寄存器动作配置
| TZCTL[TZA] 或 TZCTL[TZB] 位值 | EPWMxA/B 输出动作 | 说明 |
|---|---|---|
| 00 | 高阻态 (High-Z) | 输出驱动器关闭,引脚呈高阻态。常用于关断半桥的上管或下管,避免直通。 |
| 01 | 强制为高 (Force to High) | 无论计数器比较结果如何,强制输出高电平。 |
| 10 | 强制为低 (Force to Low) | 无论计数器比较结果如何,强制输出低电平。这是最常用的保护动作,将功率管关断。 |
| 11 | 无变化 (No Change) | 忽略此故障,PWM输出不受影响。 |
动作优先级: 当一个引脚有多个故障源(例如,同时配置了TZ1的CBC和DCAEVT1的OSHT)时,TZCTL寄存器内部有明确的优先级:
- 对于EPWMxA引脚:
TZA(来自TZn引脚的动作)优先级最高 >DCAEVT1>DCAEVT2优先级最低。 - 对于EPWMxB引脚:
TZB(来自TZn引脚的动作)优先级最高 >DCBEVT1>DCBEVT2优先级最低。
这意味着,如果高优先级的故障已经将输出拉低,那么低优先级故障的配置将不起作用。这符合安全设计原则:最直接的硬件故障信号拥有最高控制权。
2.5 实战配置示例与避坑指南
让我们结合手册中的例子,并加入实际工程中的考量。
场景A:单一严重故障,联动多个模块
- 需求:当TZ1引脚出现硬件过流(OSHT故障)时,需要立即关断ePWM1A和1B(驱动一个半桥),同时将ePWM2A和2B置为固定高电平(可能是为了启动刹车电阻)。
- 配置思路:
- ePWM1配置:
TZSEL[OSHT1] = 1:使能TZ1作为ePWM1的单次故障源。TZCTL[TZA] = 2(TZCTL[TZB] = 2):故障时,将EPWM1A和1B强制拉低(关断功率管)。
- ePWM2配置:
TZSEL[OSHT1] = 1:同样使能TZ1作为ePWM2的单次故障源。一个故障信号可以同时分配给多个ePWM模块。TZCTL[TZA] = 1(TZCTL[TZB] = 1):故障时,将EPWM2A和2B强制拉高(接通刹车电阻)。
- ePWM1配置:
场景B:混合故障类型与差异化响应
- 需求:TZ5引脚上的轻微过载作为CBC故障,仅关断ePWM1;TZ1或TZ6引脚上的严重故障作为OSHT故障,将ePWM2A置于高阻态(可能连接的是高侧驱动,需要关闭),而ePWM2B忽略此故障。
- 配置思路:
- ePWM1配置:
TZSEL[CBC5] = 1:使能TZ5作为ePWM1的逐周期故障源。TZCTL[TZA] = 2(TZCTL[TZB] = 2):故障时,拉低输出。
- ePWM2配置:
TZSEL[OSHT1] = 1和TZSEL[OSHT6] = 1:使能TZ1和TZ6作为ePWM2的单次故障源,两者是“或”的关系。TZCTL[TZA] = 0:故障时,将EPWM2A置为高阻态。TZCTL[TZB] = 3:关键点:将EPWM2B配置为“无变化”。这意味着即使ePWM2模块收到了故障,B引脚也完全不受影响,继续正常输出PWM。这在某些冗余设计或特定拓扑中很有用。
- ePWM1配置:
避坑经验一:中断服务程序(ISR)里的清理操作在OSHT故障的中断服务程序中,标准的清理流程是:
- 读取
TZFLG寄存器,判断具体故障源。- 执行相应的故障处理(如记录错误码、关闭其他外设)。
- 写
TZCLR寄存器,清除对应的标志位(例如,TZCLR[OST] = 1)。- 重新使能PWM输出。对于OSHT故障,仅仅清除标志位不会自动恢复PWM输出!输出引脚会保持
TZCTL设定的安全状态。你需要通过重新配置动作限定器(AQ)或清除某些状态来恢复。一个常见的方法是简单地将TZCTL[TZA/TZB]临时改为3(无动作),然后再改回正常值,但这取决于具体应用。更稳妥的做法是在故障处理后,重新初始化整个ePWM模块的波形生成逻辑。
避坑经验二:CBC故障标志位的“粘性”假设一个CBC故障发生并在周期末消失了。
TZFLG[CBC]标志位仍然为1。如果你在中断服务程序中清除了它(TZCLR[CBC]=1),但此时外部故障信号恰好又存在,那么标志位会立刻再次被置1。这可能导致你的中断服务程序刚退出就又立即进入,形成“中断风暴”。因此,在清除CBC标志位前,最好先确认一下外部故障信号是否已经稳定在无效状态。
3. 庖丁解牛Event-Trigger子模块:精准的事件调度器
如果说Trip-Zone是负责紧急刹车的安全员,那么Event-Trigger子模块就是负责精准计时的调度员。它的核心任务不是改变PWM输出,而是捕捉PWM波形生成过程中的关键时间点(事件),并用这些事件来触发中断(通知CPU)或启动ADC转换(进行采样)。
3.1 核心功能与寄存器概览
Event-Trigger子模块的输入事件源非常丰富:
- 来自Time-Base子模块:
CTR=Zero(计数器归零)、CTR=PRD(计数器等于周期值)。 - 来自Counter-Compare子模块:
CTR=CMPA(计数器等于比较器A值)、CTR=CMPB(计数器等于比较器B值)。并且这些事件还可以区分计数器是在递增(CTRU)还是递减(CTRD)阶段。 - 来自Digital-Compare子模块:
DCAEVT1.soc和DCBEVT1.soc事件。
它的输出主要有两个:
- 中断脉冲 (EPWMxINT):发送给CPU的PIE(外设中断扩展)模块。
- ADC启动转换脉冲 (EPWMxSOCA/SOCB):发送给ADC模块,触发其开始一次模数转换。
其配置依赖于以下核心寄存器:
表 3-1: Event-Trigger子模块核心寄存器
| 寄存器 | 核心作用 |
|---|---|
| ETSEL | 事件选择寄存器。决定哪个具体的事件(如CTR=PRD)将用于产生中断(INTSEL)或启动ADC转换(SOCASEL/SOCBSEL)。 |
| ETPS | 事件预分频寄存器。这是本模块的精华所在。它包含计数器(INTCNT, SOCACNT, SOCBCNT)和周期值(INTPRD, SOCAPRD, SOCBPRD),用于实现“每N次事件触发一次”的功能。 |
| ETFLG | 事件标志寄存器。指示中断或SOC事件是否已发生。 |
| ETCLR | 事件清除寄存器。软件清除ETFLG中的标志位。 |
| ETFRC | 事件强制寄存器。软件强制产生一个事件,用于调试。 |
3.2 中断生成逻辑深度剖析
中断生成的逻辑是Event-Trigger最核心的部分,理解了它,SOC脉冲生成也就触类旁通。我们结合图3-42的逻辑框图来分解其工作流程:
事件选择 (ETSEL[INTSEL]):首先,你需要从7个可能的事件源中挑选一个作为中断触发源。例如,选择
CTR=CMPA when up(计数器向上计数等于CMPA)。每当这个事件发生时,它就会进入后续的处理流水线。事件计数与预分频 (ETPS[INTCNT] & ETPS[INTPRD]):这是实现“每N次事件触发��次中断”的关键。
INTCNT是一个2位计数器,INTPRD是你设定的周期值(1, 2, 3)。- 每当选定的事件发生一次,
INTCNT就加1。 - 当
INTCNT计数到等于INTPRD的值时,计数器输出有效,表示“满足触发条件”。 - 重要特性:
INTCNT不会自动循环。当它等于INTPRD后,就会停止计数,直到当前的中断被处理。
- 每当选定的事件发生一次,
中断使能与标志位 (ETSEL[INTEN] & ETFLG[INT]):当
INTCNT == INTPRD时:- 如果中断使能位
INTEN=1,且中断标志位INT=0(表示没有未处理的中断),则硬件会:- 产生一个中断脉冲到PIE。
- 将中断标志位
INT置1。 - 将事件计数器
INTCNT清零,使其可以重新开始计数下一个周期的事件。
- 如果
INTEN=0(中断被禁用),或者INT=1(已有中断未处理),则计数器会停在INTPRD值,不会产生新中断,也不会清零。这实现了中断排队机制:允许一个中断正在服务时,另一个触发条件已满足并在等待。
- 如果中断使能位
软件干预 (ETFRC[INT]):向
ETFRC[INT]位写1,可以手动让INTCNT加1。这模拟了一个事件的发生,常用于测试中断逻辑,或者在特定时刻由软件主动触发中断。
关键时序与配置陷阱:
- 写
INTPRD的副作用:任何时候你写入INTPRD寄存器,硬件都会立即将INTCNT清零,并复位计数器输出。这意味着,如果你在运行时动态修改INTPRD,可能会意外地重置你的中断节奏。INTPRD必须大于当前INTCNT:手册明确警告,如果你写入的INTPRD值小于当前的INTCNT值,会导致未定义行为(INTCNT停止,中断永不触发)。因此,安全的做法是在修改INTPRD前,先通过写ETCLR[INT]或修改INTPRD本身(因为写INTPRD会清零INTCNT)来重置计数器。INTPRD=0的含义:将INTPRD设为0会禁用该事件计数器。此时,任何事件(包括软件强制事件ETFRC)都不会被计数,中断生成逻辑完全停止。
3.3 ADC启动转换(SOC)脉冲生成
SOC脉冲生成逻辑(图3-43, 3-44)与中断生成逻辑高度相似,但有一个根本区别:SOC脉冲是连续生成的,不会被标志位阻塞。
- 相似点:同样有事件选择(
ETSEL[SOCASEL/SOCBSEL])、事件计数器(ETPS[SOCxCNT])和周期值(ETPS[SOCxPRD])。 - 核心区别:当
SOCxCNT == SOCxPRD时,硬件会生成一个SOC脉冲,并将标志位ETFLG[SOCx]置1。但是,这个标志位不会阻止下一个SOC脉冲的生成!计数器在发出脉冲后会自动清零,并立即开始下一轮计数。 - 使能控制:
ETSEL[SOCAEN/SOCBEN]位用于全局使能或禁用SOC脉冲的产生。禁用后,不会产生新脉冲,但计数器仍可能计数(取决于配置)。 - 与ADC的联动:每个ePWM模块的SOCA和SOCB信号连接到ADC模块特定的触发输入引脚(如
ADCTRIG5)。你需要同时在ADC模块中配置相应的触发源和采样序列。
3.4 实战应用:相电流采样与PWM中心对齐
一个经典的电机控制应用是在PWM中心点对电机相电流进行采样,以获得平均电流值。对于增-减计数模式(Up-Down Count),中心点就是计数器从递增转为递减(CTR=PRD)或从递减转为递增(CTR=Zero)的时刻。使用Event-Trigger可以完美实现这一点。
目标:在ePWM1的每个PWM周期中心点(CTR=PRD),触发ADC1启动一次转换,采样电流传感器信号。
配置步骤:
- 选择事件源:
ETSEL[SOCASEL] = 1(选择CTR=PRD事件)。 - 配置SOC预分频:我们希望每个PWM周期都采样一次,即“每次事件都触发”。
ETPS[SOCAPRD] = 1(每1次事件产生一个SOC脉冲)。- 硬件上电后
SOCACNT通常为0,当第一个CTR=PRD事件到来时,SOCACNT从0加到1,等于SOCAPRD(1),触发SOCA脉冲,然后SOCACNT清零。
- 使能SOCA:
ETSEL[SOCAEN] = 1。 - 配置ADC模块:在ADC模块中,将启动转换的触发源设置为
EPWM1_SOCA(具体是哪个ADCTRIG需要查芯片数据手册)。并配置好采样的通道和排序器。
这样,每当PWM计数器达到峰值(PRD)时,ePWM1就会自动发出一个精准的脉冲给ADC,ADC随即开始转换,实现了硬件级别的同步采样,无需CPU干预,极大提高了控制环路的时效性和确定性。
避坑经验三:中断与SOC的时机考量如果你同时使能了基于
CTR=PRD的中断和SOC,它们几乎会在同一时刻被触发。但中断请求需要CPU响应,可能有延迟,而SOC是直接触发ADC硬件的。在中断服务程序中启动ADC转换是不可取的,因为中断延迟会导致采样点偏移。最佳实践是:用SOC硬件触发ADC,然后在ADC转换完成中断中读取数据并进行控制算法计算。Event-Trigger的中断更适合用于处理一些非严格定时的任务,比如更新下一个周期的CMPA值(如果计算量不大)。
避坑经验四:ETFRC的调试妙用在调试阶段,你的PWM可能还没运行起来,但你想测试ADC触发链路是否正常。这时,你可以在初始化所有模块后,在软件中手动执行
ETFRC[SOCA] = 1。这会强制产生一个SOCA脉冲,如果ADC配置正确,你应该能看到ADC被触发并完成一次转换。这是一个非常高效的硬件功能验证方法。
4. 揭秘Digital Compare子模块:智能的事件生成器
Digital Compare子模块是ePWM高级功能的集大成者。它不再简单地响应外部引脚电平,而是内置了一个灵活的“比较器”和“滤波器”,能够对输入信号进行逻辑组合、滤波,并生成丰富的事件,馈送给Trip-Zone和Event-Trigger,从而实现基于复杂条件的保护和触发。
4.1 模块定位与信号流
理解DC模块,首先要看清它的“输入”和“输出”。
- 输入:主要来自两个地方
- Trip-Zone引脚:TZ1, TZ2, TZ3。注意,只有这三个引脚可以复用为DC的输入。
- 模拟比较器(COMP)模块输出:
COMPxOUT信号。这是将模拟信号(如电流)与参考值比较后产生的数字信号。
- 核心处理:通过
DCTRIPSEL寄存器,选择上述输入信号,形成两对比较信号:- Digital Compare A High/Low (
DCAH/DCAL) - Digital Compare B High/Low (
DCBH/DCBL) 然后,通过TZDCSEL寄存器定义这两对信号的逻辑关系(例如,DCAH高且DCAL低),从而产生四个关键事件: DCAEVT1,DCAEVT2DCBEVT1,DCBEVT2
- Digital Compare A High/Low (
- 输出:这四个事件可以通向三个目的地,实现不同功能:
- 作为Force信号给Trip-Zone:
DCAEVT1.force等可以直接作为故障源,触发TZ动作。 - 作为Interrupt信号给Trip-Zone:
DCAEVT1.inter等可以触发TZ中断。 - 作为SOC信号给Event-Trigger:
DCAEVT1.soc等可以作为事件源,触发ADC转换。 - 作为Sync信号给Time-Base:
DCAEVT1.sync等可以产生同步信号,复位其他ePWM模块的计数器。
- 作为Force信号给Trip-Zone:
4.2 事件滤波与消隐窗口
这是DC模块最具实用价值的功能之一。在功率变换中,模拟比较器输出或传感器信号极易在开关瞬间产生毛刺噪声。如果直接用这些信号触发保护,会导致误动作。DC模块内置的消隐窗口功能可以完美解决这个问题。
工作原理(参考图3-50):
- 选择滤波源:通过
DCFCTL[SRCSEL]选择DCAEVT1/2或DCBEVT1/2中的一个事件进行滤波。 - 定义消隐窗口:
- 基准点:窗口的起点对齐到
CTR=PRD或CTR=Zero事件(由DCFCTL[PULSESEL]选择)。这确保了消隐窗口与PWM周期同步。 - 偏移量:
DCFOFFSET寄存器设定一个以TBCLK为单位的延迟时间,从基准点之后开始计算。 - 窗口宽度:
DCFWINDOW寄存器设定消隐窗口的持续时间(TBCLK周期数)。
- 基准点:窗口的起点对齐到
- 滤波效果:在消隐窗口期内,所有被选择的DC事件都会被忽略。只有在窗口之外发生的事件,才会被传递出去产生force、interrupt、soc或sync信号。
典型应用:电流采样保护消隐在逆变器桥臂开关(比如上管开通、下管关断)的瞬间,电流采样电路可能会因为共模噪声或二极管反向恢复产生一个尖峰,导致比较器误触发。我们可以设置一个消隐窗口,覆盖这个开关噪声期。
- 假设PWM频率为10kHz(周期100us),采用增-减计数。
- 我们将消隐窗口的基准点设为
CTR=PRD(计数器峰值,通常是开关时刻)。 - 设置
DCFOFFSET = 10(假设TBCLK=100MHz,即延迟0.1us)。 - 设置
DCFWINDOW = 50(窗口宽度0.5us)。 - 这样,在开关时刻后的0.1us到0.6us这段时间内,任何来自比较器的故障信号都会被过滤掉,0.6us之后才重新使能保护。这个时间足以让开关噪声平息。
4.3 事件捕获功能
除了滤波,DC模块还有一个高级功能:事件捕获。当使能捕获功能(DCCAPCTL[CAPE]=1)后,在消隐窗口之外,一旦有效的DC事件发生,模块可以捕获当前时间基计数器(TBCTR)的值,并存入DCCAP寄存器。
这个功能极其有用,例如:
- 精确故障定位:当发生过流保护时,你不仅知道发生了故障,还能从
DCCAP寄存器读出故障发生在PWM周期的哪个精确时刻。这对于分析故障原因(是在开关瞬间还是导通中期)至关重要。 - 实现逐周期限流:结合软件,你可以在一个PWM周期内,如果捕获到较早的过流事件,可以在同一周期内就采取行动(比如修改CMPA提前关断),而不是等到下个周期。
4.4 实战配置:基于模拟比较器的逐周期限流
让我们配置一个完整的、基于Digital Compare的智能保护场景。
需求:使用模拟比较器1监控电机相电流,当其输出COMP1OUT为高时(表示过流),需要立即关断对应的PWM输出(假设是EPWM1A),并且这个保护应该是逐周期(CBC)的,同时还要滤除开关噪声。
配置步骤:
信号选择 (DCTRIPSEL):
- 将
COMP1OUT信号映射到Digital Compare A的高电平信号(DCAH)。 - 假设配置:
DCTRIPSEL.DCAH = 1(选择COMP1OUT作为DCAH源)。DCAL可以不连接或拉低。
- 将
事件生成 (TZDCSEL):
- 我们需要定义
DCAH为高时,产生一个事件。假设使用DCAEVT2作为CBC事件源。 - 配置:
TZDCSEL.DCAEVT2 = 1(选择DCAH高作为DCAEVT2的事件条件)。DCAEVT1可用于其他逻辑。
- 我们需要定义
事件滤波 (DCFCTL, DCFOFFSET, DCFWINDOW):
DCFCTL.SRCSEL = 10(选择DCAEVT2作为滤波源)。DCFCTL.PULSESEL = 0(消隐窗口对齐到CTR=PRD)。DCFCTL.BLANKE = 1(使能消隐)。- 根据硬件噪声情况,设置
DCFOFFSET和DCFWINDOW的值,例如10和50。
连接至Trip-Zone:
TZSEL.DCAEVT2 = 1(使能DCAEVT2作为ePWM1的CBC故障源)。TZCTL.TZA = 2(当故障发生时,将EPWM1A强制拉低)。
(可选)使能中断:
TZEINT.CBC = 1(使能CBC中断)。注意,这里使能的是CBC中断,而不是DCAEVT2中断,因为DCAEVT2是通过CBC机制触发中断的。
经过以上配置,一个带滤波的、基于模拟比较器的智能逐周期限流保护就搭建完成了。当电流超过比较器阈值,且不在消隐窗口内时,PWM输出会在当前周期内立即被拉低,并在下个周期起始点自动恢复,同时产生中断通知CPU。
避坑经验五:Digital Compare与Trip-Zone引脚的优先级当同一个ePWM模块既配置了TZ引脚故障,又配置了DC事件故障时,需要仔细规划
TZCTL的配置。如前所述,TZA/TZB的优先级高于DCAEVT1/DCBEVT1,后者又高于DCAEVT2/DCBEVT2。如果你希望DC事件能覆盖TZ引脚的动作,可能需要将TZ引脚对应的TZCTL[TZA/TZB]动作配置为“无变化(11)”,而将保护动作配置在TZCTL[DCAEVTx]上。
避坑经验六:消隐窗口的跨周期问题手册图3-51说明了一个重要细节:如果计算的消隐窗口(偏移量+宽度)跨越了PWM周期的边界(从本次
CTR=PRD之后开始,持续到了下一次CTR=PRD之后),下一个消隐窗口仍然会从下一个CTR=PRD事件加上偏移量后开始。这意味着消隐窗口不会延长到超过一个PWM周期。在设置较大的偏移和窗口值时,需要确保其总和小于PWM周期计数值,否则靠后部分的事件可能永远无法被检测到。
5. 系统集成与调试心得
将TZ、ET、DC三个子模块组合使用,可以构建出非常强大的控制与保护系统。例如,在一个伺服驱动器中:
- DC模块监控来自高速模拟比较器的电流信号,经过消隐滤波后,生成
DCAEVT2作为CBC故障源,实现纳秒级响应的硬件逐周期限流。 - TZ模块直接连接硬件过温、母线过压等慢速但致命的故障信号,配置为OSHT模式,实现不可恢复的紧急关断。
- ET模块在PWM波形的谷底(
CTR=Zero)触发ADC,采样相电流用于FOC算法计算;同时在波形的峰值(CTR=PRD)触发另一个ADC,采样直流母线电压。
调试建议:
- 先软件强制,后硬件验证:初始化完成后,先不接真实负载。使用
TZFRC寄存器模拟故障,使用ETFRC寄存器模拟事件,验证你的中断服务程序、保护动作和ADC触发逻辑是否正确。 - 充分利用寄存器标志位:
TZFLG和ETFLG是你的眼睛。在调试时,定期或在中断中读取这些标志位,可以清晰了解内部状态。 - 分模块调试:先让PWM正常输出,然后单独调试ET的SOC触发ADC,再调试DC的事件生成,最后集成TZ保护。不要试图一次性配置所有功能。
- 注意EALLOW保护:反复检查所有受保护的寄存器(TZ、DC相关)的配置代码是否被
EALLOW和EDIS宏正确包裹。 - 计算时间参数:消隐窗口的偏移和宽度、CBC故障的最小脉宽(3*TBCLK)等,都需要根据你的系统时钟和PWM频率进行精确计算,确保功能符合预期。
ePWM的这些高级子模块,初看寄存器繁多,逻辑交织,但一旦理解其“事件驱动、分层响应”的设计哲学,就能化繁为简。它们将许多原本需要CPU频繁干预或无法实现的快速响应功能,固化在了硬件逻辑中,从而释放了CPU资源,并极大地提高了系统的实时性和可靠性。掌握它们,是你从实现PWM输出到设计工业级可靠电机驱动系统的关键一步。