深入解析ePWM动作限定模块:从事件响应到PWM波形精准生成

深入解析ePWM动作限定模块:从事件响应到PWM波形精准生成

1. 动作限定模块:PWM波形生成的“指挥家”

在嵌入式电机控制、数字电源或者任何需要精确功率开关的场合,PWM(脉冲宽度调制)信号的质量直接决定了整个系统的性能与效率。我们常常把PWM的时基计数器(TBCTR)比作一个节拍器,它规律地递增递减,定义了PWM周期的“时间轴”。但光有节拍器还不够,我们还需要一个“指挥家”,来告诉输出引脚(EPWMxA和EPWMxB)在节拍器的哪个精确时刻,应该做出“拉高”、“拉低”还是“翻转”的动作。这个至关重要的“指挥家”,就是ePWM模块中的动作限定(Action-Qualifier, AQ)子模块。

你可能已经配置过简单的PWM,比如设置一个周期值(TBPRD)和一个比较值(CMPA),让输出在计数器等于CMPA时翻转。这确实能工作,但在复杂的工业驱动中,我们需要生成互补对称的PWM对、插入精确的死区时间、或者根据外部故障信号(Trip)即时改变输出状态。这时,简单的“比较匹配即翻转”逻辑就力不从心了。动作限定模块的强大之处在于,它将PWM波形的构造抽象为对一系列“事件”的“动作”响应。你可以为每个输出独立编程,指定在“计数器等于CMPA且正在递增”、“计数器等于零”、“发生外部T1事件”等多种条件下,输出应该执行何种操作。这种基于事件的编程模型,提供了无与伦比的灵活性和确定性,是构建高可靠性、高性能功率变换系统的基石。

本文将以德州仪器(TI)AM261x系列处理器的ePWM模块为蓝本,深入解析动作限定模块的工作原理、配置方法以及那些手册上不会明说,但在实际调试中会让你豁然开朗的实战细节。无论你是正在调试一台伺服驱动器,还是设计一个LLC谐振变换器,理解AQ模块,就意味着你真正掌握了PWM生成的主动权。

2. 核心机制:事件、动作与优先级

要驾驭动作限定模块,必须吃透三个核心概念:事件(Event)动作(Action)优先级(Priority)。它们构成了AQ模块逻辑的骨架。

2.1 事件源:什么能触发动作?

事件是AQ模块的输入,是触发输出状态改变的“因”。AM261x的ePWM AQ模块识别以下几类核心事件:

  1. 计数器匹配事件:这是最常用的事件源,与时基计数器(TBCTR)的状态直接相关。

    • CTR = PRD:计数器达到周期值(TBCTR == TBPRD)。这标志着一个PWM周期的结束(或开始)。
    • CTR = Zero:计数器归零(TBCTR == 0x0000)。这是增计数模式的起点,或增减计数模式的下一个起点。
    • CTR = CMPA:计数器等于比较寄存器A的值(TBCTR == CMPA)。这是调节EPWMxA占空比的主要手段。
    • CTR = CMPB:计数器等于比较寄存器B的值(TBCTR == CMPB)。用于调节EPWMxB占空比,或在单通道上生成更复杂的脉冲。
  2. 触发事件(T1/T2):这类事件来源于ePWM模块内部的其他子模块,如数字比较(DC)子模块或故障保护(Trip-Zone)子模块。例如,你可以配置当某个模拟比较器(CMPSS)输出超过阈值时,产生一个T1事件,进而让AQ模块立即将PWM输出拉低。关键点在于:T1/T2事件的配置在AQ模块中是独立的。一个故障信号可以在Trip-Zone子模块中配置为强制拉低输出(硬件保护),同时也可以在AQ模块中配置为产生一个T1事件用于软件记录或产生特定波形,两者互不干扰。这提供了极大的安全性和灵活性。

  3. 软件强制事件:这是一个由软件直接触发的异步事件。通过写AQSFRC(软件强制寄存器)和AQCSFRC(连续软件强制寄存器),你可以在任意时刻强制设置、清除或翻转输出,不受计数器周期的限制。这在初始化、测试或特定控制序列中非常有用。

实操心得CTR = CMPACTR = CMPB事件是PWM占空比调制的基础。而CTR = PRDCTR = Zero事件则常用于同步更新影子寄存器、触发ADC采样,或者在增减计数模式下构造对称波形的边沿。T1/T2事件是你的“紧急按钮”或“高级触发器”,用于实现基于外部条件的复杂波形控制。

