深入解析C28x DSP ePWM寄存器:从原理到实战,掌握精准PWM控制

发布时间:2026/7/22 19:01:36
深入解析C28x DSP ePWM寄存器:从原理到实战,掌握精准PWM控制 1. 项目概述为什么我们需要深入理解ePWM寄存器在电机控制、数字电源或者任何需要精确时序和功率管理的嵌入式项目里PWM脉宽调制信号就是系统的“心跳”。而德州仪器TIC28x系列DSP里的增强型PWMePWM模块无疑是这颗心脏的精密“起搏器”。很多工程师在入门时可能更习惯于调用TI提供的驱动库函数比如EPWM_setCounterCompareValue或者EPWM_setTimeBasePeriod这当然快速高效。但当你遇到波形异常、同步失灵或者需要实现一些库函数没有直接支持的复杂调制策略时那种“黑盒”操作带来的无力感就会非常强烈。这时直接面对寄存器就成了解决问题的唯一途径。寄存器是软件代码与硬件电路之间最直接的对话窗口。你写的每一个配置值都直接对应着硬件内部某个开关、某个计数器、某个比较器的行为。以我过去调试一个多轴伺服驱动器的经验为例就因为对**影子寄存器Shadow Register**的加载时机理解不透彻导致在动态调整PWM占空比时产生了致命的“毛刺”差点烧毁功率模块。那次教训让我明白仅仅知道TBPRD设置频率、CMPA设置占空比是远远不够的。本文将带你穿透API的封装直击C28x ePWM模块寄存器的核心。我们不仅会逐一拆解**时间基准Time-Base和计数器比较Counter-Compare**这两个最核心子模块的每一个关键寄存器位更会聚焦于那些在数据手册中一笔带过却在实战中至关重要的“为什么”——比如为什么要有TBPRD和TBPRDM两个地址HRPCTL寄存器里的TBPHSHRLOADE位在什么场景下必须置位CMPCTL中的SHDWAFULL标志位该怎么用我希望通过这次梳理能帮你建立起一张清晰的ePWM寄存器“地图”让你在下次调试时不仅能“改对参数”更能“理解因果”从根源上设计出稳定可靠的PWM控制逻辑。2. 核心设计思路ePWM模块的寄存器架构哲学在深入每个比特位之前我们必须先理解TI工程师设计ePWM寄存器时的核心思路。这绝非简单的地址映射其背后隐藏着对实时性、安全性、灵活性和兼容性的深度考量。2.1 双缓冲影子寄存器机制安全与实时性的平衡艺术这是ePWM寄存器设计中最精妙的一环。想象一下你正在播放音乐PWM输出突然想切歌改变周期或占空比。如果你直接打断正在播放的旋律直接写入活跃寄存器必然会产生刺耳的噪音PWM波形毛刺。ePWM的影子寄存器机制就相当于一个“预加载区”。以周期寄存器TBPRD为例。它实际上对应着两个物理寄存器一个是你无法直接访问的活跃寄存器Active Register它正被硬件计数器实时比较决定PWM周期另一个是你可以读写操作的影子寄存器Shadow Register。当你通过软件写入TBPRD时数据默认进入影子寄存器前提是TBCTL[PRDLD]0。硬件会在一个“安全”的时刻——通常是时间基准计数器TBCTR归零时——自动将影子寄存器的值加载到活跃寄存器。这就保证了PWM周期的改变只会在一个完整周期结束时发生波形连续平滑。这个机制对于电机控制和数字电源至关重要。突然改变的PWM参数会导致电流尖峰轻则引起转矩脉动和噪音重则损坏IGBT或MOSFET。影子寄存器是实现“无毛刺”参数更新的硬件保障。2.2 寄存器镜像与32位访问兼容性与效率的取舍细心的你可能会在数据手册中发现TBPRD和TBPRDMCMPA和CMPAM这样的“双胞胎”。它们访问的是同一个影子/活跃寄存器对那为什么存在两个地址这主要出于两个原因向后兼容和访问效率。 早期的ePWM模块如TMS320F281x上的EV模块只有TBPRD。C28x的ePWM在其基础上增加了高分辨率周期控制引入了TBPRDHR寄存器。TBPRD位于奇数字节地址与紧随其后的TBPRDHR偶数字节地址共同组成一个32位值。但在C28x的存储器映射中对奇地址进行32位写操作是非对齐的可能效率低下或引发硬件错误。因此TI增加了TBPRDM镜像寄存器和TBPRDHRM。TBPRDM位于偶地址与TBPRDHRM自然对齐。现在你可以通过一次32位写操作例如使用C语言的*(volatile unsigned long *)指针同时更新TBPRDHR:TBPRD这个32位周期值这对于需要高分辨率频率调整的应用如精密变频非常方便。而TBPRD地址被保留确保了老代码的兼容性。2.3 模块化与联动控制从独立到协同ePWM模块不是孤岛。一个复杂的系统可能有多个ePWM模块如ePWM1, ePWM2...需要协同工作比如产生六路互差60度的PWM驱动三相逆变桥。这就涉及到模块间的同步和联动。同步由TBCTL寄存器中的PHSEN相位使能和TBPHS相位值控制。主模块可以输出同步信号EPWMxSYNCO从模块在接收到同步信号时将其TBCTR计数器加载为TBPHS的值从而实现精确的相位差控制。联动则通过EPWMXLINK寄存器实现。这是一个非常强大的功能。你可以将模块A的CMPA链接到模块B。当软件写入模块A的CMPA时模块B的CMPA会自动同步更新。这在需要完全对称或互补输出的场景下如同步整流、交错并联电源可以简化软件逻辑确保多个通道参数变化的绝对一致性避免了分别写入可能引入的微小时间差。理解了这些顶层设计思想我们再去看每个具体的寄存器位就不再是记忆枯燥的0和1而是理解其在整个控制系统中的角色和使命。3. 时间基准Time-Base子模块寄存器深度解析时间基准子模块是ePWM的“时钟心脏”它产生最基础的时基计数器TBCTR所有PWM时序都以此为参考。其寄存器配置直接决定了PWM的宏观行为模式。3.1 核心周期与相位控制寄存器组TBPRD (Time-Base Period Register) TBPRDHR (High-Resolution Period Register)这是决定PWM频率的核心。PWM频率Fpwm TBCLK / (TBPRD 1)在递增计数模式下。TBPRD是16位整数部分TBPRDHR是8位小数部分高分辨率周期控制启用时。例如系统时钟SYSCLKOUT100MHzTBCLK不分频若需要25kHz的PWM频率则TBPRD (100MHz / 25kHz) - 1 3999。关键实践动态调整频率的避坑指南在电机启动或电源软启动时我们常需要平滑改变PWM频率。务必结合影子寄存器机制操作确保TBCTL[PRDLD]0使能影子加载。计算新的TBPRD值写入寄存器实际写入影子寄存器。等待一个TBCTR0的事件可通过查询TBSTS或使用中断此时新周期值生效。切勿在TBCTL[PRDLD]1立即模式下直接写入TBPRD除非你刻意追求一种“突变”效果但这在功率应用中通常是危险的。TBPHS (Time-Base Phase Register) TBPHSHR (High-Resolution Phase Register)这是实现多路PWM同步相位差的关键。TBPHS存储了当同步事件发生时加载到TBCTR中的值。假设主模块TBCTR从0计数到TBPRD从模块的TBPHS设置为TBPRD/3那么在同步后从模块的波形将滞后主模块120度电角度对于三相系统。深度解析HRPCTL[TBPHSHRLOADE]位这是一个极易被忽略但至关重要的位。当启用高分辨率周期控制(HRPE1)时如果你希望高分辨率相位部分(TBPHSHR)也能在同步事件时被加载必须将此位置1。否则只有低16位相位(TBPHS)会被加载高8位相位保持不变可能导致微小的相位误差累积。在要求极高的多模块精密同步场合这个细节必须注意。TBCTR (Time-Base Counter Register)可直接读写当前计数器值。但请注意写TBCTR是立即生效的没有影子缓冲这通常用于强制同步或调试在正常运行中应避免随意写入以免打乱计数序列。3.2 控制与状态寄存器配置与监控TBCTL (Time-Base Control Register)这是时间基准的“大脑”每个位都至关重要CTRMODE[1:0]计数模式选择。00递增01递减10递增-递减。电机控制中生成中心对称PWM减少谐波必须使用递增-递减模式。此时PWM频率公式变为Fpwm TBCLK / (2 * TBPRD)。PHSEN相位加载使能。必须置1TBPHS才能在同步事件时加载。PRDLD周期寄存器加载模式。如前所述0为影子模式安全1为立即模式危险仅用于特定场景。CLKDIV与HSPCLKDIV时钟预分频。共同决定TBCLK SYSCLKOUT / (HSPCLKDIV * CLKDIV)。合理分频可以降低TBCLK从而用有限的TBPRD值获得更低的PWM频率或者匹配ADC采样时钟。SYNCOSEL[1:0]同步输出信号选择。决定了本模块的EPWMxSYNCO信号来源。可以传递输入同步(SYNCI)也可以在TBCTR0或CMPB时自己产生同步从而构建同步链。SWFSYNC软件强制同步。向此位写1产生一个同步脉冲非常便于软件主动触发同步序列。TBSTS (Time-Base Status Register)CTRMAX计数器溢出标志。如果TBCTR达到最大值0xFFFF此位置1。在异常情况下可用于诊断。SYNCI输入同步事件标志。可用于确认同步信号是否到达。CTRDIR实时指示计数器当前方向递增/递减在调试时非常有用。TBCTL2 与 HRPCTLTBCTL2[PRDLDSYNC]扩展的周期加载同步选择。当TBCTL[PRDLD]0时此字段定义了除了TBCTR0之外是否在SYNC事件时也加载周期影子寄存器。这对于需要在同步点同时改变所有模块频率的复杂场景提供了灵活性。HRPCTL[HRPE]高分辨率周期使能。置1后TBPRDHR和TBPHSHR才生效。注意在此模式下递减计数模式(CTRMODE01)不被支持。4. 计数器比较Counter-Compare子模块寄存器深度解析如果说时间基准定义了PWM的“舞台”周期那么计数器比较子模块就是台上的“指挥棒”它通过比较TBCTR和比较寄存器的值在精确的时刻触发动作从而塑造出PWM波形的具体形状占空比。4.1 比较寄存器与影子加载机制CMPA, CMPB, CMPC, CMPD这是四个核心的比较寄存器。CMPA/B最常用直接与TBCTR比较产生CTRCMPA和CTRCMPB事件送给动作限定子模块AQ来驱动EPWMxA/B引脚电平变化。CMPC/D通常用于更高级的触发比如在特定时刻触发ADC开始转换。占空比计算递增计数模式占空比 CMPA / (TBPRD 1)递减计数模式占空比 1 - (CMPA / (TBPRD 1))递增-递减计数模式占空比 CMPA / TBPRD注意此时一个周期内TBCTR会两次等于CMPA分别用于设置和清除产生对称波形。CMPCTL (Counter-Compare Control Register)此寄存器管理CMPA/B的影子加载行为是保证占空比无毛刺更新的关键。SHDWAMODE/SHDWBMODE影子模式选择。0为影子模式双缓冲1为立即模式。对于需要平滑调整的应用如电机调速必须使用影子模式。LOADAMODE/LOADBMODE影子到活跃寄存器的加载事件选择。这是配置的精华所在00: 在TBCTR0时加载。这是最常用的设置保证在新的PWM周期开始时采用新的比较值。01: 在TBCTRTBPRD周期值时加载。在递增-递减模式下TBCTRTBPRD是计数器达到峰值的时刻在此刻加载可用于某些特殊调制。10: 在TBCTR0或TBCTRTBPRD时加载。这提供了更高的更新速率但需要谨慎因为在一个周期内更新两次可能破坏波形的对称性。11: 冻结不自动加载。用于软件完全手动控制加载时机。SHDWAFULL/SHDWBFULL影子寄存器满状态标志。这是一个硬件标志位。当你向处于影子模式的CMPA寄存器写入新值时硬件会置起SHDWAFULL表示“影子寄存器已满新值已就绪等待加载事件”。当约定的加载事件如TBCTR0发生时硬件在将影子值加载到活跃寄存器的同时会自动清除这个标志。你可以通过查询这个标志位来确认上一次写入的值是否已被硬件采纳。如果在你写入之前该标志位已经是1说明上一次写入的值还未被加载此时再写入会覆盖掉等待加载的值可能导致控制逻辑错误。在编写高可靠性的动态更新代码时检查这个标志位是很好的习惯。CMPCTL2功能与CMPCTL类似但用于管理CMPC和CMPD寄存器。4.2 高分辨率比较与寄存器链接CMPAHR, CMPBHR当启用高分辨率脉宽调制HRPWM时这两个寄存器提供比较值的8位小数部分与CMPA/B的16位整数部分共同构成24位精度的比较值能实现皮秒级精度的占空比微调对于提高开关电源的轻载效率或降低电机噪音有奇效。EPWMXLINK (EPWMx Link Register)这是实现多模块协同的“神器”。它允许你将本模块的TBPRD、CMPA、CMPB、CMPC、CMPD寄存器链接到另一个ePWM模块的对应寄存器。应用场景1并联均流。在多相并联DC-DC电源中需要各相的PWM参数完全一致。可以将所有从模块的TBPRD和CMPA链接到主模块。只需配置主模块参数写入时所有链接模块自动更新确保了绝对的参数一致性和同时性避免了软件顺序写入带来的时间差。应用场景2生成互补对称波形。在驱动半桥或H桥时需要两路互补的PWM如EPWM1A和EPWM1B且带有死区。可以将EPWM2的CMPA链接到EPWM1的CMPA然后配置EPWM2为反相输出。这样只需更新EPWM1的CMPAEPWM2的输出会自动保持互补关系。配置方法EPWMXLINK寄存器中的TBPRDLINK、CMPALINK等字段每个占4位。写入目标ePWM模块的编号如ePWM2对应0011即可建立链接。写入0000或0001链接到自身则断开链接。5. 实战配置流程与核心代码剖析理解了寄存器原理后我们通过一个典型的电机控制中心对称PWM配置案例将知识串联起来。目标是配置ePWM1模块产生一对带死区的互补PWMA和B用于驱动一个半桥并启用高分辨率占空比控制。5.1 初始化步骤分解步骤1配置时间基准Time-Base首先确定系统需求假设SYSCLKOUT 200MHz需要PWM频率为20kHz采用递增-递减计数模式以产生中心对称PWM。计算TBPRDFpwm TBCLK / (2 * TBPRD)。为简化设TBCLK SYSCLKOUT 200MHz。则TBPRD 200MHz / (2 * 20kHz) 5000。配置TBCTLCTRMODE 10b(递增-递减模式)PHSEN 0(本例中不需要外部相位同步)PRDLD 0(使能TBPRD影子加载)CLKDIV 000b(分频系数1)HSPCLKDIV 001b(分频系数2因此实际TBCLK 200MHz / (2*1) 100MHz)重新计算TBPRDTBPRD 100MHz / (2 * 20kHz) 2500。SYNCOSEL 11b(禁用同步输出作为独立主模块)写入TBPRD 2500。步骤2配置计数器比较Counter-Compare假设我们需要初始占空比为50%。计算CMPA在递增-递减模式下CMPA值等于高电平时间对应的计数值。50%占空比时CMPA 0。实际上占空比从0%到100%变化CMPA从0到TBPRD变化。我们先设CMPA 1250对应50%占空比。配置CMPCTLSHDWAMODE 0(CMPA使用影子模式)LOADAMODE 00b(在TBCTR0时加载影子寄存器)SHDWBMODE 0,LOADBMODE 00b(CMPB配置类似可能用于死区生成见步骤3)写入CMPA 1250。步骤3配置动作限定器Action-QualifierAQ模块根据TBCTR与CMPA/B的比较结果来设置/清除输出引脚。我们需要配置AQCTLA和AQCTLB寄存器虽非本文核心但为完整流程列出在递增计数期间当TBCTR CMPA时将EPWM1A拉低CLEAR。在递减计数期间当TBCTR CMPA时将EPWM1A拉高SET。对于EPWM1B我们通常配置为与EPWM1A互补。这可以通过AQ配置为相反动作实现更常见的做法是结合死区模块DB生成互补带死区的信号。步骤4配置死区模块Dead-Band为了防止半桥上下管直通必须插入死区时间。假设需要500ns死区。计算死区计数值TBCLK周期为10ns (100MHz)500ns对应50个TBCLK周期。配置DBCTL寄存器选择上升沿和下降沿延迟模式并设置DBRED和DBFED寄存器均为50。步骤5启用高分辨率PWMHRPWM如果需要高于TBCLK分辨率的占空比控制需配置HRPWM模块。配置HRPCTL寄存器将HRPE位置1启用高分辨率周期控制如果也需要高分辨率周期。对于高分辨率占空比主要涉及CMPAHR寄存器。通过微调CMPAHR的值0-255可以在CMPA决定的粗调占空比基础上进行1/256个TBCLK周期的精细调整。5.2 核心代码片段C语言与寄存器直接操作以下代码展示了如何不依赖TI的DriverLib直接通过寄存器地址操作来完成上述部分核心配置。这能让你更清晰地看到每一步操作的本质。// 假设寄存器地址已通过头文件定义例如 #define EPWM1_BASE 0x0000 #define EPWM1_TBCTL (*(volatile unsigned int *)(EPWM1_BASE 0x00)) #define EPWM1_TBPRD (*(volatile unsigned int *)(EPWM1_BASE 0x0A)) #define EPWM1_CMPA (*(volatile unsigned int *)(EPWM1_BASE 0x12)) #define EPWM1_CMPCTL (*(volatile unsigned int *)(EPWM1_BASE 0x08)) #define EPWM1_AQCTLA (*(volatile unsigned int *)(EPWM1_BASE 0x16)) void EPWM1_Init(void) { // 步骤1: 停止时基计数器 EPWM1_TBCTL 0xFFFC; // 清除CTRMODE位设置为11b停止模式 // 配置时基控制寄存器TBCTL // CTRMODE10b (增减计数), PHSEN0, PRDLD0, CLKDIV000b, HSPCLKDIV001b // 其他位默认。注意TBCTL是一个16位寄存器但C28x是32位访问我们按32位操作低16位。 unsigned int tbctl_config 0; tbctl_config | (0x2 0); // CTRMODE 10b tbctl_config | (0x0 2); // PHSEN 0 tbctl_config | (0x0 3); // PRDLD 0 tbctl_config | (0x0 10); // CLKDIV 000b tbctl_config | (0x1 7); // HSPCLKDIV 001b // SYNCOSEL默认或设为11b禁用 tbctl_config | (0x3 4); // SYNCOSEL 11b EPWM1_TBCTL tbctl_config; // 设置周期值 (2500) EPWM1_TBPRD 2500; // 步骤2: 配置比较控制寄存器CMPCTL // SHDWAMODE0, LOADAMODE00b (TBCTR0时加载) unsigned int cmpctl_config 0; cmpctl_config | (0x0 4); // SHDWAMODE 0 cmpctl_config | (0x0 0); // LOADAMODE 00b // 类似配置CMPB... EPWM1_CMPCTL cmpctl_config; // 设置初始比较值 (50% 占空比) EPWM1_CMPA 1250; // 步骤3: 配置动作限定器AQCTLA (示例中心对称PWM) // 增计数时CMPA匹配则清除EPWM1A (拉低) // 减计数时CMPA匹配则置位EPWM1A (拉高) unsigned int aqctla_config 0; aqctla_config | (0x2 4); // CBU CLEAR on CAU (Up-count, CTRCMPA) aqctla_config | (0x1 2); // CBD SET on CAD (Down-count, CTRCMPA) EPWM1_AQCTLA aqctla_config; // 步骤4: 重新启动时基计数器 // 将CTRMODE从停止模式(11b)切换到增减模式(10b) EPWM1_TBCTL ~(0x3); // 先清除低两位 EPWM1_TBCTL | (0x2); // 设置为10b (增减计数) }这段代码清晰地展示了寄存器级编程的逻辑。在实际项目中你可能会封装更友好的函数但理解底层寄存器的直接操作是进行深度优化和故障排查的基础。6. 高级应用与调试技巧掌握了基础配置后我们可以探索一些高级应用场景并分享一些宝贵的调试经验。6.1 实现相移全桥Phase-Shifted Full-Bridge同步相移全桥拓扑中四个开关管需要两对互补的PWM且这两对PWM之间需要一定的相位差如90度来实现软开关。这需要两个ePWM模块例如ePWM1和ePWM2精确同步并设置相位差。配置主模块(ePWM1)如上例配置为独立运行SYNCOSEL设置为在TBCTR0时输出同步信号SYNCOSEL01b。配置从模块(ePWM2)设置TBCTL[PHSEN]1使能相位加载。设置TBPHS为需要的相位值。如果ePWM1的TBPRD为2500需要90度相移1/4周期则TBPHS 2500 / 4 625。设置TBCTL[SYNCOSEL]00b使其同步输入源为EPWMxSYNCI即来自ePWM1的同步输出。TBCTL[CTRMODE]和TBPRD必须与ePWM1设置相同。链接关键寄存器可选但推荐通过EPWM2LINK寄存器将ePWM2的TBPRD链接到ePWM1。这样任何对ePWM1周期的修改都会自动同步到ePWM2确保频率绝对一致。6.2 动态改变占空比与“影子寄存器满”标志的使用在电机速度环或电流环控制中需要在每个PWM周期更新占空比。安全的方法是使用影子寄存器并在合适的时机写入新值。void UpdateDutyCycle(volatile unsigned int *pCmpaReg, unsigned int newCmpaValue) { // 方法1简单等待法适用于控制周期远长于PWM周期 // 直接写入影子寄存器硬件会在下一个TBCTR0时自动加载 *pCmpaReg newCmpaValue; // 方法2精确同步法推荐用于高实时性要求 // 等待当前周期结束影子值被加载再写入下一个周期的值。 // 可以通过查询TBSTS寄存器或等待中断来实现。 // while(检查是否处于一个周期的安全窗口例如TBCTR接近0或TBPRD){}; *pCmpaReg newCmpaValue; // 方法3利用SHDWAFULL标志更可靠 // 在写入前检查影子寄存器是否已空即上一次写入的值已被加载。 volatile unsigned int *pCmpctlReg ...; // 获取CMPCTL寄存器地址 // 等待SHDWAFULL标志为0 while((*pCmpctlReg 0x0100) ! 0) { // 假设SHDWAFULL是第8位 ; // 空循环等待 } // 现在可以安全写入不会覆盖未加载的值 *pCmpaReg newCmpaValue; }方法3是最稳健的它确保了控制算法计算出的新值一定能被送入影子寄存器并在下一个加载点生效避免了数据覆盖丢失的问题。6.3 常见问题排查与寄存器级调试当PWM输出不符合预期时寄存器级调试是终极手段。问题1无PWM输出检查清单时钟与计数器确认TBCTL[CTRMODE]不是11b停止模式。用调试器读取TBCTR寄存器看其是否在循环计数。输出使能检查GPIO复用寄存器是否已正确配置为EPWM功能。检查AQCTLA/B寄存器是否配置了有效的动作SET/CLEAR/TOGGLE默认是0无动作。比较值确认CMPA的值是否在TBCTR的计数范围内0到TBPRD。如果CMPA始终大于TBPRD则永远不会发生匹配事件。问题2PWM波形出现意外毛刺或跳动检查清单影子寄存器冲突这是最常见的原因。你是否在PWM周期中间TBCTR不等于0或TBPRD写入了CMPA/B或TBPRD并且该寄存器配置为立即模式(SHDWxMODE1或PRDLD1)立即模式下的直接写入会立刻改变工作寄存器的值导致当前周期波形被破坏。同步事件干扰检查是否有意外的同步输入(EPWMxSYNCI)发生读取TBSTS[SYNCI]标志位。同步事件可能会导致TBCTR被TBPHS重置打断正常的计数流程。寄存器链接干扰如果你使用了EPWMXLINK检查是否其他被链接的模块正在意外地修改本模块的比较值或周期值。问题3高分辨率HRPWM功能不生效检查清单使能位首先确认HRPCTL[HRPE]是否已置1。时钟校准HRPWM依赖于精确的微边沿定位器MEP需要对模块的TBCLK进行校准。是否已运行TI提供的HRPWM校准例程或调用了相关的校准函数寄存器配对写入写入高分辨率比较值时需要将CMPAHR:CMPA作为一个32位值同时写入或者通过CMPAHRM:CMPAM镜像寄存器对写入以确保高低位同步。单独写入CMPA和CMPAHR可能会引入错误。调试工具使用 充分利用CCSCode Composer Studio的寄存器查看窗口和实时变量监控。你可以在运行时暂停CPU查看所有ePWM寄存器的当前值。将关键寄存器如TBCTR,CMPA,CMPB添加到“Expressions”窗口进行实时监控。使用图形化工具如CCS的Canvas捕获EPWMxA/B引脚的实际波形并与你根据寄存器值计算出的理论波形进行对比。通过这种寄存器级的“望闻问切”你就能从最底层定位并解决绝大多数ePWM相关的硬件控制问题从而构建出稳定、可靠的电力电子或电机驱动系统。