1. 项目概述与eHRPWM核心价值
在嵌入式系统,尤其是电机控制、数字电源和逆变器这些对时序精度要求近乎苛刻的领域,脉冲宽度调制(PWM)信号的生成质量直接决定了整个系统的性能上限。我们常说的“调占空比”听起来简单,但背后涉及到时钟同步、边沿对齐、死区保护、故障响应等一系列复杂且环环相扣的硬件逻辑。德州仪器(TI)在其C2000系列微控制器中集成的增强型高分辨率PWM(eHRPWM)模块,正是为了解决这些复杂需求而生的利器。它不是一个简单的定时器加比较器,而是一套高度模块化、可编程的PWM信号生成“流水线”。
很多工程师初次接触eHRPWM的数百页技术手册时,往往会被密密麻麻的寄存器表格和信号流图劝退。大家更习惯于调用高层API,但一旦遇到波形畸变、同步失锁、保护误触发等棘手问题,如果对底层寄存器的映射关系和子模块间的信号交互没有透彻理解,调试就会像盲人摸象。本文的目的,就是带你穿透API的封装层,直接深入到eHRPWM的寄存器与子模块架构层面。我们将以TI官方技术手册SPRUH80C为蓝本,但不止于翻译,我会结合自己多年在电机驱动项目中的实际调试经验,为你拆解每个关键寄存器位域的真实含义,并厘清时间基准(TB)、计数比较(CC)、动作限定(AQ)等子模块是如何像精密齿轮一样协同工作的。理解这些,不仅是编写稳健底层驱动的基础,更是进行系统级优化(如实现多模块精确同步、设计复杂保护逻辑)的前提。
2. eHRPWM模块整体架构与寄存器地图解析
2.1 模块化设计思想与信号流
eHRPWM模块的精妙之处在于其流水线式的子模块设计。它不是将所有的功能塞进一个复杂的控制寄存器,而是将其分解为七个(或八个,含HRPWM)功能相对独立又紧密衔接的子模块。这种设计使得配置逻辑清晰,且不同功能间的影响可控。
我们可以将其想象为一个PWM信号的“加工厂”:
- 时间基准(TB)子模块:这是工厂的“心脏”和“节拍器”。它产生一个不断循环计数的核心时钟TBCNT,决定了PWM波的周期和频率。所有其他子模块的动作时机,都基于这个计数器的值来触发。
- 计数比较(CC)子模块:这是“模具车间”。它内部有两个比较器(CMPA和CMPB),持续将TBCNT的值与预设的CMPA/CMPB值进行比较。当匹配时,就产生“CTR=CMPA”和“CTR=CMPB”这两个关键事件信号。这两个值直接决定了PWM脉冲的上升沿和下降沿位置,即占空比。
- 动作限定(AQ)子模块:这是“执行车间”。它接收来自TB子模块的“CTR=PRD”(周期匹配)、“CTR=0”(零匹配)事件,以及来自CC子模块的“CTR=CMPA/B”事件。AQ子模块根据配置,决定当这些事件发生时,对最终的输出引脚EPWMxA和EPWMxB采取什么“动作”——置高、拉低、翻转或保持。正是这里将“时间事件”转化为了具体的“电平动作”。
- 死区生成(DB)子模块:这是“安全调度室”。在驱动上下桥臂(如半桥或全桥)时,必须防止两者同时导通导致短路。DB子模块对AQ输出的原始信号进行加工,插入可编程的上升沿延迟(RED)和下降沿延迟(FED),从而生成一对互补且带有死区的信号。
- 故障保护(TZ)子模块:这是“紧急制动系统”。当外部故障信号(如过流、过压)触发时,TZ子模块可以无视当前所有逻辑,强制将PWM输出设置为预定安全状态(高、低或高阻),实现硬件级快速保护。
- 事件触发(ET)子模块:这是“生产报告员”。它监控特定事件(如周期匹配、比较匹配)的发生,并可以据此产生CPU中断,让软件能够及时介入处理,例如更新下一个周期的比较值以实现闭环控制。
- PWM斩波(PC)子模块:这是一个“附加加工站”,用于生成高频载波对PWM信号进行调制,主要用于驱动门极变压器等特殊场景。
- 高分辨率PWM(HRPWM)子模块(部分型号具备):这是“微雕车间”。它通过微边沿定位(MEP)技术,在系统时钟的一个周期内进行插值,将PWM边沿的控制精度提升到皮秒级,远超传统计数器的分辨率。
这些子模块通过内部总线共享TBCNT值和配置寄存器,并通过一系列事件信号(如CTR=PRD, CTR=CMPA)进行连锁触发,构成了一个完整的、可配置的PWM信号生成链。
2.2 寄存器映射详解与寻址规则
eHRPWM的寄存器是理解其工作的钥匙。手册中的Table 15-1提供了完整的寄存器地图,但我们需要理解其组织逻辑。
核心要点一:模块化与实例化。所有寄存器按子模块分组排列:TB、CC、AQ、DB、TZ、ET、PC、HRPWM。每个eHRPWM模块实例(例如ePWM1, ePWM2…)都拥有完全相同的一套这样的寄存器组。它们在内存中的基地址(Start Address)由芯片的数据手册定义,通常是连续的内存块。例如,ePWM1的寄存器可能从0x6800开始,ePWM2的从0x6900开始。
核心要点二:偏移地址(Offset)。每个寄存器在它所属的ePWM实例内的相对位置是固定的,由表中的“Offset”列定义。例如,TBCTL寄存器的偏移总是0x0,CMPA寄存器的偏移总是0x12。因此,要访问ePWM2的CMPA寄存器,地址就是ePWM2基地址 + 0x12。
核心要点三:影子寄存器(Shadow Register)机制。这是eHRPWM实现无毛刺、同步更新的关键设计,务必深刻理解。表中“Shadow”列标识了该寄存器是否有影子寄存器。
- 有影子寄存器(Yes):如TBPRD(周期寄存器)、CMPA/B(比较寄存器)。软件平时读写的是“影子寄存器”,它像一个缓冲区。硬件在运行中实际使用的是“活动寄存器(Active Register)”。只有在特定的、安全的时刻(例如计数器归零
CTR=0或到达周期值CTR=PRD时),影子寄存器的内容才会一次性加载到活动寄存器中。这确保了在一个PWM周期内,控制参数是稳定不变的,避免了在计数器运行中途更新参数可能导致的脉冲宽度异常。 - 无影子寄存器(No):如TBCTL(控制寄存器)、TBCNT(计数器值寄存器)。对这些寄存器的写操作会立即生效。这意味着在配置它们时需要更加小心,通常需要在PWM输出禁用或计数器停止时进行。
核心要点四:HRPWM扩展寄存器。表中带有(2)注释的寄存器(如TBPHSHR, CMPAHR, HRCNFG)是可选的高分辨率扩展寄存器。只有支持HRPWM功能的ePWM实例才会存在这些寄存器。在编程前,必须查阅具体芯片的数据手册,确认当前使用的ePWM模块是否支持HRPWM,否则访问这些保留地址可能导致不可预知的行为。
注意:在初始化ePWM时,一个良好的习惯是,先配置好所有带影子寄存器的参数(如TBPRD, CMPA),最后再使能计数器或输出。这样可以确保第一个PWM周期开始前,所有参数都已就绪。
3. 核心子模块深度剖析与配置实战
3.1 时间基准(TB)子模块:PWM节拍器的核心
TB子模块是整个eHRPWM的时序之源。其核心是一个16位的向上/向下计数器(TBCNT),以及控制其运行模式的寄存器组。
3.1.1 关键寄存器与信号
- TBCTL(控制寄存器):核心中的核心。你需要通过它设置:
CTRMODE[1:0]:计数器模式。00=停止,01=向上计数,10=向下计数,11=向上向下计数。这是决定PWM波形对称性的关键。PHSEN:相位使能。决定是否在同步信号到来时,将相位寄存器(TBPHS)的值加载到计数器TBCNT。PRDLD:周期加载模式。0=影子模式(在CTR=0时加载),1=立即加载模式。强烈建议在大多数应用中使用影子模式以保证同步更新。SYNCOSEL[1:0]:同步输出选择。决定本模块产生同步输出信号EPWMxSYNCO的事件源,可以是输入同步SYNCI、CTR=0或CTR=CMPB。用于构建主从同步链。HSPCLKDIV和CLKDIV:高速时钟预分频和时钟预分频。两者级联,共同决定时间基准时钟TBCLK相对于系统时钟SYSCLKOUT的频率。TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)。
- TBPRD(周期寄存器):设定PWM周期的计数值。计数器TBCNT将在0和TBPRD之间循环。PWM频率的计算公式取决于计数模式:
- 向上计数模式:
T_pwm = (TBPRD + 1) * T_tbclk,F_pwm = 1 / T_pwm - 向下计数模式:与向上计数模式公式相同。
- 向上向下计数模式:
T_pwm = 2 * TBPRD * T_tbclk,F_pwm = 1 / T_pwm其中,T_tbclk = 1 / F_tbclk,F_tbclk即TBCLK的频率。
- 向上计数模式:
- TBPHS(相位寄存器):用于实现多个ePWM模块之间的相位差。当
PHSEN=1且同步事件发生时,TBPHS的值会加载到TBCNT中,从而实现从模块与主模块之间固定的相位偏移。 - 关键事件信号:
CTR=PRD:计数器等于周期值。在向上计数和向上向下计数模式中产生。CTR=0:计数器等于零。在向下计数和向上向下计数模式中产生。EPWMxSYNCI/SYNCO:同步输入/输出信号,用于模块间级联。
3.1.2 同步机制与相位控制实战多模块同步是工业应用中的常见需求,例如三相逆变器需要三个相位互差120度的PWM波。
场景:使用ePWM1作为主模块,ePWM2和ePWM3作为从模块,输出三相互差120度的对称PWM波。
- 主模块(ePWM1)配置:
- 设置
TBCTL[SYNCOSEL] = CTR=0,使其在每次计数器归零时产生同步输出脉冲EPWM1SYNCO。 - 配置为向上向下计数模式,设定好TBPRD和TBCLK分频。
- 设置
- 从模块(ePWM2, ePWM3)配置:
- 设置
TBCTL[PHSEN]=1,使能相位加载。 - 设置
TBCTL[SYNCOSEL] = SYNCI,将同步输出传递给下一个模块(可选,构成链式)。 - 关键步骤:计算并设置
TBPHS寄存器。对于对称PWM(向上向下计数),一个完整周期是2*TBPRD个时钟。要使ePWM2滞后ePWM1 120度,则相位差对应的计数值为(120/360) * 2 * TBPRD = (2/3) * TBPRD。同理,ePWM3滞后240度,计数值为(4/3) * TBPRD。将计算值(取整)写入各自的TBPHS。 - 将ePWM1的
EPWM1SYNCO连接到ePWM2和ePWM3的EPWMxSYNCI(具体连接方式由芯片的输入多路选择器决定)。
- 设置
- 全局时钟同步启动:为了避免各模块的TBCLK相位随机,TI推荐了标准的启动流程:
这个流程确保了所有ePWM模块的// 1. 使能ePWM模块的时钟(通过PSC模块) SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 2. 停止所有ePWM的时基时钟 SysCtl_disableTBCLKSync(SYSCTL_TBCLK_SYNC_DISABLE); // 3. 分别配置各个ePWM模块的TBCTL等寄存器(包括分频器HSPCLKDIV/CLKDIV) EPWM_setTimeBasePeriod(epwm1Base, periodValue); EPWM_setPhaseShift(epwm2Base, phase120); // ... 其他配置 // 4. 同步启动所有ePWM的时基时钟 SysCtl_enableTBCLKSync(SYSCTL_TBCLK_SYNC_ENABLE);TBCLK第一个上升沿是对齐的,为精确的相位控制奠定了基础。
实操心得:在调试同步系统时,如果发现相位关系不对,首先检查
TBCLK的分频设置HSPCLKDIV/CLKDIV在所有模块中是否一致。不一致的分频会导致即使同步信号对齐,计数器步进速度也不同,相位差会逐渐漂移。其次,用示波器同时抓取主模块的SYNCO信号和从模块的SYNCI信号,确认同步脉冲是否准确送达。
3.2 计数比较(CC)子模块:占空比的直接塑造者
CC子模块接收TB子模块的实时计数值TBCNT,并与CMPA和CMPB寄存器进行比较,产生决定PWM边沿的关键事件。
3.2.1 影子寄存器加载机制详解CMPA和CMPB寄存器都带有影子寄存器。其加载行为由CMPCTL寄存器控制:
SHDWAMODE/SHDWBMODE:选择CMPA/CMPB的工作模式。0=影子模式,1=立即加载模式。为保障PWM波形连续无毛刺,必须使用影子模式。LOADAMODE/LOADBMODE[1:0]:选择影子寄存器加载到活动寄存器的时机。这是实现PWM参数实时无扰更新的关键。00(CTR=0):在计数器等于0时加载。01(CTR=PRD):在计数器等于周期值时加载。10(CTR=0或CTR=PRD):在以上两个事件任一发生时加载。11:禁用加载(立即模式时)。
加载时机的选择策略:
- 向上计数或向下计数模式:由于每个周期只有一个
CTR=0或CTR=PRD事件,选择哪个时机加载都可以,效果一样。通常选择CTR=PRD加载。 - 向上向下计数模式:这是重点。一个PWM周期内,
CTR=0和CTR=PRD事件各发生一次。选择不同的加载时机,会影响新比较值生效的对称性。- 若选择
CTR=PRD加载,则新值将在计数器到达峰值后开始下降时生效。 - 若选择
CTR=0加载,则新值将在计数器到达谷底后开始上升时生效。 - 若选择
CTR=0或CTR=PRD,则新值可能在周期的任一个端点生效,取决于软件写入影子寄存器的时机,这可能导致不对称的波形,通常不推荐。 - 最佳实践:对于对称PWM,为了实现中心对齐且参数更新平滑,通常将
LOADAMODE设置为CTR=PRD,LOADBMODE也设置为CTR=PRD(或根据需求一致)。然后在中断服务程序中,在CTR=PRD事件发生后(即计数器开始下降时)更新CMPA/CMPB的影子寄存器值。这样,新参数将在下一个完整周期生效,且关于中心点对称。
- 若选择
3.2.2 占空比计算与CMP值设定占空比(Duty Cycle)定义为高电平时间与整个周期的比值。CMPA/B寄存器的值决定了事件触发点,进而通过AQ子模块决定边沿。
- 向上计数模式(非对称PWM):
- 假设我们希望EPWMxA输出一个在计数器等于CMPA时拉高,在
CTR=PRD时拉低的波形(这是常见配置)。 - 那么,高电平时间 =
(TBPRD - CMPA) * T_tbclk - 占空比 =
(TBPRD - CMPA) / (TBPRD + 1) - 因此,
CMPA = TBPRD - Duty * (TBPRD + 1)。
- 假设我们希望EPWMxA输出一个在计数器等于CMPA时拉高,在
- 向上向下计数模式(对称PWM):
- 假设我们希望EPWMxA输出一个在
CTR=CMPA(上升沿)时拉高,在CTR=CMPA(下降沿)时拉低的波形(AQ配置为在CTR=CMPA且计数器向上时置高,向下时拉低)。 - 那么,高电平时间 =
2 * (TBPRD - CMPA) * T_tbclk - 占空比 =
(TBPRD - CMPA) / TBPRD - 因此,
CMPA = TBPRD - Duty * TBPRD。
- 假设我们希望EPWMxA输出一个在
注意事项:CMPA/B的值必须在
0到TBPRD之间(对于向上向下计数模式)。如果设置值等于0或TBPRD,比较事件在周期中只会发生一次(在波峰或波谷),这会影响AQ的动作次数。如果设置值超出范围,在向上/向下模式下可能永远不会触发比较事件。
3.3 动作限定(AQ)子模块:事件到动作的翻译官
AQ子模块是连接“时间事件”和“引脚动作”的桥梁。它接收来自TB的CTR=PRD、CTR=0事件和来自CC的CTR=CMPA、CTR=CMPB事件,并根据当前计数器的方向(CTR_dir),按照AQCTLA和AQCTLB寄存器的配置,对输出EPWMxA和EPWMxB执行操作。
3.3.1 AQCTLA/AQCTLB寄存器配置逻辑每个寄存器(控制A输出或B输出)包含6个2位字段,分别对应6个事件:
CBU:CTR = CMPB且计数器向上 (CTR_dir=UP)CBD:CTR = CMPB且计数器向下 (CTR_dir=DOWN)CAU:CTR = CMPA且计数器向上CAD:CTR = CMPA且计数器向下PRD:CTR = PRDZRO:CTR = 0
每个字段可以配置为:
00:无动作。01:在事件发生时,清除输出(置为低电平)。10:在事件发生时,置位输出(置为高电平)。11:在事件发生时,翻转输出。
通过灵活组合这些事件和动作,可以生成极其丰富的PWM波形。
3.3.2 典型波形生成配置示例假设我们需要在ePWM1上生成一对互补带死区的PWM信号(A和B),采用向上向下计数模式,中心对齐。
- 配置TB子模块:设置为向上向下计数模式,设定TBPRD。
- 配置CC子模块:设定CMPA和CMPB的值,用于控制占空比和死区(死区由DB模块添加,此处CMPA=B可用于对称情况)。
- 配置AQ子模块(这是核心):
- 我们希望EPWM1A在计数器向上过程中达到CMPA时置高,在计数器向下过程中达到CMPA时拉低。这对应
CAU=SET (10),CAD=CLEAR (01)。 - 我们希望EPWM1B与EPWM1A完全互补(死区由后续DB模块添加)。那么EPWM1B应该在
CAU事件时拉低,在CAD事件时置高。即CAU=CLEAR (01),CAD=SET (10)。 - 对于
PRD和ZRO事件,我们通常不直接操作输出,而是用于触发中断或同步。可以设置为无动作(00)。 - 因此:
EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA);
- 我们希望EPWM1A在计数器向上过程中达到CMPA时置高,在计数器向下过程中达到CMPA时拉低。这对应
- 配置DB子模块:在AQ输出的原始互补信号基础上,插入死区时间。
3.3.3 软件强制输出AQSFRC和AQCSFRC寄存器提供了通过软件直接强制输出电平的能力,这在调试或特定控制序列中非常有用。AQSFRC是单次强制,AQCSFRC是连续强制(直到被清除)。但要注意,故障保护(TZ)子模块的优先级高于软件强制。
3.4 死区生成(DB)与故障保护(TZ)子模块:安全与可靠的保障
3.4.1 死区生成(DB)模块死区时间是防止桥臂直通的生命线。DB模块对来自AQ的一对信号(通常假设为互补的A和B)进行处理。
- 关键寄存器:
DBCTL:控制寄存器,用于使能/禁用死区、选择输入信号极性、选择输出模式(例如,对A路信号插入延迟生成A和B两路输出)。DBRED:上升沿延迟计数值。指定在输入信号上升沿后,延迟多少个TBCLK周期才让输出信号上升。DBFED:下降沿延迟计数值。指定在输入信号下降沿后,延迟多少个TBCLK周期才让输出信号下降。
- 工作模式:常见的是“主动高互补模式”。AQ输出的EPWMxA作为源信号,DB模块生成两路输出:
EPWMxA_DB(通常作为上管驱动):在源信号上升沿延迟DBRED后变高,在下降沿延迟DBFED后变低。EPWMxB_DB(通常作为下管驱动):在源信号下降沿延迟DBFED后变高,在上升沿延迟DBRED后变低。 这样就确保了一路关断后,另一路要经过一段死区时间才会开通。
- 计算死区时间:死区时间 =
DBRED * T_tbclk(或DBFED * T_tbclk,通常两者设成相同值)。例如,TBCLK=100MHz (10ns),DBRED=50,则死区时间为500ns。
3.4.2 故障保护(TZ)模块TZ模块是硬件安全屏障,响应速度远快于软件中断。
- 关键寄存器:
TZSEL:选择哪些外部故障引脚(TZ1~TZn)可以触发本ePWM模块的保护动作。TZCTL:配置当故障发生时,EPWMxA和EPWMxB输出应被强制为何种状态(高、低、高阻Hi-Z或忽略)。TZEINT:使能故障触发CPU中断。TZFLG:故障标志位,指示哪个故障源发生了。TZCLR:用于清除故障标志。TZFRC:软件强制触发故障,用于测试。
- 工作模式:
- 单次触发(One-Shot):故障信号有效后,输出立即被强制到安全状态,并且锁存。即使故障信号消失,输出也保持安全状态,直到软件通过
TZCLR清除标志。 - 周期逐次(Cycle-By-Cycle):故障信号有效期间,每个PWM周期输出都会被强制到安全状态。一旦故障信号消失,下一个PWM周期输出即恢复正常。这种模式适用于过流保护等需要快速响应的场景。
- 单次触发(One-Shot):故障信号有效后,输出立即被强制到安全状态,并且锁存。即使故障信号消失,输出也保持安全状态,直到软件通过
- 配置实战:假设我们使用TZ1引脚连接过流比较器输出,希望触发周期逐次保护,将输出强制拉低。
// 选择TZ1作为故障源,并配置为周期逐次模式 EPWM_enableTripZoneSignals(epwm1Base, EPWM_TZ_SIGNAL_1); EPWM_setTripZoneAction(epwm1Base, EPWM_TZ_ACTION_EVENT_TZB, // 这里TZB代表周期逐次模式 EPWM_TZ_ACTION_LOW); // 动作:强制输出为低 // 使能TZ中断(如果需要) EPWM_enableTripZoneInterrupt(epwm1Base);
避坑指南:故障保护配置后,一定要在硬件上模拟一个故障信号(例如拉低TZ引脚),用示波器验证输出是否按预期被强制。同时,确保在软件中断服务程序(如果使能了)中正确清除故障标志
TZFLG,否则可能导致保护无法退出或中断持续触发。
4. 高级功能与系统集成考量
4.1 事件触发(ET)与中断管理
ET子模块负责将PWM周期内的关键事件转化为CPU中断,是实现软件实时控制(如电流环、电压环)的基石。
- 关键寄存器:
ETSEL:选择触发中断(INT)或ADC启动(SOC)的事件源。事件源包括:CTR=PRD,CTR=0,CTR=CMPA(上/下),CTR=CMPB(上/下)。ETPS:事件预分频。可以配置为在第N次(1st, 2nd, 3rd)事件发生时才产生中断脉冲。这对于降低CPU中断负载非常有用。例如,在CTR=PRD事件处产生中断来更新占空比,但可以设置为每2个周期中断一次。ETFLG:中断标志位。ETCLR:清除中断标志。ETFRC:软件强制触发中断事件。
- 标准中断初始化流程:手册15.2.2节强调了一个关键流程,旨在避免因ePWM时钟刚使能时寄存器状态不确定而产生的伪中断。
- 禁用全局中断(操作CPU的INTM位)。
- 禁用ePWM模块中断(清除
ETSEL[INTEN])。 - 初始化所有ePWM配置寄存器(TB, CC, AQ, DB等)。
- 清除所有可能已置位的伪中断标志(
ETFLG)。 - 使能ePWM模块中断(设置
ETSEL[INTEN])。 - 使能全局中断。 这个流程是保证中断系统稳定运行的黄金法则。
4.2 高分辨率PWM(HRPWM)扩展
对于需要极高精度(如功率因数校正PFC、谐振变换器)的应用,传统PWM的边沿分辨率受限于TBCLK周期。HRPWM通过微边沿定位(MEP)技术,在TBCLK的一个周期内进行亚周期级的延时,可将分辨率提高8-12倍。
- 核心思想:利用芯片内部的一个数字延迟线,对传统的PWM边沿进行微调。调整的步进可以达到150ps左右,远小于一个
TBCLK周期(例如10ns)。 - 关键寄存器:
CMPAHR:这是CMPA的高分辨率扩展寄存器。其低8位(MEP)用于微调。TBPHSHR:相位寄存器的高分辨率扩展。HRCNFG:HRPWM配置寄存器,用于选择操作模式(如微调CMPA还是相位)、边沿选择等。
- 使用方式:通常,我们通过特定的HRPWM校准API获取当前芯片的MEP标定因子,然后通过公式计算
CMPAHR的值。TI提供了库函数来简化这一过程。重要提示:HRPWM功能对温度、电压和工艺敏感,通常需要在不同工作点进行校准,并将校准数据存储在非易失性存储器中,上电时加载。
4.3 多模块协同与系统级设计要点
当设计一个包含多个ePWM模块的复杂系统(如三相逆变器、交错并联LLC)时,需考虑:
- 时钟同步:务必使用
SysCtl_enableTBCLKSync()函数同步启动所有模块的TBCLK,确保时序基准一致。 - 相位关系:利用
TBPHS寄存器精确设定模块间的相位差。计算时注意计数模式(向上向下模式需用2*TBPRD作为周期基准)。 - 中断分配:合理规划各模块的中断源。例如,让主桥臂的ePWM在
CTR=PRD时中断,用于更新所有桥臂的占空比;让从桥臂仅在故障时中断。利用ETPS预分频减轻CPU负担。 - 故障保护联动:可以将多个ePWM模块的故障输入
TZn连接到同一个硬件故障信号,并配置相同的保护动作,实现全局快速关断。 - 影子寄存器更新策略:在中断服务程序中更新CMPA/B影子寄存器时,要确保在正确的加载事件(
CTR=0或PRD)之前完成写入。通常,在中断发生后立即更新是安全的,因为计数器到达事件点与加载动作发生之间有一个时钟周期的延迟。
5. 常见问题排查与调试技巧实录
即使理解了所有原理,实际调试中依然会遇到各种问题。以下是我在项目中积累的一些常见问题与排查思路:
问题1:PWM完全没有输出。
- 检查清单:
- 时钟与使能:确认系统时钟
SYSCLKOUT正常,ePWM模块的时钟通过PSC模块已使能。 - GPIO复用:确认EPWMxA/B对应的引脚已正确配置为PWM输出功能,而非普通的GPIO。
- 输出使能:检查AQ子模块是否配置了有效的动作(SET/CLEAR/TOGGLE)。如果所有事件都配置为“无动作”,输出将保持默认状态(通常是高阻)。
- 计数器状态:读取
TBCNT寄存器,看它是否在循环计数。如果TBCTL[CTRMODE]被误设为FREEZE(冻结)模式,计数器不会运行。 - 强制输出测试:尝试使用
AQSFRC寄存器软件强制输出高或低,看引脚是否有响应。这可以快速隔离是配置问题还是时钟/引脚问题。
- 时钟与使能:确认系统时钟
问题2:PWM频率或占空比与计算值不符。
- 检查清单:
TBCLK计算:双重检查TBCTL[HSPCLKDIV]和TBCTL[CLKDIV]的分频系数。TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)。一个常见的错误是忽略了高速预分频器HSPCLKDIV。- 计数模式与公式:确认使用的频率/占空比公式与
TBCTL[CTRMODE]设置的计数模式匹配。向上向下计数模式的周期是2*TBPRD*T_tbclk,而非(TBPRD+1)*T_tbclk。 - 影子寄存器:确认你修改的是否是影子寄存器,以及加载时机
LOADAMODE是否设置正确。如果你在计数器运行中更新了CMPA的影子寄存器,但加载时机未到,新值不会立即生效。读取CMPA寄存器(活动值)和影子寄存器值(通过特定方式)进行对比。 - CMPA/B值范围:确保CMPA/B的值在0到TBPRD之间。超出范围的值在向上/向下模式下可能导致比较事件永不发生。
问题3:多个ePWM模块无法同步,或相位差不对。
- 检查清单:
- 同步信号路径:用示波器或代码读取
EPWMxSYNCI输入状态,确认主模块的SYNCO脉冲是否到达从模块。检查TBCTL[SYNCOSEL]配置。 - 相位加载使能:确认从模块的
TBCTL[PHSEN]位已置1。 TBCLK分频一致性:这是最容易被忽略的一点!所有需要同步的ePWM模块,其TBCTL[HSPCLKDIV]和CLKDIV必须设置为完全相同的值。否则,即使同时启动,计数器累加速度不同,相位也会很快错开。TBPHS值计算:重新计算相位寄存器值。对于向上向下模式,相位差对应的计数值是(相位差/360) * 2 * TBPRD。
- 同步信号路径:用示波器或代码读取
问题4:插入死区后,波形异常或死区时间不对。
- 检查清单:
- DB模块输入源:检查
DBCTL寄存器中IN_MODE位的配置,确认DB模块接收的是来自AQ的哪两路信号。配置错误会导致输出混乱。 - 输出极性:检查
DBCTL[POLSEL],确保生成的互补信号极性符合你的功率级驱动要求(例如,上管高有效,下管低有效)。 DBRED/DBFED值:确认写入的延迟计数值。死区时间 = 计数值 *T_tbclk。用示波器测量上升沿和下降沿之间的实际延迟,与计算值对比。- AQ输出与DB输入关系:在使能DB模块前,先验证AQ子模块输出的原始信号是否正确。可以临时旁路DB模块(
DBCTL[MODE]=DISABLE),直接观察AQ的输出。
- DB模块输入源:检查
问题5:故障保护(TZ)不动作或误动作。
- 检查清单:
- 故障源选择:检查
TZSEL寄存器,确认你关心的故障引脚(如TZ1)已被使能。 - 动作配置:检查
TZCTL寄存器,确认为指定的故障事件配置了正确的强制动作(如拉低)。 - 工作模式:确认配置的是单次触发(
OSHT)还是周期逐次(CBC)模式。TZSEL寄存器中分别有对应的使能位。 - 引脚状态:检查故障输入引脚的实际电平。可能是外部比较器电路问题,或者引脚内部上拉/下拉配置冲突。
- 标志位清除:如果是单次触发模式,故障发生后输出会锁存。必须在处理完故障原因后,手动向
TZCLR寄存器的对应位写1来清除故障标志TZFLG,否则输出将一直保持强制状态。
- 故障源选择:检查
调试eHRPWM,最强大的工具是结合代码仿真(观察寄存器值)和示波器(观察实际波形)。当遇到问题时,系统地按照“时钟源 -> 计数器 -> 比较器 -> 动作器 -> 输出整形 -> 引脚”这条信号链进行分段排查,总能定位到问题的根源。理解本文所述的寄存器与子模块架构,正是为了让你在调试时,能清晰地知道该去检查哪个环节的哪个寄存器。