2.2 动作类型:输出能做什么?

当上述事件发生时,AQ模块可以指挥EPWMxA和EPWMxB输出执行以下四种动作之一:

  • 置高(Set High):将输出引脚驱动为高电平。
  • 清零(Clear Low):将输出引脚驱动为低电平。
  • 翻转(Toggle):如果当前为高则变低,当前为低则变高。
  • 无操作(Do Nothing):保持输出当前状态不变。注意:“无操作”仅意味着不改变输出电平,但该事件仍然可以用于触发中断或启动ADC转换,这个特性在精确定时采样时非常关键。

独立性与并发性:这是AQ模块设计的精髓。你可以为EPWMxA和EPWMxB独立配置对同一事件的不同响应。例如,当CTR = CMPA事件发生时,你可以设置EPWMxA“置高”,同时设置EPWMxB“清零”。更重要的是,一个输出可以响应多个事件。例如,EPWMxA的输出波形可以由CTR = CMPACTR = CMPB两个事件共同塑造,这为生成中心对齐的PWM或带死区的互补信号提供了可能。

2.3 事件优先级:当多个事件同时发生时

在复杂的波形生成中,尤其是在增减计数模式下,多个事件可能在同一个TBCLK时钟沿上同时发生。例如,当计数器从TBPRD-1计数到TBPRD时,会同时触发CTR = PRD事件;紧接着下一个时钟,计数器从TBPRD归零,又会触发CTR = Zero事件。如果这两个事件都对同一个输出配置了动作,谁先谁后?

AQ模块的硬件为此定义了严格的优先级规则。其核心思想是:“软件强制事件”拥有最高优先级,因为它代表最紧急的软件干预;而对于硬件事件,则遵循“时间上后发生的事件优先级更高”的原则,并且在增减计数模式下,优先级会根据计数方向(递增或递减)动态调整。

以下是增减计数(Up-Down Count)模式下的优先级表格(优先级数字越小,优先级越高):

优先级TBCTR递增时(0 -> TBPRD)TBCTR递减时(TBPRD -> 0)
1(最高)软件强制事件软件强制事件
2T1上升事件(T1U)T1下降事件(T1D)
3T2上升事件(T2U)T2下降事件(T2D)
4CMPB上升匹配(CBU)CMPB下降匹配(CBD)
5CMPA上升匹配(CAU)CMPA下降匹配(CAD)
6计数器等于零(CTR=Zero)计数器等于周期(CTR=PRD)
7T1下降事件(T1D)T1上升事件(T1U)
8(最低)T2下降事件(T2D)T2上升事件(T2U)

解读与实战意义

  1. 方向敏感性:注意CTR=ZeroCTR=PRD的优先级在增减计数时对调了。在递增阶段,CTR=PRD是计数终点,CTR=Zero是起点(刚过去),因此CTR=Zero优先级高;在递减阶段则相反。这确保了波形边沿定义的确定性。
  2. 比较事件优先级CMPB事件的优先级高于CMPA。这意味着如果CMPA和CMPB值设置相同,在同一个计数方向上,CTR=CMPB事件的动作将覆盖CTR=CMPA事件的动作。这是一个非常重要的细节,在配置互补PWM时,你需要根据希望的边沿顺序来安排CMPA和CMPB的值以及对应的动作。
  3. 软件强制至高无上:无论硬件处于何种状态,软件强制事件都能立即生效,这为实现故障安全恢复或特殊控制序列提供了最终手段。

避坑指南:在配置中心对齐的��补PWM时,我们通常用CMPA控制上升沿,CMPB控制下降沿。假设在递增阶段,你希望当CTR=CMPA时设置EPWMxA为高,当CTR=CMPB时清除EPWMxA为低。如果CMPA > CMPB,那么在计数器从0增加到TBPRD的过程中,会先遇到CMPB(CBD事件),后遇到CMPA(CAU事件)。根据优先级表,CBD(优先级4)高于CAU(优先级5),所以会先执行CBD的“清除”动作,再执行CAU的“设置”动作,结果输出始终为低,无法产生脉冲。因此,在增减模式下生成有效脉冲,必须保证在同一个计数方向上,你希望后发生的那个事件,其对应的比较值要更小(对于递增阶段,后发生的CAU其CMPA值应小于先发生的CBD的CMPB值)。这常常是初学者配置不出波形的第一个坑。

