C2000 ePWM同步机制与影子寄存器:多通道精准时序控制实战

C2000 ePWM同步机制与影子寄存器:多通道精准时序控制实战 1. 项目概述与核心价值在电机驱动、数字电源、多电平逆变器这些对时序精度要求严苛的实时控制领域工程师们常常面临一个核心挑战如何让多个PWM通道像一支训练有素的乐队一样精准同步地“演奏”而不是各自为政、杂乱无章。想象一下在一个三相逆变器中如果三个桥臂的PWM载波相位稍有错位不仅会导致输出电压波形畸变、谐波增加更可能引起桥臂直通瞬间烧毁功率器件。这种对“齐步走”的极致要求正是C2000系列微控制器增强型PWMePWM模块的同步机制所要解决的根本问题。我接触过不少从通用MCU转向C2000进行复杂电力电子设计的工程师他们最初往往只关注单个PWM通道的占空比和频率设置却在多模块协同工作时栽了跟头——波形相位对不齐、参数更新时刻产生毛刺、系统响应出现不可预测的抖动。这些问题的根源大多在于对ePWM底层同步逻辑和寄存器更新机制理解不够深入。ePWM模块远不止是一个简单的定时器加比较器它是一套为复杂、多通道、高可靠性实时控制而设计的精密时序系统。其同步机制和影子寄存器架构是确保整个系统稳定、精确、可预测运行的基石。本文将深入拆解ePWM的同步“黑匣子”特别是TBPRD周期寄存器和CMPx比较寄存器的同步写入与加载机制并结合实际寄存器配置代码让你不仅能配置出PWM波形更能理解并驾驭多通道PWM协同工作的内在逻辑从而设计出更稳健、更高性能的实时控制系统。2. ePWM同步机制深度解析从架构到信号流要理解同步必须先看清ePWM模块的全局架构。C2000的ePWM采用了一种高度模块化且正交的设计思想。每个ePWM模块例如ePWM1, ePWM2...都是一个功能完整的独立PWM通道拥有自己的时基计数器TBCTR、比较器、动作限定器、死区发生器等子模块。这种设计的好处是清晰和灵活每个通道的行为可以独立配置。但为了实现系统级功能如多相交错并联、级联H桥等这些独立的模块必须能够被“组织”起来在时间上保持严格的相位关系。这就是同步机制的用武之地。2.1 同步信号网络EPWMSYNCI, SYNCO与SYNCPERePWM模块间通过一套同步信号链进行通信这是实现硬件级同步的核心。同步输入EPWMxSYNCI这是模块的“耳朵”用于接收来自外部或其他模块的同步脉冲。当一个同步脉冲到达EPWMxSYNCI引脚且该模块的相位加载使能位TBCTL.PHSEN被置位时模块的时基计数器TBCTR会在下一个TBCLK时钟沿被强制加载为相位寄存器TBPHS的值。这相当于给计数器一个统一的“起跑”命令。同步输出EPWMxSYNCO这是模块的“嘴巴”用于向其他模块广播同步事件。一个模块可以将自己内部的特定事件如计数器归零CTRZERO、计数器等于周期值CTRPRD、或等于某个比较值CTRCMPB等作为同步脉冲通过EPWMxSYNCO发送出去从而触发下游模块的同步动作。外设同步输出EPWMxSYNCPER这是一个专门用于同步其他外设如比较器子系统CMPSS和通用DAC模块GPDAC的信号。它独立于模块间的同步链通常用于将PWM的周期或特定时刻与模拟比较、DAC更新等操作对齐在峰值电流模式控制等场景中至关重要。关键配置点同步信号的来源是可配置的。通过EPWMSYNCINSEL寄存器你可以选择EPWMxSYNCI的信号源它可以是上一个ePWM模块的SYNCO输出形成菊花链。某个特定ePWM模块的SYNCO输出星型连接。甚至是从GPIO引入的外部同步信号通过INPUT X-BAR这为与外部时钟源或其他处理器同步提供了可能。同样通过TBCTL2和EPWMSYNCOUTEN寄存器你可以精细地选择EPWMxSYNCO输出由哪个内部事件触发。这种灵活性让你能构建出链式、星型或混合型的同步拓扑以适应不同的多相系统架构。2.2 影子寄存器机制实现无毛刺参数更新的关键在PWM运行时动态更新周期或比较值是闭环控制如电压环、电流环的常态。但如果软件在任意时刻直接写入控制波形生成的“活动寄存器”Active Register而此刻计数器恰好等于旧值就可能产生一个宽度异常的脉冲即“毛刺”。这在功率电路中是致命的。ePWM通过“影子寄存器”Shadow Register机制优雅地解决了这个问题。以周期寄存器TBPRD为例活动寄存器TBPRD Active直接与硬件比较器相连决定当前的PWM周期值。软件不能直接写入。影子寄存器TBPRD Shadow软件实际读写的内存地址对应的是这个影子寄存器。你可以随时安全地更新它而不会立即影响正在运行的PWM波形。那么影子寄存器的值何时才会生效呢这由加载模式决定影子加载模式TBCTL.PRDLD 0这是默认且最常用的模式。影子寄存器的内容会在一个特定的、与PWM周期同步的“安全时刻”自动加载到活动寄存器。对于TBPRD这个时刻通常是“计数器归零”CTR0事件。这意味着新的周期值总是在一个PWM周期开始时生效从而保证了整个周期内波形的完整性完全避免了毛刺。立即加载模式TBCTL.PRDLD 1写入操作直接修改活动寄存器。除非在非常特殊的调试或初始化场景否则在PWM运行时使用此模式是危险的。一个重要的实操细节影子寄存器的加载事件是可以配置的。通过TBCTL2.PRDLDSYNC位你可以选择仅在CTR0时加载还是同时在CTR0和接收到同步输入脉冲SYNCI时加载。后者为跨模块的同步更新提供了可能。3. 核心特性详解TBPRD与CMPx寄存器的同步写入这是ePWM同步机制中最强大、也最容易令人困惑的特性之一。它解决了多模块参数需要同时更新的问题。3.1 同步写入Simultaneous Writes功能解析传统做法是软件需要在一个中断服务程序中依次写入多个ePWM模块的TBPRD或CMPx寄存器。即使每个模块都使用了影子寄存器由于写入指令的执行有先后顺序各个模块寄存器实际生效的时刻各自的CTR0时刻也可能相差几个CPU时钟周期。在要求严格同时性的场景比如多相Buck变换器需要同时调整所有相的占空比这种微小的时间差可能引入次谐振荡或均流问题。ePWM的同步写入功能通过硬件链接机制实现了“一次写入全局更新”的效果。其核心是EPWMxLINK寄存器具体名称可能因器件而异如EPWM1LINK。你可以通过配置该寄存器将某个ePWM模块例如ePWM1指定为“主模块”然后将其他多个“从模块”的TBPRD或CMPx影子寄存器更新操作“链接”到对主模块对应寄存器的写入操作上。工作原理当软件向主模块如ePWM1的TBPRD影子寄存器执行写入操作时硬件会自动地、在同一时刻将相同的写入数据或根据配置的偏移量复制到所有被链接的从模块的TBPRD影子寄存器中。注意这里写入的仍然是影子寄存器。之后各个模块再在各自独立的、由自身CTR0或同步事件决定的“安全时刻”将影子寄存器的值加载到活动寄存器。这就带来了两个层面的同步软件写入时刻的同步所有链接模块影子寄存器在同一CPU写周期被更新消除了软件顺序执行带来的时间差。硬件加载时刻的同步如果所有链接模块的计数器通过同步信号SYNCI保持相位对齐并且都配置为在CTR0时加载影子寄存器那么这些新的周期值将在完全相同的PWM周期起点生效实现真正的硬件级同步更新。3.2 同步加载Shadow to Active Load on SYNC功能解析此功能是同步写入功能的“好搭档”。它控制着影子寄存器到活动寄存器的加载动作本身是否可以被同步事件触发。如前所述每个模块的影子寄存器加载通常由自身的事件如CTR0触发。但通过配置例如TBCTL2.PRDLDSYNC选择SYNC事件加载你可以让一个模块的加载动作不仅由自身事件触发还可以由一个外部同步输入脉冲EPWMxSYNCI来触发。典型应用场景假设我们有一个主ePWM1和三个从模块ePWM2/3/4需要同步更新周期。配置ePWM2/3/4的TBPRD影子寄存器加载模式为“在CTR0或SYNCI时加载”。将ePWM2/3/4的SYNCI输入连接到ePWM1的SYNCO输出。配置ePWM1的SYNCO输出事件为CTR0。使用同步写入功能向ePWM1的TBPRD写入新值这个值会同时拷贝到ePWM2/3/4的影子寄存器。当ePWM1的计数器归零时会发生两件事一是ePWM1自身加载其影子寄存器二是ePWM1产生一个SYNCO脉冲。这个SYNCO脉冲作为SYNCI输入同时触发ePWM2/3/4加载它们各自的影子寄存器。结果就是所有四个模块在完全相同的时刻由主模块ePWM1的CTR0事件定义将新的周期值投入使用实现了跨模块的原子性周期切换。注意同步写入解决的是“数据同时分发”问题而同步加载解决的是“动作同时执行”问题。两者结合才能实现最严格的全局同步更新。对于CMPA, CMPB, CMPC, CMPD这些比较寄存器其同步写入和加载机制与TBPRD类似通过对应的CMPCTL寄存器中的LOADAMODE,LOADBMODE等位进行配置可以选择在CTR0,CTRPRD或同步事件时加载。4. 寄存器配置实战构建一个三相同步PWM系统理论说得再多不如一行代码。下面我们以TMS320F28379D为例配置ePWM1, ePWM2, ePWM3产生三相对称中心对齐PWM并实现TBPRD和CMPA的全局同步更新。假设系统时钟SYSCLK为200MHz我们希望PWM频率为10kHz采用上-下计数模式。4.1 基础时基与同步链配置首先我们需要初始化所有ePWM模块的时钟并建立同步关系。// 步骤1: 使能ePWM模块时钟并配置预分频器所有模块TBCLK需一致 EALLOW; // 使能ePWM1-3的时钟 CpuSysRegs.PCLKCR2.bit.EPWM1 1; CpuSysRegs.PCLKCR2.bit.EPWM2 1; CpuSysRegs.PCLKCR2.bit.EPWM3 1; // 配置所有ePWM的时基时钟TBCLK SYSCLK / 2 100MHz // HSPCLKDIV 和 CLKDIV 配置为 /1 和 /2 的组合具体取决于寄存器字段 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV2; // 时钟分频 // ... 对EPwm2Regs, EPwm3Regs进行相同配置 // **关键步骤**在配置期间先关闭全局TBCLK同步配置完成后再开启 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 0; // 暂停所有ePWM的时基计数器 // 步骤2: 配置各个模块的时基模式与周期 // 计算周期值PWM频率 TBCLK / (2 * TBPRD) // 10kHz 100MHz / (2 * TBPRD) TBPRD 5000 Uint16 period 5000; EPwm1Regs.TBPRD period; EPwm2Regs.TBPRD period; EPwm3Regs.TBPRD period; // 配置为上-下计数模式产生对称PWM EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; EPwm2Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; EPwm3Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 步骤3: 建立同步链 (ePWM1 - ePWM2 - ePWM3) // 配置ePWM1作为时钟源不使用外部SYNCI其SYNCO输出在CTR0时产生 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 自身不从SYNCI加载相位 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 先禁用SYNCO输出稍后配置 // 更详细的SYNCO输出选择通常在TBCTL2寄存器 EPwm1Regs.TBCTL2.bit.SYNCOSEL TB_CTR_ZERO; // SYNCO在计数器归零时产生脉冲 // 配置ePWM2其SYNCI输入来自ePWM1的SYNCO并使能相位加载 EPwm2Regs.TBCTL.bit.PHSEN TB_ENABLE; // 配置SYNCI信号源选择寄存器假设使用默认链路具体需查手册 // 对于F2837xD通常通过EPWMSYNCINSEL寄存器选择这里简化表示。 // 实际中可能需要配置EPwm2Regs.TBCTL.bit.SYNCOSEL TB_SYNC_IN; (接收外部同步) // 并且通过INPUTXBAR或寄存器链接将ePWM1的SYNCO连接到ePWM2的SYNCI。 // 我们假设硬件上ePWM1.SYNCO已连接到ePWM2.SYNCI许多器件默认级联。 EPwm2Regs.TBPHS.half.TBPHS 0; // 相位寄存器设为0与ePWM1同相 // 配置ePWM3其SYNCI输入来自ePWM2的SYNCO EPwm3Regs.TBCTL.bit.PHSEN TB_ENABLE; EPwm3Regs.TBPHS.half.TBPHS 0; // 相位寄存器设为0 // 步骤4: 启用影子寄存器模式并配置为在CTR0时加载 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; EPwm1Regs.TBCTL2.bit.PRDLDSYNC TB_SH_LOAD_ON_CNT_ZERO; // 仅CTR0时加载 // ... 对ePWM2, ePWM3进行相同配置 // 步骤5: 重新使能全局TBCLK同步启动所有计数器 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 1; EDIS;完成以上配置后ePWM1自由运行ePWM2会在每次收到ePWM1的CTR0同步脉冲时将自己的TBCTR加载为TBPHS即0从而与ePWM1严格同相。ePWM3同理与ePWM2同相最终三者同相运行。这是一种简单的菊花链同步。4.2 配置同步写入与同步加载现在我们要实现三模块TBPRD和CMPA的全局同步更新。假设我们希望ePWM1作为主模块。// 步骤1: 配置同步写入链接以TBPRD为例CMPA类似 EALLOW; // 假设存在EPWMxLINK寄存器具体名称和位域请参考具体器件手册 // 将ePWM2和ePWM3的TBPRD影子寄存器更新链接到对ePWM1的TBPRD写入操作。 // 这通常涉及配置一个“链接目标”位图或索引寄存器。 // 例如概念性代码 EPwm1Regs.LINK.bit.TBPRDLINK 0; // 0可能表示自身是源 // 在ePWM2和ePWM3的配置中指向主模块ePWM1 EPwm2Regs.LINK.bit.TBPRDLINK 1; // 链接到模块1 (ePWM1) EPwm3Regs.LINK.bit.TBPRDLINK 1; // 链接到模块1 (ePWM1) // 步骤2: 配置同步加载使得从模块的加载动作也由主模块的同步事件触发 // 我们希望从模块不仅在自身CTR0时加载也在收到SYNCI来自主模块时加载。 EPwm2Regs.TBCTL2.bit.PRDLDSYNC TB_SH_LOAD_ON_SYNC; // 改为在SYNCI事件加载 EPwm3Regs.TBCTL2.bit.PRDLDSYNC TB_SH_LOAD_ON_SYNC; // 同时确保主模块ePWM1的SYNCO输出使能并输出到从模块。 // 前面已配置 EPwm1Regs.TBCTL2.bit.SYNCOSEL TB_CTR_ZERO; // 需要确保SYNCO输出使能位打开如果存在 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_CTR_ZERO; // 确认SYNCO源 // EPwm1Regs.TBCTL2.bit.SYNCOEN 1; // 使能SYNCO输出如果该位存在 // 步骤3: 配置比较寄存器CMPA的加载模式为影子模式并在CTR0时加载 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; EPwm3Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; EPwm3Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // 同样配置CMPA的同步写入链接果支持 EPwm2Regs.LINK.bit.CMPALINK 1; // 链接到模块1 EPwm3Regs.LINK.bit.CMPALINK 1; EDIS;4.3 实现同步更新操作在控制循环例如PID中断中当需要更新PWM参数时你只需要对主模块ePWM1进行操作void updatePwmParameters(Uint16 newPeriod, Uint16 newCmpA1, Uint16 newCmpA2, Uint16 newCmpA3) { // 写入新的周期值到主模块ePWM1的影子寄存器 // 由于配置了同步写入链接这个值会自动写入ePWM2和ePWM3的影子寄存器 EPwm1Regs.TBPRD newPeriod; // 写入新的比较值到各自主模块的影子寄存器假设CMPA链接可能不支持独立数据需要分别写入影子寄存器 // 注意同步写入通常是将主模块的数据广播到从模块。如果需要不同值可能需要分别写入 // 或者使用“全局加载”机制配合不同的偏移量。这里假设我们需要三个不同的占空比。 // 更常见的做法是使用“全局加载(Global Load)”功能配合GLDCTL和GLDCFG寄存器 // 在一次同步事件中将各自影子寄存器的值加载到活动寄存器。 EPwm1Regs.CMPA.half.CMPA newCmpA1; EPwm2Regs.CMPA.half.CMPA newCmpA2; // 分别写入各自的影子寄存器 EPwm3Regs.CMPA.half.CMPA newCmpA3; // **关键**此时新的TBPRD值已经通过硬件同步写入到三个模块的影子寄存器。 // 新的CMPA值也已分别写入各自的影子寄存器。 // 它们将在下一个同步事件由ePWM1的CTR0产生发生时被同时加载到活动寄存器。 // ePWM1在自身CTR0时加载自己的TBPRD和CMPA。 // ePWM1同时产生SYNCO脉冲。 // ePWM2和ePWM3收到SYNCI脉冲因为PRDLDSYNC配置为ON_SYNC触发加载各自的TBPRD和CMPALOADAMODECTR_ZERO但SYNCI事件也触发加载。 // 最终三个模块在完全相同的时刻切换参数。 }重要提示上述代码中关于LINK寄存器的操作是概念性的。不同型号的C2000芯片其同步写入和全局加载功能的实现寄存器可能不同例如可能是EPWMXLINK、GLDCTL全局加载控制、GLDCFG全局加载配置等。务必查阅你所使用芯片的《技术参考手册》中“ePWM”章节找到“Register Synchronization”、“Global Load”或“Linking”相关部分以获取准确的寄存器名称和配置方法。F2837xD/F2838x等较新器件通常使用GLDCTL2和GLDCFG来配置全局加载组。5. 高级应用与避坑指南5.1 相移控制与同步的结合在多相交错并联电源中各相PWM需要保持固定的相位差如两相180°三相120°。这可以通过配置从模块的相位寄存器TBPHS实现同时保持同步链。// 配置三相PWM相位互差120度 (对于上-下计数模式一个完整周期为2*TBPRD计数) // 假设TBPRD 5000则一个完整电角度360度对应10000个计数时钟。 Uint16 phaseShift 3333; // 120度偏移量 (10000 / 3 ≈ 3333) EPwm1Regs.TBPHS.half.TBPHS 0; // A相相位0度 EPwm2Regs.TBPHS.half.TBPHS phaseShift; // B相滞后120度 EPwm3Regs.TBPHS.half.TBPHS 2 * phaseShift; // C相滞后240度 (即超前120度) // 同步链配置ePWM1作为主同步源。 // ePWM2和ePWM3使能相位加载(PHSEN)并在收到ePWM1的SYNCI时将TBCTR加载为TBPHS。 // 这样每当ePWM1计数器归零时ePWM2和ePWM3会分别加载3333和6666从而形成固定的120度相位差。避坑点在上下计数模式下相位寄存器TBPHS的值是加载到上下计数器的值。要计算正确的相位偏移量需考虑一个PWM周期对应的总计数时钟数2 * TBPRD。同时确保同步脉冲的周期与PWM周期一致否则相位关系会漂移。5.2 数字比较DC子模块与同步事件数字比较子模块可以将外部比较器CMPSS的输出或GPIO信号转换为内部事件DCAEVT1/2, DCBEVT1/2。这些事件不仅可以用于强制PWM输出或产生中断还可以作为同步源// 配置DCAEVT1事件在某个特定比较器输出为高时产生 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL DC_COMP1OUT; // 选择比较器1输出高作为源 EPwm1Regs.TZSEL.bit.DCAEVT1 1; // 使能DCAEVT1作为触发源实际可能在DCACTL寄存器 // 配置该数字比较事件同时产生一个同步脉冲 EPwm1Regs.DCACTL.bit.EVT1SYNCE DC_EVT_SYNC_ENABLE; // 使能DCAEVT1产生同步 // 将ePWM2的SYNCI配置为接收此事件作为同步源 // 这需要配置EPWMSYNCINSEL寄存器选择DCAEVT1作为输入。这个功能非常强大可以实现基于模拟反馈信号的硬件同步。例如在峰值电流控制中当电流达到设定阈值比较器翻转时立即产生一个同步脉冲复位所有PWM模块的计数器实现恒定关断时间Constant Off-Time控制这种响应速度是软件无法企及的。5.3 常见问题与调试技巧同步不起作用检查TBCLKSYNC确保在配置完所有ePWM模块后才将SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC置1。配置期间应保持为0。检查时钟分频所有需要同步的ePWM模块其TBCLK频率必须一致即HSPCLKDIV和CLKDIV配置相同。验证SYNCI/SYNCO路径使用寄存器查看工具确认SYNCO输出事件已使能如TBCTL2.SYNCOSEL并且SYNCI输入源选择正确EPWMSYNCINSEL。有时需要配置INPUTXBAR来路由外部同步信号。检查相位加载使能从模块的TBCTL.PHSEN必须置1否则它会忽略SYNCI脉冲。影子寄存器更新后波形无变化确认加载模式检查TBCTL.PRDLD和CMPCTL.SHDWAMODE等位确保处于影子模式0而非立即加载模式1。确认加载事件检查TBCTL2.PRDLDSYNC和CMPCTL.LOADAMODE确保配置的加载事件CTR0, CTRPRD, SYNCI会发生。例如如果配置为CTR0加载但计数器工作在仅向上计数模式则CTR0事件只在开始时发生一次之后不再发生导致影子寄存器无法加载。在上下计数模式下CTR0每个周期都会发生。使用全局加载一次性生效如果分别更新了多个寄存器如TBPRD和CMPA希望它们在同一时刻生效可以考虑使用“全局加载”Global Load功能。配置GLDCTL寄存器将需要同步加载的寄存器TBPRD, CMPA等加入到同一个加载组Group并设置由同一个事件如CTR0触发。这样一次事件可以同时加载该组内所有寄存器的影子值到活动值。同步导致的相位抖动理解同步延迟从SYNCI脉冲有效到从模块的TBCTR被加载存在固定的硬件延迟例如当TBCLK EPWMCLK时延迟约为2个EPWMCLK周期。在计算精确相位时需要考虑这个延迟。对于超高开关频率500kHz的应用这个延迟可能变得显著。使用高分辨率PWMHRPWM如果对边沿位置精度要求极高皮秒级可以考虑启用HRPWM功能。但要注意HRPWM的微边沿定位MEP逻辑与同步机制是独立的配置HRPWM时需仔细阅读相关章节。调试建议利用ET子模块中断在事件触发ET子模块中使能CTRPRD和CTR0中断并在中断服务程序中设置标志位或翻转一个测试GPIO。通过示波器观察这些GPIO脉冲可以直观地看到各个ePWM模块的计数器事件是否对齐。监控SYNCO信号可以将某个ePWM模块的SYNCO输出映射到一个GPIO引脚通过配置输出X-BAR。用示波器观察这个引脚可以确认同步脉冲是否按预期产生。寄存器快照在怀疑的不同时间点如更新参数前后、同步事件发生时读取并记录关键寄存器的值TBCTR, TBPRD, CMPA, TBPHS与理论值进行对比是查找逻辑错误的最直接方法。通过深入理解ePWM的同步机制和影子寄存器原理并熟练掌握其配置方法你就能在复杂的多通道电力电子和控制系统中构建出稳定、精确、响应速的PWM时序框架。这不仅仅是配置几个寄存器更是对系统时序观的塑造。