深入解析TI ePWM:从寄存器映射到电机驱动实战
1. 项目概述:从寄存器表到可运行的PWM波形
如果你曾经在嵌入式项目中用过PWM,大概率接触过那种简单的定时器PWM外设——设置一个周期寄存器,再设置一个比较寄存器,一个通道的PWM波形就出来了。这种简单PWM在控制LED亮度、驱动蜂鸣器时够用,但一旦涉及到电机驱动、数字电源、逆变器这类需要多路精确同步、带死区互补、还要有快速故障保护的应用,就显得力不从心了。
TI的增强型PWM模块,也就是ePWM,就是为了解决这些复杂需求而生的。它不是“一个”PWM发生器,而是一个高度模块化、可编程的PWM“系统”。我第一次接触ePWM时,面对那几十个寄存器,感觉就像拿到了一张复杂机器的零件清单,每个零件(寄存器)都知道是干嘛的,但怎么把它们组装成一个能精准运转的整体,却毫无头绪。官方技术手册提供了详尽的寄存器映射和子模块框图,但如何将这些静态信息转化为动态、可配置的代码逻辑,中间缺了最关键的一环——“为什么”要这么配置,以及“如何”根据需求组合这些模块。
本文的目的,就是帮你补上这一环。我不会再重复手册里已有的寄存器位定义列表,而是以一个资深嵌入式工程师的视角,带你深入ePWM的“车间”,从寄存器映射这张“蓝图”出发,拆解每个子模块的“工作原理”和“装配逻辑”。我们会聚焦于最核心的时间基准(TB)、**计数器比较(CC)和动作限定(AQ)**这三个子模块,因为它们是构建任何PWM波形的基石。通过理解它们如何协同工作,你就能举一反三,轻松驾驭死区、故障保护等高级功能。最终,你将获得的不只是知识,而是一种能够根据具体应用需求(比如生成一对带死区的互补PWM,或者实现多路相位同步的SPWM),自主设计并配置ePWM的能力。
2. ePWM架构总览与寄存器映射解析
在深入每个子模块之前,我们必须先建立起对ePWM整体架构的宏观认识。ePWM模块的寄存器组织方式非常清晰,它完全按照其功能子模块进行分组映射。这种设计并非随意,而是体现了其“模块化、流水线”的工作思想。
2.1 寄存器映射:模块化的地址空间视图
手册中的表19-1是整个ePWM的“户口本”。它告诉我们,每个ePWM实例(例如EPWM1, EPWM2...)都拥有一套完全相同的寄存器组,这些寄存器按子模块整齐排列。这种“每个实例一份完整拷贝”的设计,保证了各个ePWM通道的独立性和可配置性。
这里有一个关键细节常被忽略:“Shadow”和“Privileged Mode Write Only”这两个属性。以TBPRD(周期寄存器)和CMPA/CMPB(比较寄存器)为例,它们被标记为“Shadowed”(有影子寄存器)。这意味着你软件写入的值并非直接作用于硬件计数器,而是先存入一个缓冲寄存器(影子寄存器),然后在某个特定的、安全的时刻(如计数器为零或等于周期值时)自动加载到“活动寄存器”中。这个机制至关重要,它能防止在PWM周期中间更新比较值或周期值,导致输出波形出现毛刺或畸变。想象一下,在电机高速运转时,如果比较值在计数器递增过程中被突然改变,可能会导致功率管桥臂直通,后果严重。因此,对于任何会在PWM周期内动态调整的参数(如占空比、频率),必须使用影子寄存器模式。
而像TZSEL(故障区选择寄存器)这类标记为“Privileged Mode Write Only”的寄存器,通常与系统安全相关,只能在特权模式下写入,这为关键的保护功能增加了一层软件防护。
2.2 核心信号流:数据如何在子模块间传递
ePWM的八个子模块并非孤立工作,它们通过一系列内部信号串联成一条处理流水线。理解这条信号流,是灵活配置ePWM的关键。核心流程可以概括为以下几步:
时钟与节拍(Time-Base, TB):
TB子模块是心脏,它产生最基础的TBCLK时钟和TBCTR计数器。TBCTR的计数模式(递增、递减、先增后减)决定了PWM的基本周期和对称性。它产生两个核心事件:CTR=PRD(计数器等于周期值)和CTR=ZERO(计数器等于零)。这两个事件是PWM周期的天然边界。刻下标记点(Counter-Compare, CC):
CC子模块是标尺。它持续将TBCTR的值与CMPA和CMPB寄存器进行比较。当TBCTR等于CMPA或CMPB时,就产生CTR=CMPA和CTR=CMPB事件。这两个事件本质上就是PWM输出跳变的“时间戳”。占空比的调节,就是通过改变CMPA/CMPB的值来实现的。执行动作(Action-Qualifier, AQ):
AQ子模块是决策中心。它接收来自TB和CC的四个事件(CTR=PRD,CTR=ZERO,CTR=CMPA,CTR=CMPB),并根据配置,决定在每一个事件发生时,对输出引脚EPWMxA和EPWMxB执行什么“动作”:置高、拉低、翻转,或保持不动。PWM波形就是在这里被“画”出来的。后续处理:生成的原始PWM信号会依次经过
DB(死区发生器,插入上升沿/下降沿延迟,防止桥臂直通)、PC(斩波器,生成高频载波用于驱动隔离器件如IGBT)、TZ(故障区,在故障信号到来时强制输出安全状态)。ET(事件触发)子模块则负责在特定事件(如CTR=PRD)发生时,产生中断或触发ADC启动转换,实现精准的采样控制。
一个重要的思维转变:不要孤立地看待每个寄存器,而要把它们看作这条流水线上的“控制阀门”。配置TBCTL是设定心脏的跳动节奏,配置CMPA是设定跳变点,配置AQCTLA是规定在跳变点执行什么操作。接下来,我们就深入最核心的三个“车间”,看看它们具体如何运作。
3. 时间基准(TB)子模块:PWM的心脏与节拍器
时间基准子模块是整个ePWM的节奏之源。它定义了PWM波形的“时间尺子”,所有其他事件都基于这个尺子来定位。其核心是一个16位的计数器TBCTR和它相关的控制逻辑。
3.1 核心寄存器与信号解读
TB子模块的寄存器虽少,但每个都至关重要:
TBCTL(控制寄存器):这是大脑。它决定计数器模式(CTRMODE)、时钟预分频(HSPCLKDIV,CLKDIV)、相位加载使能(PHSEN)、影子寄存器加载模式(PRDLD)等。TBPRD(周期寄存器):这是尺子的总长度。它决定了TBCTR计数到多少为一个周期。TBPRD的值直接决定了PWM的频率。TBCTR(计数器寄存器):这是尺子的当前刻度。它随着TBCLK的节拍递增或递减,软件可读,但通常不直接写(写操作主要用于同步或强制复位)。TBPHS(相位寄存器):用于多个ePWM模块同步时,设定从模块相对于主模块的相位偏移。TBSTS(状态寄存器):主要包含CTR_MAX标志位(计数器达到最大值0xFFFF),用于监控。
关键信号:
CTR=PRD&CTR=ZERO:这两个事件信号是PWM周期的“起止符”,不仅用于内部状态机,也是触发影子寄存器加载、产生中断/ADC触发的重要源。CTR_dir:计数器方向信号。高电平表示递增,低电平表示递减。这个信号对AQ子模块至关重要,因为它允许我们为计数器的上升沿和下降沿分别定义不同的动作。EPWMxSYNCI/EPWMxSYNCO:同步输入/输出信号。用于将多个ePWM模块的计数器在时间上对齐,是实现多相PWM(如三相逆变器)的基础。
3.2 计数模式与频率计算:三���“心跳”方式
TBCTR有三种基本计数模式,对应三种不同的PWM波形类型:
递增计数模式(Up-Count):
- 行为:
TBCTR从0开始,每个TBCLK加1,直到等于TBPRD,然后瞬间归零,重新开始。 - 波形特征:产生非对称PWM。波形在一个周期内只有一次比较事件(如果使用
CMPA),跳变沿不对称。 - 频率公式:
FPWM = 1 / TPWM = 1 / [(TBPRD + 1) * TTBCLK]。这里TTBCLK是TBCLK的周期。注意是TBPRD+1,因为计数器从0计数到TBPRD,总共是TBPRD+1个时钟 ticks。 - 应用场景:普通开关电源、简单的LED调光。
- 行为:
递减计数模式(Down-Count):
- 行为:
TBCTR从TBPRD开始,每个TBCLK减1,直到等于0,然后瞬间重载为TBPRD,重新开始。 - 波形特征:同样产生非对称PWM,但波形相位与递增模式相反。
- 频率公式:与递增模式相同,
FPWM = 1 / [(TBPRD + 1) * TTBCLK]。 - 应用场景:某些特定的拓扑结构或控制算法中可能需要。
- 行为:
递增-递减计数模式(Up-Down-Count):
- 行为:
TBCTR从0开始递增到TBPRD,然后立即转为递减,回到0,如此循环。 - 波形特征:产生对称(中心对齐)PWM。这是电机控制和数字音频D类功放中最常用的模式。因为波形关于中心对称,谐波特性更好,且在每个PWM周期内,
CTR=CMPA和CTR=CMPB事件会发生两次(一次在递增沿,一次在递减沿),为AQ模块提供了更灵活的控制点。 - 频率公式:
FPWM = 1 / TPWM = 1 / [2 * TBPRD * TTBCLK]。注意这里是2 * TBPRD,因为一个完整的周期包含了递增和递减两个阶段。 - 应用场景:电机FOC控制、逆变器、高性能D类音频放大器。
- 行为:
实操心得:频率计算中的“坑”很多新手在计算PWM频率时容易出错,根源在于混淆了“计数值”和“时钟周期数”。务必记住:在递增/递减模式下,计数器从A到B,经历的时钟 ticks 数是
|A - B| + 1。而在递增-递减模式下,一个完整周期是2 * TBPRD个 ticks。在编程时,我习惯先根据系统时钟SYSCLK和期望的PWM频率,反推出需要的TBCLK频率和TBPRD值。例如,系统时钟150MHz,想要20kHz的中心对齐PWM,如果选择TBCLK = SYSCLK / 2 = 75MHz,则TBPRD = (TBCLK / FPWM) / 2 = (75e6 / 20e3) / 2 = 1875。将这个值写入TBPRD即可。
3.3 同步机制:让多个心脏同频共振
在驱动三相电机或交错并联电源时,我们需要多个ePWM模块输出相位精确相关的PWM。TB子模块的同步功能就是为此而生。
- 硬件同步链:如图19-6所示,
EPWM1的同步输入EPWM1SYNCI通常来自外部引脚或其它外设(如eCAP)。EPWM1的同步输出EPWM1SYNCO连接到EPWM2的同步输入EPWM2SYNCI,以此类推,形成一个链。当主模块(如EPWM1)产生一个同步脉冲(例如在CTR=ZERO时),这个脉冲会沿着链传递,触发后续从模块的同步事件。 - 相位控制:当从模块的
TBCTL[PHSEN]位使能时,在同步事件发生时,从模块的TBCTR计数器会被强制加载TBPHS寄存器中的值。通过设置不同的TBPHS值,可以精确控制从模块波形相对于主模块的相位差。例如,在三相逆变器中,设置三个ePWM模块的TBPHS分别为0、TBPRD/3、2*TBPRD/3,即可生成相位互差120度的三相PWM。 - 全局时钟同步(TBCLKSYNC):这是一个更底层的同步。通过设置IOMM模块中的
TBCLKSYNC位,可以确保所有ePWM模块的TBCLK时钟沿精确对齐。正确的初始化顺序至关重要:先使能各ePWM模块的时钟,然后置TBCLKSYNC=0停止所有时基时钟,接着配置所有ePWM的预分频器和模式,最后再置TBCLKSYNC=1同时启动所有时钟。这避免了因模块使能时间不同步导致的初始相位随机。
4. 计数器比较(CC)子模块:PWM波形的雕刻刀
如果说TB模块定义了画布(时间轴)的大小,那么CC模块就是那把在画布上做标记的雕刻刀。它本身不产生输出,而是精确地定义在时间轴的哪些“刻度”上,需要触发后续的动作。
4.1 工作原理与影子寄存器机制
CC子模块的核心是两个16位的数字比较器,分别将TBCTR与CMPA和CMPB进行比较。当相等时,产生CTR=CMPA和CTR=CMPB事件。
这里最精妙的设计是影子寄存器机制。CMPA和CMPB都有对应的影子寄存器。在影子模式下(CMPCTL[SHDWAMODE]=0),你通过软件写入CMPA寄存器的值,实际上是写入了它的影子寄存器。这个值不会立即生效去影响正在进行的PWM周期。只有当特定的“加载事件”发生时(由CMPCTL[LOADAMODE]位配置,通常是CTR=PRD或CTR=ZERO),影子寄存器的内容才会被安全地传输到活动寄存器中,从而影响下一个PWM周期。
为什么需要这个机制?想象一下,你正在用PWM控制电机的电流。当前周期内,TBCTR正在从0向TBPRD递增。如果在递增到一半时,你的控制算法更新了CMPA值(为了调节电流),并且这个新值立即生效。此时可能出现两种情况:1) 新值大于当前TBCTR,那么本周期内不会再产生CTR=CMPA事件,导致输出异常;2) 新值小于当前TBCTR,则会立即触发一个CTR=CMPA事件,导致在当前周期内产生一个额外的、非预期的跳变。无论哪种情况,都会导致输出波形出现严重毛刺,在功率应用中可能引发灾难性后果。影子寄存器机制完美避免了这个问题,确保了PWM参数更新的平滑和安全。
4.2 不同计数模式下的比较事件特性
CC子模块的行为与TB的计数模式紧密耦合:
- 在递增或递减模式下:
TBCTR单向变化。因此,CTR=CMPA事件在一个PWM周期内最多发生一次。只有当CMPA的值在0到TBPRD之间(且不等于0或TBPRD)时才会发生。如果CMPA等于0或TBPRD,事件会在周期边界(CTR=ZERO或CTR=PRD)与其他事件同时发生,需要AQ模块的优先级逻辑来处理。 - 在递增-递减模式下:
TBCTR先增后减。因此,只要CMPA的值在0到TBPRD之间(不包括边界),CTR=CMPA事件每个PWM周期会发生两次:一次在递增过程中,一次在递减过程中。这是生成对称PWM波形的关键。如果CMPA等于0或TBPRD,则事件只在CTR=0或CTR=PRD时发生一次。
图19-13至19-16的波形图清晰地展示了这一点。特别注意图19-13的注释:外部同步事件EPWMxSYNCI可能导致TBCTR序列不连续,从而“跳过”一次比较事件。这不是错误,而是正常现象。在设计同步系统时,必须考虑这种可能性,避免依赖单个周期内必然发生的比较事件来做关键逻辑。
注意事项:CMPA/CMPB的取值范围虽然
CMPA/CMPB是16位寄存器,理论上可以设置为0x0000到0xFFFF之间的任何值,但其有效工作范围受TBPRD限制。在递增/递减模式下,如果CMPA>TBPRD,则在整个计数过程中TBCTR永远不会等于CMPA,CTR=CMPA事件永远不会发生,输出将保持恒定(高或低,取决于AQ配置)。在递增-递减模式下,如果CMPA>TBPRD,同样不会发生比较事件。通常,在初始化时,应确保CMPA/CMPB≤TBPRD。动态调整时,也需注意此边界。
5. 动作限定(AQ)子模块:波形的最终决策者
AQ子模块是ePWM的“指挥官”。它接收来自TB和CC的四个核心事件(CTR=PRD,CTR=ZERO,CTR=CMPA,CTR=CMPB��,并根据当前的计数器方向(CTR_dir),决定对两个输出引脚EPWMxA和EPWMxB执行何种操作:置高(Set High)、拉低(Clear Low)、翻转(Toggle)或无视(Do Nothing)。
5.1 事件-动作映射与优先级逻辑
AQ的配置寄存器AQCTLA和AQCTLB的结构,本质上是一个查找表。对于每个输出(A和B独立),你可以为上述四个事件在计数器递增(Up)和递减(Down)时分别指定一个动作。
例如,要生成一个简单的、高电平有效的PWM波形在EPWMxA上,通常这样配置:
- 在
CTR=PRD事件(递增模式下周期结束,递减模式下周期开始)时:动作 =Clear(拉低)。 - 在
CTR=CMPA事件时:动作 =Set(置高)。
这样,在每个周期开始时(或结束时,取决于模式),输出先被拉低;当计数器增长到CMPA值时,输出被置高。占空比 =CMPA / TBPRD(递增模式)。
优先级问题:如果多个事件在同一时刻发生(例如在递增-递减模式下,CMPA = TBPRD,那么CTR=CMPA和CTR=PRD会在同一时刻发生),AQ模块有固定的硬件优先级来处理冲突。优先级从高到低通常是:CTR=PRD>CTR=ZERO>CTR=CMPB>CTR=CMPA(具体需查手册)。了解优先级对于配置边界条件(占空比0%或100%)和复杂波形至关重要。
5.2 生成互补对称PWM波形:一个经典案例
在电机驱动和全桥电源中,我们经常需要一对互补的、带死区的PWM信号(例如EPWMxA和EPWMxB)。仅使用AQ模块(不加DB死区模块)就可以生成基础的互补信号。假设使用递增-递减模式,希望EPWMxA和EPWMxB互补,且中心对称。
配置思路如下:
EPWMxA配置:- 在递增过程中,当
CTR=CMPA时:Set High(在CMPA点置高)。 - 在递减过程中,当
CTR=CMPA时:Clear Low(在CMPA点拉低)。 - 这样,
EPWMxA会在CMPA点产生一个上升沿,并在对称的CMPA点产生一个下降沿,形成一个中心对称的脉冲。
- 在递增过程中,当
EPWMxB配置:- 我们需要
EPWMxB与EPWMxA互补。一种方法是利用CTR=CMPB事件,并设置CMPB = TBPRD - CMPA。 - 在递增过程中,当
CTR=CMPB时:Clear Low(在CMPB点拉低)。 - 在递减过程中,当
CTR=CMPB时:Set High(在CMPB点置高)。 - 这样,
EPWMxB的脉冲中心与EPWMxA的脉冲中心对齐,但电平相反,形成互补。
- 我们需要
通过精细设置CMPA和CMPB,并配合AQ的双边沿独立动作,我们可以创造出非常复杂的多电平PWM波形,这对于某些高级调制算法(如空间矢量调制SVPWM)的实现是基础。
5.3 软件强制与连续强制
AQSFRC和AQCSFRC寄存器提供了软件强制输出状态的能力。这在某些调试或安全场景下非常有用。
AQSFRC:可以一次性强制EPWMxA或EPWMxB为高、低或翻转。强制操作发生后,输出控制权会立即交还给AQ逻辑。AQCSFRC:提供“连续强制”模式。在此模式下,你可以配置输出被强制为高或低,并锁定在该状态,无视AQ的正常事件-动作映射,直到你清除强制状态。这常用于实现紧急停机或测试模式。
避坑指南:AQ配置的常见错误
- 忘记配置计数器方向相关的动作:在递增-递减模式下,必须分别为
Up和Down配置事件动作。如果只配置了Up时的动作,那么Down时就会执行默认的“Do Nothing”,导致波形不对称。CMPA/CMPB值为0或TBPRD时的行为:此时比较事件与周期/零事件同时发生。务必查清硬件优先级,并测试输出是否符合预期。有时需要利用优先级,有时则需要避免这种边界情况。- 影子寄存器未生效导致波形错误:在动态更新
CMPA/CMPB后,如果忘记检查影子寄存器的加载事件是否已发生(或加载模式配置错误),新的占空比可能不会立即生效,导致控制环路出现滞后或错误。一个良好的习惯是在更新影子寄存器后,等待一个PWM周期结束的标志(如ET模块的中断),再进行下一次计算。
6. 从寄存器到代码:配置一个完整的ePWM通道
理论说得再多,不如一行代码。下面,我将以TI C2000系列DSP的典型配置为例,展示如何从零配置一个ePWM通道,生成一个频率20kHz、占空比30%、中心对齐的PWM波。假设系统时钟SYSCLK = 150MHz。
6.1 初始化步骤与参数计算
时钟与周期配置(TB子模块):
- 选择
TBCLK = SYSCLK / 2 = 75MHz(通过配置TBCTL[HSPCLKDIV]和TBCTL[CLKDIV])。 - 目标为中心对齐PWM,频率
FPWM = 20kHz。 - 计算
TBPRD:TBPRD = (TBCLK / FPWM) / 2 = (75e6 / 20e3) / 2 = 1875。 - 设置
TBCTL[CTRMODE] = 2(递增-递减模式)。 - 使能
TBPRD影子寄存器(TBCTL[PRDLD]=0),在CTR=ZERO时加载(默认)。
- 选择
占空比配置(CC子模块):
- 占空比30%,则高电平时间占整个周期的30%。对于中心对齐模式,
CMPA的值决定了脉冲的宽度。 - 计算
CMPA:CMPA = TBPRD * DutyCycle = 1875 * 0.3 = 562.5,取整为562。 - 设置
CMPCTL[SHDWAMODE] = 0(使能CMPA影子寄存器)。 - 设置
CMPCTL[LOADAMODE] = 0(在CTR=ZERO时加载影子寄存器到活动寄存器)。
- 占空比30%,则高电平时间占整个周期的30%。对于中心对齐模式,
波形生成配置(AQ子模块):
- 我们希望
EPWM1A输出中心对称的PWM。 - 配置
AQCTLA:- 在递增过程中,当
CTR=CMPA时:AQCTLA[CAD] = 1(Set High)。 - 在递减过程中,当
CTR=CMPA时:AQCTLA[CBU] = 2(Clear Low)。(注意:这里寄存器字段名是简写,实际需根据手册位域配置)。
- 在递增过程中,当
EPWM1B暂时不用,可以保持默认(Do Nothing)。
- 我们希望
6.2 示例代码片段(C语言风格)
// 假设寄存器已通过头文件映射为结构体 void EPWM1_ConfigForCenterAlignedPWM(void) { // 1. 停止时基时钟(配置前的好习惯) EALLOW; // 解除寄存器保护 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止所有ePWM时钟 EDIS; // 2. 配置TB子模块 EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 递增-递减模式 EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位加载(主模块) EPwm1Regs.TBCTL.bit.PRDLD = 0; // TBPRD使用影子寄存器,在CTR=ZERO加载 EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 同步输出选择:用自己的CTR=ZERO EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频 /1 EPwm1Regs.TBCTL.bit.CLKDIV = 1; // 时钟分频 /2 (最终 TBCLK = SYSCLK/2) EPwm1Regs.TBPRD = 1875; // 设置周期值,对应20kHz中心对齐PWM // 3. 配置CC子模块 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; // CMPB使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; // CTR=ZERO时加载CMPA影子 EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; // CTR=ZERO时加载CMPB影子 EPwm1Regs.CMPA.bit.CMPA = 562; // 设置比较值A,占空比约30% // 4. 配置AQ子模块,生成EPWM1A中心对称波形 // 清零相关配置位 EPwm1Regs.AQCTLA.all = 0; // 递增过程中,当CTR=CMPA时,将EPWM1A置高 EPwm1Regs.AQCTLA.bit.CAU = 2; // CAU: Action on Counter equal to CMPA when counting Up // 递减过程中,当CTR=CMPA时,将EPWM1A拉低 EPwm1Regs.AQCTLA.bit.CAD = 1; // CAD: Action on Counter equal to CMPA when counting Down // 5. 启动时基时钟 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 启动所有ePWM时钟 EDIS; }6.3 调试与验证技巧
配置完成后,如何验证?除了用示波器看输出,软件调试也很关键。
- 寄存器查看:在调试器中,实时查看
TBCTR寄���器的值,它应该在0到1875之间循环往复。观察CMPA的值是否在影子寄存器和活动寄存器之间正确加载。 - 事件触发与中断:可以配置
ET(事件触发)子模块,在CTR=PRD或CTR=ZERO时产生中断。在中断服务程序中,可以安全地更新CMPA影子寄存器以实现占空比动态调节,同时也可以打印计数器值,验证周期。 - 强制输出测试:使用
AQSFRC寄存器,在代码中手动强制EPWM1A为高或低,验证GPIO输出功能是否正常,排除硬件连接问题。 - 死区与故障保护测试:在基础PWM工作正常后,再逐步使能
DB和TZ模块。务必先设置安全的故障默认动作(如强制输出低电平),再连接功率电路。
7. 高级主题与故障排查实录
掌握了基础配置后,你可以探索更高级的功能,如死区插入、故障保护联动、数字比较事件等。这些高级功能都建立在TB、CC、AQ这三个核心子模块的理解之上。
7.1 死区生成器(DB)的集成
死区是防止桥式电路上下管直通的关键。DB模块接收来自AQ的原始PWM信号(EPWMxA和EPWMxB),并对其上升沿和下降沿分别插入可编程的延迟,生成最终的EPWMxA_OUT和EPWMxB_OUT。
DBRED(上升沿延迟):控制从输入信号有效边沿到输出信号上升沿的延迟。DBFED(下降沿延迟):控制从输入信号有效边沿到输出信号下降沿的延迟。DBCTL(控制寄存器):配置输入信号极性、输出模式(例如,将AQ生成的一个PWM信号,通过DB模块生成一对互补带死区的信号)。
配置要点:死区时间通常以TBCLK周期为单位。例如,TBCLK=75MHz,周期约13.33ns。若要插入100ns的死区,则需要设置DBRED或DBFED约为100ns / 13.33ns ≈ 7.5,取整为8,实际死区约106.7ns。需根据功率器件的开关特性仔细计算。
7.2 故障保护(TZ)的紧急处理
TZ模块是ePWM的安全卫士。它监控外部故障引脚(如过流、过温)或内部数字比较事件。一旦触发,可以立即强制PWM输出进入预设的安全状态(高、低、高阻),无需CPU干预,响应速度极快。
TZSEL:选择哪些故障源能触发本ePWM模块。TZCTL:配置触发故障后,EPWMxA和EPWMxB的输出动作(强制高、强制低、高阻)。TZEINT:使能故障中断,以便CPU记录故障事件。TZFRC:软件强制触发故障,用于测试。
安全第一原则:在初始化任何ePWM模块驱动功率器件之前,必须先配置好TZ模块,将故障动作设置为安全状态(通常是将所有输出强制拉低),并确保故障输入引脚已正确上拉/下拉,避免误触发。这是一个血泪教训,我曾因疏忽此步骤,在调试时导致MOSFET直通烧毁。
7.3 常见问题排查速查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 无PWM输出 | 1. ePWM模块时钟未使能。 2. GPIO复用功能未配置到PWM模式。 3. TBCTR未启动(TBCLKSYNC=0或CTRMODE=0冻结模式)。4. AQ模块所有动作均配置为“Do Nothing”。 | 1. 检查PCLKCR0寄存器中对应ePWM时钟使能位。2. 检查 GPIOxMUX/GPIOxGMUX寄存器,将引脚配置为EPWM模式。3. 检查 TBCTL[CTRMODE]不为0,并确认TBCLKSYNC已置1。4. 检查 AQCTLA/AQCTLB寄存器,确保至少有一个事件配置了Set/Clear/Toggle动作。 |
| PWM频率不对 | 1.TBCLK预分频计算错误。2. TBPRD值计算错误(混淆了计数模式)。3. 影子寄存器未生效,实际使用的仍是旧周期值。 | 1. 核对TBCTL[CLKDIV]和[HSPCLKDIV]配置。2. 重新计算:递增/递减模式 Fpwm = TBCLK / (TBPRD+1);递增-递减模式Fpwm = TBCLK / (2*TBPRD)。3. 检查 TBCTL[PRDLD]位,确认在更新TBPRD后,等待了CTR=ZERO事件。 |
| 占空比不可控或不变 | 1.CMPA/CMPB值超出TBPRD范围。2. 影子寄存器模式使能,但加载事件未发生或配置错误。 3. AQ模块配置错误,比较事件未绑定到输出动作。 | 1. 确保动态更新的CMPA值始终 ≤TBPRD。2. 检查 CMPCTL[LOADAMODE],确认加载事件(如CTR=PRD)是否会发生。在中断中更新CMPA后,可读取CMPA活动寄存器值验证是否加载。3. 检查 AQCTLA寄存器,确认CAU/CAD(或CBU/CBD)字段已正确配置为Set或Clear。 |
| 互补输出不对称或有毛刺 | 1. 在递增-递减模式下,只配置了Up或只配置了Down的动作。2. 死区模块 DB配置错误,输入极性弄反。3. CMPA和CMPB的值设置不当,未满足互补关系。 | 1. 检查AQCTLA和AQCTLB,确保为CAU/CAD、CBU/CBD都配置了动作。2. 检查 DBCTL寄存器中的IN_MODE和POLSEL位,确保输入信号极性正确。3. 对于中心对齐互补PWM,应满足 CMPA + CMPB = TBPRD。用示波器双通道同时测量,观察波形。 |
| 多路ePWM不同步 | 1. 同步链EPWMxSYNCI/SYNCO未正确配置或连接。2. 从模块的 TBCTL[PHSEN]未使能,或TBPHS值设置错误。3. 各模块 TBCLK分频不一致,导致TBCLKSYNC同步后频率不同。 | 1. 确认主模块的SYNCO源(如CTR=ZERO)已选择,且从模块的SYNCI已使能(PHSEN=1)。2. 检查从模块 TBPHS寄存器的值,计算其与主模块的期望相位差对应的计数值。3. 确保所有需要同步的ePWM模块,其 TBCTL[CLKDIV]和[HSPCLKDIV]设置完全相同。 |
回顾整个ePWM的学习与应用过程,其核心思想在于“解耦”与“联动”。八个子模块各司其职,通过清晰的寄存器接口和内部信号流松散耦合。这种设计赋予了它极大的灵活性。从简单的单路PWM到复杂的多相变频控制,其底层逻辑都是一致的:用时基定义节奏,用比较设定时刻,用动作绘制波形,再用死区、故障保护等模块进行修饰和加固。真正掌握ePWM,不在于背下所有寄存器位,而在于理解这套“信号流”哲学,并能根据目标波形,在脑海中清晰地规划出数据在这条流水线上的传递与转化路径。当你拿到一个新的电机驱动或电源拓扑需求时,能够迅速将其分解为ePWM各个子模块的配置参数,那才算是真正驾驭了这颗强大的心脏。