3. 寄存器配置与影子模式操作

理解了原理,我们来看如何通过寄存器进行配置。AQ模块的核心控制寄存器是AQCTLAAQCTLB,它们分别控制EPWMxA和EPWMxB的输出动作。

3.1 AQCTLA/AQCTLB寄存器详解

这两个寄存器结构相似,每个寄存器中的位域(bit-field)用于定义在特定事件发生时,应对输出执行什么动作。每个事件(如CAU, CAD, CBU, CBD, PRD, ZRO)通常对应2个比特位,可以编码为:00(无操作)、01(清零)、10(置高)、11(翻转)。

例如,配置一个在增减计数模式下、由CMPA控制占空比、中心对齐的PWM(EPWMxA),典型配置如下:

  • AQCTLA:
    • CAU = 10(Set High, 计数器递增至CMPA时置高)
    • CAD = 01(Clear Low, 计数器递减至CMPA时清零)
    • PRD = 00(Do Nothing)
    • ZRO = 00(Do Nothing)

这个配置下,波形在计数器从0上升到CMPA时变高,从TBPRD下降到CMPA时变低,形成了一个以周期中心为对称点的PWM脉冲。

3.2 影子模式:实现无毛刺的实时更新

在电机控制等实时系统中,我们经常需要在下一个PWM周期开始时,更新比较值(CMPA/CMPB)以改变占空比。如果直接写入正在使用的活跃寄存器(Active Register),可能会发生在计数器正在匹配的瞬间,导致当前周期波形出现毛刺或畸变(即“撕裂”现象)。

为了解决这个问题,ePWM引入了**影子寄存器(Shadow Register)**机制。以AQCTLA为例:

  • 活跃寄存器:直接控制硬件动作,在运行时不可随意写入。
  • 影子寄存器:供软件安全写入新配置的缓冲区。

影子模式的操作流程

  1. 使能影子模式:通过设置AQCTL[SHDWAQAMODE]位(对于A通道)和AQCTL[SHDWAQBMODE]位(对于B通道)为1。
  2. 软件将新的动作配置写入AQCTLA/AQCTLB寄存器地址。此时,数据实际被写入到对应的影子寄存器中,活跃寄存器内容不变,当前波形输出不受影响。
  3. 在指定的加载事件(由AQCTL[LDAQAMODE]AQCTL[LDAQBMODE]位配置)发生时,影子寄存器的内容被自动、同步地复制到活跃寄存器。常见的加载事件有:
    • CTR = PRD:在计数器达到周期值时加载。适用于增减计数模式。
    • CTR = Zero:在计数器归零时加载。适用于增计数模式。
    • SYNC事件:由外部同步信号或软件同步触发。

立即加载模式:如果禁用影子模式(SHDWAQxMODE=0),则对寄存器的写操作会直接更新活跃寄存器,适用于初始化或不需要实时更新的静态配置。

关键警告与最佳实践:技术手册中特别强调了一个边界条件冲突的问题。切勿在加载事件边界上将比较寄存器(CMPA/CMPB)设置为0例如,如果你配置了在CTR=Zero时从影子寄存器加载AQCTLALDAQAMODE配置为CTR=Zero),同时又将CMPA寄存器设置为0,并配置了当CTR=CMPA(即CTR=0)时触发某个动作。那么,在CTR=0的这个时钟周期,加载事件和比较匹配事件会同时发生,产生硬件冲突,可能导致不可预知的行为。手册的建议是:在这种情况下,请使用非零的比较值(例如1),或者将加载事件改为CTR=PRD。这是实际调试中一个非常隐蔽的坑。

3.3 全局加载控制

在复杂的多通道PWM系统中(如三相逆变器),我们可能希望所有ePWM模块的多个影子寄存器(如AQCTLACMPADBRED等)在同一时刻同步更新,以确保各相之间严格的相位关系。AM261x的ePWM提供了**全局加载(Global Load)**机制。

