深入解析C2000 ePWM核心:CC与AQ子模块协同生成精密波形
1. ePWM模块:从计数器到波形的精密控制引擎
在嵌入式实时控制领域,无论是驱动一台无刷电机平稳旋转,还是让一个开关电源高效稳定地输出特定电压,其背后往往都离不开一个核心的执行单元——脉冲宽度调制(PWM)模块。而当我们谈论高精度、高灵活性的PWM时,德州仪器(TI)C2000系列微控制器中的增强型PWM(ePWM)模块无疑是业界的标杆之一。它远不止是一个简单的定时器加比较器,而是一个由多个高度专业化子模块构成的精密“波形合成引擎”。
今天,我们不谈空洞的理论,直接切入ePWM最核心、最体现其设计智慧的两个部分:计数器比较(Counter-Compare, CC)子模块和动作限定(Action-Qualifier, AQ)子模块。你可以把它们理解为一个交响乐团中的“乐谱识别者”和“乐器演奏者”。CC模块负责精准地“读谱”,在时间的洪流中标记出关键节拍点(何时该敲击、何时该停止);而AQ模块则是真正的“演奏家”,根据这些节拍点的指令,精确地操纵输出引脚(EPWMxA/B)发出高电平或低电平的“音符”,最终合成我们需要的PWM旋律。理解这两个模块如何协同工作,是解锁ePWM全部潜能,实现从简单方波到复杂多相交错PWM等高级应用的关键。无论你是正在调试电机驱动板的工程师,还是希望深入MCU外设底层的开发者,这篇文章都将带你绕过数据手册的繁琐描述,直击其设计精髓与实操要点。
2. 计数器比较(CC)子模块:时间轴的精准标尺
2.1 核心职责与工作流程
计数器比较子模块的核心任务极其专注:充当一个精准的“时间事件发生器”。它的输入是时基子模块(TB)产生的不断循环计数的TBCTR值,这个值就像一根匀速移动的指针,在0到周期值(TBPRD)之间来回扫描。CC模块则手握两把可编程的“标尺”——CMPA和CMPB寄存器。它的工作就是持续比较TBCTR指针的当前位置与这两把标尺预设的刻度。
当TBCTR的值与CMPA或CMPB寄存器中设定的值相等时,CC模块就会立即产生一个对应的硬件事件信号:CTR = CMPA或CTR = CMPB。这个“相等”的判断是硬件实时完成的,无需CPU干预,确保了事件触发的亚纳秒级精度。这些事件是ePWM波形构建的基石,它们被直接送往动作限定子模块,作为改变输出引脚状态的原始命令。
为什么需要两个比较寄存器?这提供了极大的灵活性。例如,在生成一个单路PWM时,CMPA可以控制上升沿,CMPB控制下降沿,从而实现非对称占空比和相位可调的脉冲。在更复杂的多路互补PWM中,CMPA和CMPB可以分别独立控制两路输出的占空比。
2.2 关键寄存器与影子寄存器机制
操作CC模块主要涉及三个寄存器,它们在内存映射中的角色如下表所示:
| 寄存器名称 | 地址偏移 | 是否支持影子寄存器 | 功能描述 |
|---|---|---|---|
| CMPCTL | 0x000C | 否 | 计数器比较控制寄存器。核心配置,如使能/禁用CMPA/B的影子寄存器、设定影子寄存器加载时机。 |
| CMPA | 0x0010 | 是 | 计数器比较A寄存器。存储用于与TBCTR比较的A值。 |
| CMPB | 0x0016 | 是 | 计数器比较B寄存器。存储用于与TBCTR比较的B值。 |
这里必须重点理解影子寄存器(Shadow Register)机制,这是ePWM实现无毛刺、平滑PWM调制的关键。对于CMPA和CMPB,每个都有一个对应的“影子寄存器”。我们软件读写的是影子寄存器,而硬件真正用于实时比较的则是“活动寄存器”。
为什么需要这个机制?想象一下,你正在播放音乐(生成PWM),突然中途修改了乐谱(CMP值)。如果直接修改正在演奏的乐谱,很可能会产生一个错音(输出毛刺)。影子寄存器机制避免了这个问题。它允许你在任何时间安全地更新影子寄存器中的值,而这个新值只会在一个特定的、安全的“乐句间隙”(例如计数器归零或达到周期值时)才会从影子寄存器加载到活动寄存器,从而确保在一个完整的PWM周期内,比较值是稳定不变的。
CMPCTL寄存器中的SHDWAMODE和SHDWBMODE位控制CMPA/B是否启用影子模式(默认启用)。LOADAMODE和LOADBMODE位则精确控制加载时机,可选在CTR=PRD(周期点)、CTR=ZERO(零点)或两者都发生时加载。在电机控制等实时性要求高的场合,通常设置为在CTR=ZERO时加载,以确保每个PWM周期开始时启用新的占空比,实现同步更新。
2.3 不同计数模式下的行为解析
CC模块的行为与时基计数器的工作模式紧密耦合,主要分为三种模式,其事件产生规律截然不同:
递增计数模式(Up-Count):
- 波形特征:生成非对称PWM波形。波形的一个边沿(通常是上升沿)固定在周期开始(CTR=0),另一个边沿由比较事件控制。
- 事件规律:在一个计数周期内(0 -> TBPRD),每个比较事件(CTR=CMPA/B)仅发生一次。例如,若CMPA=200,则仅在TBCTR计数到200时产生一次
CTR=CMPA事件。
递减计数模式(Down-Count):
- 波形特征:同样生成非对称PWM波形,但计数方向相反(从TBPRD递减到0)。
- 事件规律:在一个计数周期内,每个比较事件同样仅发生一次。
递增-递减计数模式(Up-Down-Count):
- 波形特征:生成对称(中心对齐)PWM波形。这是电机控制中最常用的模式,能有效降低谐波。
- 事件规律:最为复杂。在一个完整的三角波周期内(0 -> TBPRD -> 0),如果比较值CMPx介于0和TBPRD之间,则
CTR=CMPx事件会发生两次:一次在递增过程中,一次在递减过程中。这为实现对称PWM的上升沿和下降沿独立控制提供了基础。如果CMPx等于0或TBPRD,则每个周期只发生一次事件。
实操心得:在调试对称PWM时,务必注意比较事件在递增和递减阶段都会触发。这意味着如果你只在
CTR=CMPA事件上设置一个动作(如翻转),那么每个PWM周期输出会翻转两次,通常这不是你想要的结果。正确的做法是利用AQ模块,为CTR=CMPA在递增阶段(CAU)和递减阶段(CAD)分别分配不同的动作(如置高和拉低)。
2.4 一个关键陷阱:比较值大于周期值
数据手册中有一个容易忽略但至关重要的细节:当CMPA或CMPB的值大于设定的周期值TBPRD时,硬件行为会如何?
这并非错误操作,在某些特定配置下(如实现0-100%占空比)是故意为之的。硬件的行为根据计数模式有明确定义:
- 递增模式:若CMPx > TBPRD,则
CTR=CMPx事件永远不会发生。因为计数器根本数不到那个值。 - 递减模式:若CMPx >= TBPRD,则
CTR=CMPx事件会在计数器等于周期值(CTR=PRD)时发生。这可以用于在周期开始时立即触发一个动作。 - 递增-递减模式:若CMPx >= TBPRD,则
CTR=CMPx事件会在CTR=PRD(周期点)时发生,且只发生一次(因为计数器在TBPRD处就会转向)。
理解这一点对于实现诸如“完全关断”(100%低电平)或“完全导通”(100%高电平)这样的边界条件至关重要。例如,在对称PWM模式下,若想输出100%高电平,通常需要设置CMPA = TBPRD,并配置在递增阶段置高、递减阶段无动作(或也置高)。
3. 动作限定(AQ)子模块:事件的翻译官与执行者
3.1 角色定��与输入输出
如果说CC模块生产的是原始的“事件信号”,那么动作限定子模块就是一个高度可编程的“事件-动作翻译器”和“执行调度器”。它接收来自时基模块(CTR=PRD,CTR=ZERO)和比较模块(CTR=CMPA,CTR=CMPB)的四个核心事件,以及一个软件强制事件。
它的核心职责是:针对每一个输出引脚(EPWMxA和EPWMxB),独立地配置当某个特定事件发生时,应该执行何种动作。可执行的动作有四种:
- 置高(Set High):强制输出为高电平。
- 拉低(Clear Low):强制输出为低电平。
- 翻转(Toggle):输出当前电平状态取反。
- 无操作(Do Nothing):保持输出不变。注意,即使配置为无操作,该事件仍可能用于触发中断或ADC转换。
AQ模块的配置是完全独立的。这意味着,CTR=CMPA事件可以同时用于控制EPWMxA置高和EPWMxB拉低,为生成互补、带死区的PWM对提供了硬件基础。
3.2 核心控制寄存器解析
AQ模块的“大脑”是以下几个寄存器,它们直接决定了波形如何被“绘制”出来:
| 寄存器名称 | 地址偏移 | 是否影子 | 功能描述 |
|---|---|---|---|
| AQCTLA | 0x0014 | 否 | 输出A的动作限定控制寄存器。为EPWMxA配置每个事件(ZRO, PRD, CAU, CAD, CBU, CBD)对应的动作。 |
| AQCTLB | 0x001A | 否 | 输出B的动作限定控制寄存器。为EPWMxB配置每个事件对应的动作。 |
| AQSFRC | 0x0018 | 否 | 软件强制寄存器。允许软件立即、一次性强制产生一个事件(置高、拉低、翻转)。 |
| AQCSFRC | 0x001E | 是 | 连续软件强制控制寄存器。可配置为在特定事件后自动执行强制动作,常用于故障保护后的持续状态维持。 |
AQCTLA和AQCTLB是配置的重中之重。它们的位域直接对应到不同事件和计数方向。例如,AQCTLA.bit.CAU = AQ_SET表示:当事件“计数器在递增过程中等于CMPA”(CAU)发生时,对EPWMxA执行“置高”动作。
3.3 事件优先级:当多个节拍同时响起
一个关键且容易引发混乱的场景是:如果多个事件在同一时刻发生,听谁的?例如,在计数器归零的瞬间(CTR=ZERO),可能也同时达到了周期值(在递增模式下,从TBPRD归零时)或触发了某个比较事件(如果CMPx恰好设为0)。
AQ模块内置了固定的硬件优先级来解决冲突。其核心规则是:软件强制事件优先级最高,其余事件的优先级与时间顺序和计数方向相关。以最复杂的递增-递减模式为例,其优先级如下表所示(1为最高):
| 优先级 | TBCTR递增时 (0 -> TBPRD) | TBCTR递减时 (TBPRD -> 0) |
|---|---|---|
| 1 (最高) | 软件强制事件 | 软件强制事件 |
| 2 | CTR = CMPB(递增阶段 CBU) | CTR = CMPB(递减阶段 CBD) |
| 3 | CTR = CMPA(递增阶段 CAU) | CTR = CMPA(递减阶段 CAD) |
| 4 | CTR = ZERO | CTR = PRD |
| 5 | CTR = CMPB(递减阶段 CBD) | CTR = CMPB(递增阶段 CBU) |
| 6 (最低) | CTR = CMPA(递减阶段 CAD) | CTR = CMPA(递增阶段 CAU) |
这个优先级意味着什么?假设在递增过程中,TBCTR同时等于CMPA和CMPB(虽然不常见,但若设置相同值则可能),由于CBU(优先级2)高于CAU(优先级3),因此CTR=CMPB事件对应的动作将生效,而CTR=CMPA事件的动作将被忽略。这要求我们在配置时,必须仔细规划比较值的设置和动作的分配,避免意外的优先级覆盖导致波形错误。
4. 经典波形生成实战与代码剖析
理论最终要服务于实践。下面我们通过几个最典型的波形生成案例,结合代码,深入理解CC和AQ模块的协同配置。我们将使用TI C2000的C语言编译器支持的结构体位域语法来访问寄存器,这是最清晰和常用的方式。
4.1 案例一:递增模式,非对称PWM,两路独立输出
这是最基本的应用。我们希望生成两路独立的PWM,EPWMxA和EPWMxB,占空比分别由CMPA和CMPB控制,均为高电平有效(即占空比 = CMPx / (TBPRD+1))。
波形目标:
- EPWMxA:在周期开始时(CTR=0)置高,在CTR=CMPA时拉低。
- EPWMxB:在周期开始时(CTR=0)置高,在CTR=CMPB时拉低。
配置代码与解析:
// 初始化阶段 // ==================== EPwm1Regs.TBPRD = 600; // 周期寄存器:PWM周期 = (600 + 1) * Tbcik EPwm1Regs.CMPA.half.CMPA = 350; // 比较寄存器A:决定EPWMxA的占空比 EPwm1Regs.CMPB = 200; // 比较寄存器B:决定EPWMxB的占空比 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 设置为递增计数模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位同步(独立运行) EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使能TBPRD的影子寄存器 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出 // 配置CMPA/B在计数器归零时从影子寄存器加载,确保PWM周期同步更新 EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 核心:配置动作限定器AQ // EPWMxA: ZRO事件 -> 置高; CAU事件 -> 拉低 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // EPWMxB: ZRO事件 -> 置高; CBU事件 -> 拉低 EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // 运行时动态调整占空比 // ==================== EPwm1Regs.CMPA.half.CMPA = new_duty_a; // 只需更新CMPA影子寄存器 EPwm1Regs.CMPB = new_duty_b; // 只需更新CMPB影子寄存器 // 新值将在下一个CTR=ZERO点自动加载生效,无毛刺关键点:
AQCTLA.bit.CAU:我们只配置了递增阶段的比较事件CAU。因为在递增模式下,CAD事件永远不会发生。- 影子加载模式
LOADAMODE设置为CC_CTR_ZERO,这是最安全、最常用的选择,确保占空比在周期边界同步更新。
4.2 案例二:递增-递减模式,对称PWM,互补输出带死区
这是电机驱动和全桥/半桥电源中的经典配置。我们需要一对互补的、带死区时间的PWM信号(EPWMxA和EPWMxB)来控制上下桥臂,防止直通短路。这里我们不使用独立的死区模块,而是巧妙利用CMPA和CMPB来生成固定的死区。
波形目标:
- EPWMxA(上管控制):在递增阶段,当CTR=CMPA时置高;在递减阶段,当CTR=CMPA时拉低。生成一个对称的、高电平有效的PWM。
- EPWMxB(下管控制):与EPWMxA互补,但为了插入死区,其边沿由CMPB控制,且动作相反。
- 死区时间 = (CMPB - CMPA) * Tbcik。要求CMPB > CMPA。
配置代码与解析:
// 初始化阶段 // ==================== EPwm1Regs.TBPRD = 600; // 周期寄存器:对称PWM周期 = 2 * 600 * Tbcik EPwm1Regs.CMPA.half.CMPA = 350; // 比较寄存器A:控制EPWMxA的占空比及EPWMxB的开启点 EPwm1Regs.CMPB = 400; // 比较寄存器B:控制EPWMxB的关断点,CMPB - CMPA = 死区 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 关键:设置为递增-递减模式,生成对称PWM // ... 其他TBCTL配置(同案例一) // CMPA/B加载时机同样设在零点 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 核心:配置动作限定器AQ // EPWMxA: CAU事件 -> 置高; CAD事件 -> 拉低 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // EPWMxB: CBU事件 -> 拉低(上管关断后,下管才允许开启); CBD事件 -> 置高(下管在上管开启前关断) EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;波形逻辑推演:
- 计数器从0开始递增。
- 当
CTR=CMPA(CAU事件)时,EPWMxA被置高(上管开启)。此时EPWMxB无动作,保持低电平(下管关闭)。 - 计数器继续递增到TBPRD后开始递减。
- 当
CTR=CMPB(CBD事件)时,EPWMxB被置高(下管开启)。注意:此时CTR=CMPA(CAD)事件尚未发生,所以EPWMxA仍为高电平。但由于CMPB > CMPA,在递减过程中会先遇到CMPB,这意味着下管开启时,上管还未关闭,这会直通!等等,这里配置有问题吗? - 紧接着,当
CTR=CMPA(CAD事件)时,EPWMxA被拉低(上管关闭)。 - 计数器继续递减到0。
- 在下一个递增周期,当
CTR=CMPB(CBU事件)时,EPWMxB被拉低(下管关闭)。 - 然后
CTR=CMPA(CAU事件),EPWMxA置高,开始新的周期。
发现了什么?上述配置实际上产生的是重叠的PWM,而不是互补带死区的。EPWMxA高电平时,EPWMxB有短暂的高电平重叠期,这是致命的。经典的互补带死区配置通常需要结合动作限定和死区子模块(DB)来实现。单纯用CMPA/B做互补,更常见的配置是让两路输出在相同事件上做相反动作,死区由DB模块插入。本例演示了如何用CMPA/B控制边沿,但若要实现安全死区,需确保AQCTLB.bit.CBU = AQ_SET(与EPWMxA的CAU同时开启下管?不,这依然重叠)。更安全的做法是:EPWMxA由CMPA控制开关,EPWMxB由CMPA控制开启、CMPB控制关断,但这样又不是严格互补了。
避坑指南:这个案例揭示了单纯使用AQ和CC生成带死区的严格互补PWM的复杂性。在实际工程中,强烈建议使用ePWM内置的死区子模块(DB)**。你只需要生成一对互补的原始信号(例如EPWMxA为高有效,EPWMxB为低有效),然后通过DB模块独立配置上升沿和下降沿的延迟,硬件会自动为你插入死区,逻辑清晰且安全可靠。试图完全用CMPA/B和AQ来模拟死区,极易引入逻辑错误和直通风险。
4.3 案例三:单路脉冲定位(Pulse Positioning)
有时我们需要一个不在周期起点开始的单个脉冲。这可以通过一个通道(如EPWMxA)的两个比较寄存器来实现。
波形目标:在EPWMxA上生成一个脉冲,其上升沿由CMPA定位,下降沿由CMPB定位,脉冲宽度 = (CMPB - CMPA) * Tbcik。
配置代码:
// 初始化阶段 // ==================== EPwm1Regs.TBPRD = 600; EPwm1Regs.CMPA.half.CMPA = 200; // 脉冲起始点 EPwm1Regs.CMPB = 400; // 脉冲结束点 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 使用递增模式 // AQ配置:CAU事件置高,CBU事件拉低 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; EPwm1Regs.AQCTLA.bit.CBU = AQ_CLEAR; // 注意:不需要配置ZRO和PRD事件,因为脉冲完全由CMPA/B定义这种配置非常灵活,可以生成任意位置和宽度的脉冲,常用于触发ADC采样、生成特定时序的驱动信号等。
5. 高级话题与配置陷阱
5.1 影子寄存器更新时的“相位延迟”问题
这是一个在实际动态调整PWM时经常遇到的微妙问题。假设你在递增-递减模式下,配置CMPA在CTR=ZERO时从影子寄存器加载。当前PWM周期正在进行,你在计数器处于递增阶段时(比如TBCTR=100)更新了CMPA的影子寄存器(新值设为50)。
会发生什么?新的CMPA值(50)并不会立即生效。它必须等到当前PWM周期结束,计数器回到零点(CTR=ZERO事件)时,才会被加载到活动寄存器。因此,基于新值(50)的动作将延迟一个完整的PWM周期才出现。同时,当前周期剩余部分仍使用旧的CMPA值。
更复杂的是,如果你在递减阶段更新影子寄存器,而新值大于当前的TBCTR值,那么在本周期递减过程中就不会发生CTR=CMPA事件,直到下一个周期。这可能导致PWM输出出现一个周期的“空洞”或“展宽”。
解决方案:
- 规划更新时机:尽量在计数器处于“安全区域”时更新比较值。一个常见的策略是在
CTR=PRD中断中计算并更新下一个周期的CMP值。 - 理解边界条件:如前文数据手册所述,对于对称PWM,若在零点加载,应确保CMP值 >=1;若在周期点加载,应确保CMP值 <= TBPRD-1。这保证了每个周期至少有一个TBCLK的脉冲,避免因更新时机问题导致脉冲完全消失,这在某些功率电路中可能是危险的。
- 利用同步加载:通过主ePWM模块同步其他从模块,可以确保多个通道的CMP值在同一时刻更新,保持多相之间的严格同步。
5.2 软件强制事件的应用与注意事项
AQSFRC和AQCSFRC寄存器提供了软件直接干预输出的能力。
- AQSFRC(一次性强制):像是一个紧急按钮。你可以通过写
AQSFRC寄存器,立即产生一个置高、拉低或翻转动作,该动作受当前AQ优先级规则约束。例如,你可以强制将EPWMxA拉低,即使当前有更高优先级的硬件事件试图将其置高。这在响应故障信号、紧急停机时非常有用。 - AQCSFRC(连续软件强制):更像是一个锁定开关。配置后,在特定条件(如一次强制事件发生后)下,它会持续强制输出保持某种状态,直到你清除该配置。常用于故障保护后的锁存状态。
重要警告:软件强制事件具有最高优先级。滥用软件强制,尤其是在高优先级中断中随意使用,可能会破坏精心设计的硬件时序逻辑,导致不可预知的波形紊乱。通常,它应仅用于安全相关的故障处理。
5.3 调试技巧:从寄存器到示波器
当你的PWM波形不如预期时,如何系统化地排查?
- 确认时基(TB):首先检查
TBCTR是否在按预期计数(递增、递减或三角波)。可以通过在CTR=PRD或CTR=ZERO事件触发的中断中翻转一个GPIO来验证基本周期是否正确。 - 验证比较值:在调试器中监控CMPA和CMPB的活动寄存器(注意是活动寄存器,不是影子寄存器)的值,确认它们是否在预期的时间点被更新为正确的值。
- 检查AQ配置:逐位核对
AQCTLA和AQCTLB寄存器。一个常见的错误是混淆了CAU和CAD,或者在递增模式下配置了CAD(永远不会发生),导致动作失效。 - 利用强制事件测试:在调试初期,可以注释掉硬件事件配置,只使用
AQSFRC手动强制输出高和低,先验证引脚驱动和外部电路是否正常。 - 示波器观察:结合代码中的关键点(如更新CMP值、进入故障服务程序)和示波器触发,可以直观地看到软件操作与硬件波形之间的因果关系。例如,在更新CMP值的代码行后加一个GPIO翻转作为标记,用示波器另一通道观察,就能清晰看到更新指令与波形变化的实际延迟。
6. 总结与最佳实践建议
经过对计数器比较和动作限定子模块的深度剖析,我们可以看到,ePWM的强大源于其高度模块化和可编程的硬件架构。CC模块提供了精准的时间基准点,而AQ模块赋予了将这些时间点转化为复杂波形动作的无限灵活性。
回顾整个配置流程,一个稳健的ePWM初始化序列应遵循以下步骤:
- 时基配置:确定
TBPRD(频率)、计数模式(Up/Down/Up-Down)、时钟分频。 - 比较值初始化:设置
CMPA/CMPB���始值,并配置其影子加载模式(通常为CTR=ZERO)。 - 动作规划:在纸上画出期望的波形图,明确每个边沿由哪个事件(ZRO, PRD, CAU, CAD, CBU, CBD)在哪个通道上产生何种动作(Set, Clear, Toggle)。
- AQ寄存器配置:根据规划,填写
AQCTLA和AQCTLB。 - 考虑死区与故障保护:如果需要,配置死区模块(DB)和故障捕获子模块(TZ)。
- 启用中断:根据需要,在事件触发子模块(ET)中使能
CTR=PRD、CTR=CMP等中断,用于周期性的软件控制(如更新CMP值实现闭环调节)。
最后,牢记一点:ePWM是硬件状态机,一旦启动,它就独立于CPU运行。你的软件角色是“指挥家”,在合适的时机(通常是周期边界)通过更新影子寄存器来“微调乐谱”。理解CC和AQ的工作原理,就是理解了你手中这支硬件乐队的乐理,从而能够谱写出从简单到复杂的任何电力电子控制乐章。
