TI ePWM AQ模块实战:从原理到代码生成互补PWM与死区控制 1. 项目概述与AQ模块的核心价值在嵌入式电机控制、数字电源或者任何需要精确功率调节的场合PWM脉冲宽度调制信号的质量直接决定了整个系统的性能上限。我们通常会用定时器来生成PWM但当你需要生成互补带死区、中心对称或者脉冲位置可独立移动的复杂波形时仅仅靠一个比较寄存器和一个周期寄存器就显得捉襟见肘了。这时像TI C2000系列DSP中的增强型PWMePWM模块所提供的动作限定器Action-Qualifier AQ子模块就从一个“好用”的功能变成了“不可或缺”的核心。简单来说AQ模块就是一个高度可编程的“事件-动作”映射器。它监听几个核心事件计数器等于零CTR0、计数器等于周期值CTRPRD、计数器等于比较值ACTRCMPA和比较值BCTRCMPB。当这些事件发生时AQ模块不是简单地翻转一个引脚而是允许你为每个事件、甚至为计数器递增和递减的不同阶段独立地配置输出动作置高SET、拉低CLEAR、翻转TOGGLE或者保持Do Nothing。这种精细化的控制能力使得生成电机驱动所需的互补PWM、数字电源所需的相移PWM、或者任意复杂占空比和相位的波形都变成了寄存器配置的“填空题”。本文将以TI ePWM模块中的AQ子模块为焦点抛开官方手册中略显晦涩的框图描述从一线工程师的视角深入解析其工作原理、寄存器配置的“潜规则”并通过多个典型波形生成的实战案例手把手带你掌握这块“数字功率艺术”的画板。无论你是正在调试无刷电机驱动板还是设计一个高精度开关电源理解AQ模块都能让你从“能跑”走向“跑得稳、跑得精”。2. AQ模块的工作原理与核心逻辑拆解要驾驭AQ模块不能只死记硬背寄存器位必须理解其底层的事件驱动逻辑。你可以把它想象成一个拥有多个输入通道和输出通道的智能开关矩阵但这个矩阵的切换不是随机的而是由定时器的计数状态严格触发的。2.1 核心事件与动作类型AQ模块的输入是四个基本事件它们直接来源于时间基准TB子模块和计数器比较CC子模块CTR PRD 计数器值TBCNT等于周期寄存器值TBPRD。这标志着一个PWM周期的结束对于递增计数或开始对于递减计数。CTR 0 计数器值等于0。这标志着一个PWM周期的开始对于递增计数或结束对于递减计数。CTR CMPA 计数器值等于比较寄存器ACMPA的值。CTR CMPB 计数器值等于比较寄存器BCMPB的值。对于每个事件你可以为两个输出引脚EPWMxA和EPWMxB独立配置四种动作之一SET 将对应输出引脚强制置为高电平。CLEAR 将对应输出引脚强制置为低电平。TOGGLE 翻转对应输出引脚的电平高变低低变高。DO NOTHING 保持当前电平不变。这是一个非常重要的选项意味着该事件不会影响输出波形但仍然可以用于触发中断这在某些需要特定时刻采样ADC的场景下非常有用。2.2 计数方向与事件的独立性AQ模块设计最精妙的一点在于它对计数方向CTR_DIR进行了区分。这意味着“计数器等于CMPA”这个事件在计数器递增UP和递减DOWN时是被视为两个独立的事件CAUCompare A Up和CADCompare A Down。同理对于CMPB有CBU和CBD。为什么这个设计至关重要考虑生成一个中心对称的PWM波形常用于电机控制中的SVPWM。我们希望波形的上升沿和下降沿关于周期中心对称。通过将CAU事件动作设为SET置高CAD事件动作设为CLEAR拉低那么只需改变一个CMPA的值就能同时控制上升沿和下降沿的位置并且自动保持对称性。如果不对方向进行区分我们将需要两个独立的比较寄存器才能实现同样的效果增加了控制的复杂性。2.3 事件优先级机制在实际运行中可能会发生多个事件在同一时刻同一个TBCLK时钟沿被触发的情况。例如在递增计数模式下如果CMPA被设置为0那么“CTR0”和“CTRCMPA”这两个事件就会同时发生。硬件必须决定先执行哪个动作。AQ模块内置了固定的优先级仲裁逻辑。其核心规则是软件强制事件拥有最高优先级而硬件事件的优先级则与计数模式和方向相关。以最常用的上下计数模式Up-Down Count为例其优先级从高到低通常为软件强制事件通过AQSFRC寄存器触发计数器等于CMPB根据计数方向是CBU或CBD计数器等于CMPA根据计数方向是CAU或CAD计数器等于0或计数器等于周期值TBPRD关键理解 优先级决定了当冲突发生时哪个动作“说了算”。例如如果你在CTR0时配置了SET动作同时在CTRCMPA且CMPA0时配置了CLEAR动作由于CTRCMPA的优先级高于CTR0最终执行的是CLEAR动作。这个特性可以用来实现一些特殊的波形但也可能是波形不符合预期的陷阱来源必须心中有数。2.4 寄存器概览配置AQ模块主要涉及以下寄存器它们直接映射了上述逻辑AQCTLA (Action-Qualifier Control Register For Output A) 控制EPWMxA输出引脚的事件-动作映射。其位域针对CTRPRD, CTR0, CTRCMPA Up, CTRCMPA Down, CTRCMPB Up, CTRCMPB Down等事件分别配置SET/CLEAR/TOGGLE/DO NOTHING。AQCTLB 功能同AQCTLA但控制EPWMxB输出引脚。AQSFRC (Action-Qualifier Software Force Register) 软件强制寄存器。允许你通过软件立即触发一个SET、CLEAR或TOGGLE动作优先级最高。常用于调试或强制输出特定状态。AQCSFRC (Action-Qualifier Continuous Software Force Register) 连续软件强制寄存器。其配置会持续生效直到被禁用。例如可以配置为持续将某个输出强制为高或低。3. 核心寄存器配置详解与实操要点理解了原理我们进入实战环节。配置AQ模块的本质就是根据想要的波形向AQCTLA和AQCTLB寄存器写入正确的值。这个过程像是编写一段由硬件执行的“如果...就...”脚本。3.1 AQCTLA/AQCTLB寄存器位域解析这两个寄存器结构完全相同我们以AQCTLA为例进行拆解。它是一个16位寄存器每2个或3个比特控制一个事件对应的动作。寄存器位域事件描述动作编码 (2-bit)说明AQCTLA[15:14]CBD- CTR CMPB when CTR_Dir DOWN (递减时匹配CMPB)00: Do nothing01: Clear10: Set11: Toggle控制计数器递减过程中匹配CMPB时的动作AQCTLA[13:12]CBU- CTR CMPB when CTR_Dir UP (递增时匹配CMPB)同上控制计数器递增过程中匹配CMPB时的动作AQCTLA[11:10]CAD- CTR CMPA when CTR_Dir DOWN (递减时匹配CMPA)同上控制计数器递减过程中匹配CMPA时的动作AQCTLA[9:8]CAU- CTR CMPA when CTR_Dir UP (递增时匹配CMPA)同上控制计数器递增过程中匹配CMPA时的动作AQCTLA[7:6]PRD- CTR TBPRD (计数器等于周期值)同上AQCTLA[5:4]ZRO- CTR 0 (计数器等于零)同上AQCTLA[3:0]保留通常写0配置示例假设我们需要在递增计数模式下在计数器等于0时让EPWMxA输出高电平在计数器等于CMPA时拉低生成一个简单的非对称PWM。那么配置如下AQCTLA.ZRO AQ_SET(即2‘b10)AQCTLA.CAU AQ_CLEAR(即2’b01)其他事件如PRD, CAD, CBU, CBD均配置为AQ_NONE(即2‘b00)。在C代码中TI的驱动程序库通常提供了宏定义使得配置更加直观// 使用TI DriverLib进行配置示例 EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_ZERO, EPWM_AQ_OUTPUT_SET); EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAU, EPWM_AQ_OUTPUT_CLEAR);3.2 软件强制寄存器的使用技巧AQSFRC和AQCSFRC寄存器是调试和实现特殊功能的利器。AQSFRC (一次性强制) 当你向AQSFRC.OTS、AQSFRC.OTB位写入特定值如10表示强制高相应的输出会立即动作无视当前的事件状态。执行一次后该强制状态不会保持输出会回归由AQCTL控制的状态。这常用于系统启动时的确定状态初始化在PWM开始运行前强制输出为低确保功率管关闭。故障测试手动模拟一个故障状态观察保护电路是否响应。同步多个PWM模块的起始相位。AQCSFRC (连续强制) 其配置会覆盖AQCTL的配置持续生效。例如AQCSFRC.CSFB 2(强制B输出高)会一直将EPWMxB拉高直到你修改该寄存器。这在以下情况有用实现PWM使能/禁用通过连续强制将输出拉低可以快速关闭PWM输出比停止计数器更迅速。实现固定的测试模式。实操心得 在系统初始化序列中务必先配置好AQCTL等寄存器最后再解除软件强制或使能PWM输出。一个常见的错误顺序是上电后输出引脚状态不定 - 立即使能PWM计数器 - 功率管误开通 - 然后才配置AQCTL。正确的顺序应该是配置所有寄存器TBPRD, CMPA, AQCTL等 - 使用AQSFRC将输出强制到安全状态如全低 - 启动计数器TBCTL.CTRMODE使能- 根据需要解除软件强制。3.3 影子寄存器与更新时机需要注意的是CMPA和CMPB寄存器通常有影子寄存器Shadow Register机制。我们软件写入的是影子寄存器硬件在特定的“加载事件”如CTR0或CTRPRD发生时才会将影子寄存器的值拷贝到活动寄存器Active Register中。AQ模块响应的是活动寄存器的值。加载模式CMPCTL.LOADAMODE/LOADBMODE的选择至关重要CTR ZERO时加载 新的比较值在周期开始时计数器为0生效。这是最常用的模式能确保每个PWM周期都使用新的占空比更新是同步的。CTR PRD时加载 新的比较值在周期结束时生效。立即加载 影子寄存器被禁用写入即生效。这可能导致PWM波形在一个周期内发生畸变除非在计数器不匹配该比较值的时刻写入。注意事项 在上下计数模式生成对称PWM时如果你选择在CTR0时加载CMPA那么为了确保每个周期都能产生有效的脉冲CMPA的值应大于等于1。如果CMPA0则CAU和CAD事件都发生在CTR0时刻根据优先级可能无法产生预期的SET/CLEAR动作对导致无输出。同理若在CTRPRD时加载则CMPA值应小于等于TBPRD-1。这个细节手册中虽有提及但极易被忽略是导致“配置了但没输出”的常见原因之一。4. 典型PWM波形生成实战解析理论说再多不如看几个实实在在的配置案例。下面我们以TI手册中的几个经典波形为例拆解其配置思路和寄存器设置。4.1 案例一递增计数模式非对称PWM高电平有效波形目标 生成一个标准的、单边调制的PWM波。计数器从0递增到TBPRD然后归零重启。我们希望周期开始时CTR0EPWMxA输出变高。当计数器增加到等于CMPA时EPWMxA输出变低。占空比 CMPA / (TBPRD 1)。配置解析时间基准TB配置TBCTL.CTRMODE TB_UP(递增模式)TBPRD 600(设定周期)TBPHS 0,TBCNT 0(相位清零)计数器比较CC配置CMPA 350(初始化占空比可运行时修改)CMPCTL.LOADAMODE CC_CTR_ZERO(在CTR0时加载新的CMPA值)动作限定器AQ核心配置AQCTLA.ZRO AQ_SET// CTR0时置高EPWMxAAQCTLA.CAU AQ_CLEAR// CTR递增等于CMPA时拉低EPWMxAAQCTLA.PRD AQ_NOTHING// 周期事件不动作也可配置但此处不需要代码示例基于TI DriverLibvoid EPWM_Setup_Asymmetric_ActiveHigh(uint32_t epwmBase, uint16_t period, uint16_t duty) { // 1. 配置时间基准 EPWM_setTimeBasePeriod(epwmBase, period); EPWM_setPhaseShift(epwmBase, 0); EPWM_setTimeBaseCounter(epwmBase, 0); EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP); EPWM_disablePhaseShiftLoad(epwmBase); EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // 2. 配置计数器比较 EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, duty); EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); // 3. 配置动作限定器 - 这是核心 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_ZERO, EPWM_AQ_OUTPUT_SET); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAU, EPWM_AQ_OUTPUT_CLEAR); // 其他事件PRD, CAD, CBU, CBD保持默认的“Do Nothing” }波形示意图TBCNT: 0 --- CMPA(350) --- TBPRD(600) --- 0 ... EPWMxA: 高_______|低.............................|高_______|低...占空比计算 高电平时间对应计数器从0到CMPA的区间。因此占空比 Duty CMPA / (TBPRD 1)。当TBPRD600CMPA350时Duty 350/601 ≈ 58.24%。4.2 案例二上下计数模式对称PWM用于全桥驱动波形目标 生成中心对称的PWM这是电机驱动和许多DC-DC变换器的标准需求。计数器从0递增到TBPRD然后递减回0如此循环。我们希望在计数器递增过程中当等于CMPA时EPWMxA输出变高。在计数器递减过程中当等于CMPA时EPWMxA输出变低。这样高电平脉冲以周期中心为对称轴。占空比 (2 * CMPA) / (2 * TBPRD) CMPA / TBPRD。配置解析时间基准TB配置TBCTL.CTRMODE TB_UPDOWN(上下计数模式)TBPRD 600计数器比较CC配置CMPA 400(初始化占空比)CMPCTL.LOADAMODE CC_CTR_ZERO(在CTR0时加载)动作限定器AQ核心配置AQCTLA.CAU AQ_SET// 递增匹配CMPA置高AQCTLA.CAD AQ_CLEAR// 递减匹配CMPA拉低AQCTLA.ZRO AQ_NOTHING// 0点事件不动作也用于同步等AQCTLA.PRD AQ_NOTHING// 周期点事件不动作代码示例void EPWM_Setup_Symmetric_CenterAligned(uint32_t epwmBase, uint16_t period, uint16_t duty) { // 1. 时间基准 EPWM_setTimeBasePeriod(epwmBase, period); EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN); // 2. 计数器比较 EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, duty); EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); // 3. 动作限定器 - 对称PWM核心 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAU, EPWM_AQ_OUTPUT_SET); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAD, EPWM_AQ_OUTPUT_CLEAR); }波形示意图TBCNT: 0 - UP - CMPA(400) - TBPRD(600) - DOWN - CMPA(400) - 0 - ... EPWMxA: 低____|高...............|高...............|低____|高... (CAU SET) (CAD CLEAR)对称性优势 这种波形在频谱上的谐波分量更少有利于降低电磁干扰EMI。同时对于半桥或全桥电路对称PWM可以简化控制逻辑。4.3 案例三生成带死区的互补PWM使用CMPA和CMPB波形目标 驱动一个半桥或全桥的上下管需要两路互补的PWM信号EPWMxA和EPWMxB并且它们之间需要插入死区时间Dead Time以防止上下管直通短路。我们可以不依赖专门的死区模块DB直接用AQ模块和两个比较寄存器实现。需求EPWMxA和EPWMxB互补。EPWMxA的上升沿领先于EPWMxB的下降沿一个死区时间。EPWMxA的下降沿领先于EPWMxB的上升沿一个死区时间。实现思路上下计数模式 我们利用CMPA控制主信号EPWMxA的边沿利用CMPB控制互补信号EPWMxB的边沿通过让CMPB和CMPA有一个固定的差值来产生死区。EPWMxA CAU置高CAD拉低对称PWM。EPWMxB CBU拉低CBD置高与EPWMxA边沿相反。关键 设置CMPB CMPA DeadTime_Counts。这里DeadTime_Counts是根据所需的死区时间和TBCLK频率计算出来的计数值。配置解析TB配置TBCTL.CTRMODE TB_UPDOWN,TBPRD 600。CC配置CMPA 350(主信号占空比控制)CMPB 370(假设死区时间对应20个TBCLK)加载模式均为CC_CTR_ZERO。AQ配置AQCTLA.CAU AQ_SET,AQCTLA.CAD AQ_CLEAR(EPWMxA对称波形)AQCTLB.CBU AQ_CLEAR,AQCTLB.CBD AQ_SET(EPWMxB与A互补)代码示例void EPWM_Setup_Complementary_With_Deadband(uint32_t epwmBase, uint16_t period, uint16_t duty, uint16_t deadband_counts) { uint16_t cmpA duty; uint16_t cmpB duty deadband_counts; // 简单加法需确保cmpB不超过TBPRD // 配置TB EPWM_setTimeBasePeriod(epwmBase, period); EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN); // 配置CC EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, cmpA); EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_B, cmpB); EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); // 配置AQ // EPWMxA: 递增匹配A置高递减匹配A拉低 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAU, EPWM_AQ_OUTPUT_SET); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_CAD, EPWM_AQ_OUTPUT_CLEAR); // EPWMxB: 递增匹配B拉低递减匹配B置高 (与A互补) EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_ON_CBU, EPWM_AQ_OUTPUT_CLEAR); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_ON_CBD, EPWM_AQ_OUTPUT_SET); }波形示意图TBCNT: 0 - UP - CMPA(350) - CMPB(370) - TBPRD(600) - DOWN - CMPB(370) - CMPA(350) - 0 EPWMxA: 低____|高...............................|高...............................|低 (CAU SET) (CAD CLEAR) EPWMxB: 高........|低.........................|低.........................|高........ (CBU CLEAR) (CBD SET) |--死区--| |--死区--|重要提示 这种方法实现的死区其时间会随着占空比CMPA的变化而变化吗不会。因为死区时间 (CMPB - CMPA) * T_{TBCLK}只要我们在软件中保持CMPB - CMPA为恒定值死区时间就是固定的。这与专用死区模块通过延迟边沿实现的行为在效果上是等价的但给了我们更大的灵活性。不过专用死区模块DB提供了更丰富的极性控制和边沿延迟独立调节功能对于标准桥式驱动电路可能更方便。5. 高级应用与常见问题排查掌握了基础波形生成后AQ模块还能玩出更多花样同时也伴随着一些容易踩坑的地方。5.1 高级应用脉冲定位与移相PWM脉冲定位 有时我们不需要控制整个脉冲的宽度只需要在周期内的特定时刻产生一个固定宽度的脉冲。这可以通过结合CMPA和CMPB并利用TOGGLE动作来实现。例如在递增计数模式下AQCTLA.CAU AQ_SET// 在CMPA时刻置高脉冲开始AQCTLA.CBU AQ_CLEAR// 在CMPB时刻拉低脉冲结束这样脉冲的起始位置由CMPA决定宽度由CMPB - CMPA决定。通过独立调节CMPA和CMPB可以将脉冲放置在周期内的任何位置。移相PWM 对于多相交错并联的电源需要多个PWM通道之间具有固定的相位差。这可以通过设置不同ePWM模块的时间基准相位寄存器TBPHS并结合同步信号EPWMxSYNCI/EPWMxSYNCO来实现。AQ模块本身不直接产生移相但它是最终波形输出的执行者。主ePWM模块产生同步脉冲给从模块从模块的TB计数器在收到同步脉冲后从其TBPHS值开始计数从而实现了相位的偏移。AQ模块则基于这个有相位偏移的计数器来生成波形。5.2 常见问题与排查技巧实录在实际调试中AQ模块相关的问题往往表现为“没有输出”、“输出波形不对”或“占空比控制不线性”。下面是一个排查清单问题1 ePWM引脚完全没有输出。检查GPIO复用 首先确认EPWMxA/EPWMxB对应的GPIO引脚是否已正确配置为ePWM功能模式而非普通的GPIO输入。检查时钟与使能 确认系统时钟已到达ePWM模块并且模块未被低功耗模式禁用。检查时间基准状态 确认TBCTL.CTRMODE不是“停止”状态TB_FREEZE计数器正在运行。可以读取TBCNT寄存器看其是否在变化。检查软件强制 检查AQSFRC和AQCSFRC寄存器是否意外地将输出强制到了某个固定电平。尝试写入AQSFRC.OTS0和AQSFRC.OTB0假设是One-Time Force模式来解除强制。检查动作配置 确认AQCTLA/AQCTLB寄存器是否至少为一个事件配置了SET或CLEAR动作。如果全部是DO NOTHING肯定没输出。检查CMPA/CMPB的值是否在合理的[0, TBPRD]范围内。问题2 有输出但占空比固定不变不随CMPA值改变。检查影子寄存器加载机制 这是最常见的原因你写的是CMPA的影子寄存器但活动寄存器可能没有更新。检查CMPCTL.LOADAMODE和CMPCTL.SHDWAMODE。如SHDWAMODE CC_SHADOW使用影子寄存器则必须确保LOADAMODE配置正确如CC_CTR_ZERO并且计数器确实经过了那个加载点0或周期值。一个快速的调试方法是将SHDWAMODE改为CC_IMMEDIATE立即加载如果此时占空比可以变化问题就出在影子加载时机上。检查事件优先级冲突 如果你为多个事件配置了针对同一输出的动作且它们可能同时发生高优先级的动作会覆盖低优先级的。例如在CTR0时配置了SET在CTRCMPA且CMPA0时配置了CLEAR由于CMPA匹配优先级更高最终执行的是CLEAR导致输出始终为低。仔细检查AQCTL配置确保逻辑符合预期。问题3 生成的对称PWM波形不对称或者占空比为0%或100%时异常。检查CMPA/CMPB的边界值 回顾第3.3节的“注意事项”。在上下计数模式下如果CMPA0CAU和CAD事件都发生在CTR0点根据优先级CAD通常高于CAU需要查具体优先级表可能无法形成有效的SET-CLEAR对。确保CMPA的值在合适的范围内例如加载点在0时CMPA 1。检查计数模式与动作配置是否匹配 你配置的是上下计数模式但AQ动作只配置了CAU递增匹配没有配置CAD递减匹配或者反之。这会导致波形只在半个周期内受控另一个半周期状态不确定。问题4 互补PWM输出有重叠直通风险死区不生效。如果使用CMPA/CMPB实现死区 检查计算出的CMPB值是否确实大于CMPA对于上述配置。确保在运行时更新占空比时始终保持CMPB CMPA Deadband_Counts这个关系。如果使用专用死区模块DB 检查DBCTL寄存器的IN_MODE,OUT_MODE,POLSEL配置是否正确。例如对于典型的“Active High Complementary with Deadband”模式需要配置OUT_MODE使能双边延迟POLSEL选择正确的极性。同时检查DBRED和DBFED寄存器是否被正确写入非零值。问题5 波形中有毛刺或非预期的跳变。检查寄存器写入时机 避免在计数器正在匹配某个值的时刻特别是CTRCMPx附近去修改AQCTL寄存器。虽然AQCTL不是影子寄存器但不当的写入时机可能导致一个周期内输出状态混乱。最好在计数器为0或周期值时进行配置更改。检查系统中断干扰 如果AQCTL配置是在一个高优先级中断中动态修改的确保修改过程是原子的或者不会被其他中断打断导致配置不一致。调试利器 强制与观察。当波形异常时充分利用AQSFRC寄存器进行手动强制。例如你可以先将输出强制为高再强制为低观察引脚是否能正常响应这可以快速排除GPIO和输出驱动级的问题。然后再结合仿真器在关键事件点CTR0, PRD, CMPA, CMPB设置断点观察AQCTL寄存器的值和输出引脚的实际状态逐步定位是哪个事件的动作未按预期执行。