通过配置全局加载配置寄存器(GLDCFG)和全局加载控制寄存器(GLDCTL),你可以将多个模块的多个影子寄存器“捆绑”在一起。当指定的全局加载事件(同样是CTR=PRDCTR=Zero)发生时,所有使能了全局加载的寄存器,其影子寄存器的内容会原子性地、同时地更新到各自的活跃寄存器。这彻底消除了因多个寄存器分时更新而可能引入的相间不平衡问题,对于高性能电机驱动至关重要。

4. 典型波形生成配置解析

理论最终要服务于实践。下面我们拆解几个最常用的PWM波形配置,看看如何运用AQ模块的各项功能。

4.1 增计数模式下的非对称PWM(边沿对齐)

这是最简单的PWM模式,计数器从0递增到TBPRD,然后归零重启。

  • 目标:生成一个EPWMxA信号,占空比由CMPA控制,0%到100%可调,上升沿对齐。
  • 配置
    • 时基模式:增计数(TBCTL[CTRMODE] = UP)。
    • 动作配置(AQCTLA):
      • ZRO = 10(Set High):计数器归零时,输出置高。
      • CAU = 01(Clear Low):计数器递增至CMPA时,输出清零。
      • PRD = 00(Do Nothing)。
  • 工作原理:每个周期从0开始,输出立即变高。当计数器增长到等于CMPA值时,输出变低,并保持低电平直到周期结束(计数器达到TBPRD后归零)。高电平时间 = CMPA * Tbcik, 占空比 = CMPA / (TBPRD + 1)。当CMPA=0时,CAU事件在计数器为0时立即发生,由于CAU(优先级6)比ZRO(优先级7)高,所以先执行“清零”,再执行“置高”,结果输出始终为低(0%占空比)。当CMPA >= TBPRD时,CAU事件不会发生(因为计数器永远达不到CMPA),只有ZRO的“置高”生效,输出恒高(100%占空比)。

4.2 增减计数模式下的对称PWM(中心对齐)

这是电机控制和数字电源中最常用的模式,波形对称,谐波特性更好。

  • 目标:生成一个EPWMxA信号,占空比由CMPA控制,0%到100%可调,脉冲中心对齐。
  • 配置
    • 时基模式:增减计数(TBCTL[CTRMODE] = UP-DOWN)。
    • 动作配置(AQCTLA):
      • CAU = 10(Set High):计数器递增至CMPA时,输出置高。
      • CAD = 01(Clear Low):计数器递减至CMPA时,输出清零。
      • ZRO = 00,PRD = 00
  • 工作原理:计数器从0递增到TBPRD,再递减回0。在递增阶段,当CTR=CMPA时置高;在递减阶段,当CTR=CMPA时清零。这样就产生了一个以计数周期中心为对称点的脉冲。占空比计算:高电平时间 = 2 * CMPA * Tbcik, 周期 = 2 * TBPRD * Tbcik, 占空比 = CMPA / TBPRD。
  • 边界条件处理(手册重点强调):
    • 如果你在CTR=Zero时加载CMPA的影子寄存器(常见做法),那么CMPA的值必须大于等于1。如果CMPA=0,CAU事���在计数器为0时立即发生(优先级高于ZRO的加载事件?这里需注意事件顺序),可能导致一个极窄的、可能被系统忽略的脉冲,或产生冲突。为确保至少有一个TBCLK宽度的脉冲,CMPA应>=1。
    • 同理,如果在CTR=PRD时加载CMPA,则CMPA应<=TBPRD-1。

4.3 生成带死区的互补PWM对

驱动半桥或全桥电路时,必须防止上下桥臂直通,需要在互补的PWM信号中插入死区时间。利用AQ模块和两个比较寄存器,我们可以不依赖独立的死区生成模块(DB),直接通过编程实现。

  • 目标:生成一对互补的EPWMxA和EPWMxB信号,并带有可编程的死区时间。
  • 配置思路(以增减计数、高电平有效为例)
    • 时基模式:增减计数。
    • 核心技巧:使用CMPA控制EPWMxA的上升沿和EPWMxB的下降沿;使用CMPB控制EPWMxA的下降沿和EPWMxB的上升沿。且令CMPB = CMPA + DeadTime(其中DeadTime是换算为计数器时钟个数的死区时间)。
    • 动作配置:
      • AQCTLA:
        • CAU = 10(Set High) // A上升沿
        • CBU = 01(Clear Low) // A下降沿(由CMPB在递增阶段控制)
      • AQCTLB:
        • CAU = 01(Clear Low) // B下降沿(与A上升沿互补,但由CMPA事件触发“清除”)
        • CBU = 10(Set High) // B上升沿(由CMPB在递增阶段控制)
    • 波形分析:在计数器递增阶段,当CTR=CMPA时,EPWMxA置高(开启上管),EPWMxB清零(关闭下管)。经过DeadTime个时钟后,CTR=CMPB,此时EPWMxA清零(关闭上管),EPWMxB置高(开启下管)。这样就确保了在切换瞬间,上下管之间有一个CMPB-CMPA宽度的死区时间,两者均为低电平,防止直通。递减阶段的配置(CADCBD)逻辑类似,用于生成对称的另一半波形。

高级技巧:上述方法提供了最大的灵活性,因为死区时间可以通过动态修改CMPB来实现。然而,对于固定的死区时间,使用ePWM内置的死区生成(DB)子模块更为简便和标准化。DB模块可以自动在输入的原始PWM信号基础上,对上升沿和/或下降沿插入可编程的延迟,并自动生成互补、同相或反相等多种输出极性组合。AQ模块与DB模块可以串联使用,先用AQ生成基础波形,再通过DB插入死区,这种组合能应对绝大多数应用场景。

5. 高级应用与故障排查实录

掌握了基础配置后,我们来看一些高级应用场景和实际调试中必然会遇到的问题。

5.1 利用T1/T2事件实现基于外部条件的PWM调制

T1/T2事件将AQ模块的触发能力从内部计数器扩展到了外部世界。一个典型的应用是峰值电流控制(Peak Current Control)

场景:在电流模式控制的开关电源中,当电感电流上升到某个阈值(由模拟比较器检测)时,需要立即关闭主开关管。实现

  1. 配置模拟比较器子模块(CMPSS),当其输出超过阈值时,产生一个数字比较事件(DCAEVT1)。
  2. 在AQ模块中,配置DCAEVT1作为T1事件的源(通过AQTSRCSEL寄存器)。
  3. 配置AQCTLA寄存器,令T1UT1D事件的动作均为“清零”(Clear Low)。
  4. 同时,依然配置CTR=CMPA事件为“置高”(Set High),由CMPA决定每个周期的起始时刻。

工作过程:每个周期开始,CTR=ZeroCTR=CMPA事件将输出置高。一旦电感电流达到阈值,比较器触发DCAEVT1,进而产生T1事件。AQ模块立即响应,执行“清零”动作,关闭开关管。这样,开关管的导通时间就不再由固定的CMPA决定,而是由实际电流值决定,实现了电流环的闭环控制。

5.2 常见问题排查速查表

在实际调试中,配置好了寄存器却看不到预期波形是常事。下面是一个快速排查指南:

现象可能原因排查步骤与解决方案
完全没有PWM输出1. ePWM模块时钟未使能。
2. 时基计数器未启动(TBCTL[CTRMODE]=FREEZE)。
3. 输出引脚未配置到PWM功能(MUX配置错误)。
4. 输出被强制拉高/拉低(检查AQSFRC寄存器)。
1. 检查系统时钟配置和ePWM外设时钟使能位(PSCLK)。
2. 确认TBCTL[CTRMODE]设置为UPUP-DOWN
3. 检查GPIO复用控制寄存器,确保引脚功能选择为ePWM输出。
4. 检查AQSFRCAQCSFRC寄存器,确保没有意外的软件强制操作。
PWM输出恒定高或恒定低1. 占空比设置为0%或100%。
2. 事件与动作配置错误(例如,只配置了ZROSET,未配置CAUCLEAR)。
3. CMPA/CMPB值超出范围(在增计数模式下,CMPA>TBPRD则永远无匹配)。
4. 影子模式使能但未正确加载。
1. 检查CMPA/CMPB寄存器的值,确保在有效范围内(0 <= CMPx <= TBPRD)。
2. 仔细核对AQCTLA/B寄存器每个事件的配置,确保“置高”和“清零”成对出现。
3. 使用调试器实时查看活跃寄存器(AQCTLA.ACTIVECMPA.ACTIVE)的值,确认配置已生效。
4. 检查影子加载事件(LDAQxMODE)是否与计数器模式匹配,并确认加载事件确实发生。
波形占空比不对或脉冲位置错误1. 时基周期(TBPRD)或比较值(CMPA)计算错误。
2. 在增减计数模式下,CMPA和CMPB的大小关系与期望的边沿顺序矛盾(见2.3节避坑指南)。
3. 优先级冲突导致预期动作被覆盖。
4. 死区模块(DB)被意外使能,引入了额外延迟。
1. 复核计算公式:Tpwm = (TBPRD+1)Ttbclk(增计数)或 Tpwm = 2TBPRD*Ttbclk(增减计数)。
2. 在增减模式下,确保在同一个计数方向,你希望后发生的动作,其对应的比较值更小。必要时交换CMPA/CMPB的角色或调整动作配置。
3. 参考优先级表(章节2.3),分析在事件同时发生的边界,哪个动作会最终生效。
4. 检查DBCTL寄存器,确认死区模块是否被绕过(DBCTL[OUT_MODE]配置为直通模式)。
波形在更新CMPA时出现毛刺1. 直接写入了活跃寄存器,而非影子寄存器。
2. 影子寄存器加载事件配置不当,导致在新周期开始前旧值被覆盖。
3. 在错误的时刻(如计数器正在匹配时)更新了影子寄存器。
1. 确保使能了CMPA和AQCTLA的影子模式(CMPCTL[SHDWAMODE]=1AQCTL[SHDWAQAMODE]=1)。
2. 将加载事件(CTR=PRDCTR=Zero)配置在PWM周期的“安全区”,通常是计数器归零或达到周期值时。
3. 在软件中,确保更新影子寄存器的操作与PWM周期同步(例如,在CTR=Zero中断服务程序中更新)。
使用T1/T2事件无反应1. T1/T2事件源未正确配置(AQTSRCSEL寄存器)。
2. 产生事件的子模块(如DC数字比较子模块)未正确配置或未产生事件。
3. T1/T2事件的动作未在AQCTL寄存器中配置。
1. 确认AQTSRCSEL寄存器选择了正确的事件源(如DCAEVT1对应T1)。
2. 深入配置数字比较(DC)或故障保护(TZ)子模块,确保其能产生所需的事件信号。可以使用寄存器或GPIO监控这些内部事件标志位。
3. 在AQCTLA/B中,为T1UT1DT2UT2D配置明确的动作(不能是Do Nothing)。

5.3 追求极致性能:关于时序延迟的考量

在百兆赫兹级别的开关频率下,每一个时钟周期的延迟都至关重要。需要了解,从事件发生(如CTR=CMPA)到输出引脚实际电平变化,存在固定的硬件流水线延迟。对于AM261x的Type 4 ePWM模块,这个延迟是1个TBCLK周期

这意味着什么?假设你的TBCLK是100MHz(周期10ns),你配置当CTR=100时输出置高。实际上,输出引脚会在CTR=100这个事件被锁存后的下一个时钟沿,也就是在CTR实际上已经变为101(或99,取决于方向)的时候,才发生跳变。

影响与对策

  1. 占空比精度:你设定的CMPA值对应的实际跳变边沿,会比理论值晚1个时钟。在计算占空比时,这是一个固定的系统误差,在高精度应用中需要进行软件补偿,即你的目标CMPA值应减去1。
  2. 死区时间精度:如果你用CMPA和CMPB的差值来软件生成死区,这个1周期延迟对两者影响相同,因此死区时间本身仍然是准确的(CMPB - CMPA)。但如果你使用DB模块,其延迟计数器是从AQ模块的输出开始计时的,这个1周期延迟会被计入DB模块的输入。
  3. 同步与联动:当使用多个ePWM模块同步,或者用PWM事件去触发ADC采样时,必须将这个延迟考虑在内。例如,你想在PWM波形的某个边沿触发ADC采样,可能需要将触发事件提前1个周期配置。

理解并量化这些硬件延迟,是进行高性能、高可靠性数字电源和电机驱动设计的必经之路。动作限定模块作为ePWM的“大脑”,其灵活而强大的事件-动作映射机制,为我们提供了构建复杂、精确、响应迅速的PWM波形的终极工具。从简单的LED调光到复杂的三相逆变器空间矢量调制,其核心都离不开对AQ模块事件的精妙编排。希望这篇深入的解析,能帮助你不仅知其然,更能知其所以然,在下次面对PWM波形挑战时,能够游刃有余。