TI AM261x ePWM高级功能:XCMP复杂波形与HRPWM高精度调制详解

发布时间:2026/7/19 10:07:26
TI AM261x ePWM高级功能:XCMP复杂波形与HRPWM高精度调制详解 1. 项目概述与核心价值在搞电机驱动或者数字电源的兄弟对TI的ePWM模块肯定不陌生。这玩意儿是咱们实现精准时序控制的“心脏”从简单的风扇调速到复杂的多相交错LLC都离不开它。但说实话传统ePWM的玩法——一个周期里就一个上升沿一个下降沿——在应对如今越来越“卷”的性能需求时有时真有点捉襟见肘。比如你想在一个开关周期内实现多脉冲调制比如用于特定谐波消除或者需要生成极其复杂的非对称波形传统模式就得靠软件频繁干预不仅CPU负担重时序精度也难保证。这就是TI在AM261x这类新一代处理器中给ePWM模块“上强度”的原因。它引入了两大“杀器”XCMP复杂波形生成模式和HRPWM高分辨率脉宽调制技术。XCMP模式简单说就是给你开了“外挂”允许你在一个PWM周期内预设最多8个不同的比较点XCMP1-XCMP8从而在一个周期里“雕刻”出多个脉冲波形自由度直接拉满。而HRPWM则是“精度狂魔”它通过一种叫微边沿定位器MEP的技术能把边沿定位的精度从系统时钟周期比如10ns提升到皮秒级比如150ps这对于追求极致效率的高频开关电源来说简直是雪中送炭。今天我就结合手册和实际调试经验把这俩技术的里里外外、配置的坑、实操的细节掰开揉碎了讲清楚。无论你是正在评估AM261x用于新一代电源产品还是已经在调板子但被XCMP的阴影缓冲搞晕了头这篇文章都能给你一份可以直接“抄作业”的指南。2. XCMP模式复杂波形生成的引擎2.1 XCMP模式的核心思想与限制首先得明确XCMP模式是ePWM Type 5模块才有的高级功能。它的核心目标很明确在一个PWM周期TBPRD内生成多于两个边沿的复杂波形。传统模式下我们通过CMPA和CMPB两个寄存器控制两个边沿。而在XCMP模式下我们可以动用多达8个XCMP寄存器XCMP1-XCMP8来作为新的比较值来源。但天下没有免费的午餐为了实现这个能力XCMP模式引入了一些限制这些是你设计时必须先了解的仅支持增计数模式Up-Count这是最重要的限制。手册明确写着XCMP模式不支持减计数Down-Count和增减计数Up-Down-Count模式。这意味着你的波形生成逻辑必须基于从0递增到周期值TBPRD的计数器。如果你的拓扑依赖中心对称的PWM如某些逆变器应用就需要在软件层面进行额外的计算和映射。仅由XCMP匹配事件触发在XCMP模式下输出动作置高、拉低、翻转只能由XCMP1到XCMP8与计数器TBCNT的匹配事件来触发。传统的、基于计数器等于零ZRO或等于周期PRD的事件在此模式下不能直接用于控制输出动作。这改变了我们配置动作限定器AQ时的思维方式。禁用ePWM模块同步当使能XCMP模式设置XCMPEN位后必须通过软件禁用ePWM模块之间的同步输入配置TBCTL[SYNCOSEL]。这是因为XCMP的复杂时序和阴影加载机制与传统的同步链可能存在冲突TI强制要求关闭以避免不可预测的行为。2.2 XCMP寄存器映射与分配机制这是XCMP配置的第一个关键步骤理解错了后面全乱。XCMP寄存器并不是完全独立的它们需要“映射”到我们熟悉的CMPA或CMPB上。映射关系XCMP1到XCMP8这8个寄存器的值实际上是通过写入CMPA:HR和CMPB:HR这两个我们熟悉的“容器”来间接配置的。你可以把CMPA:HR和CMPB:HR想象成两组影子缓冲区专门用于在XCMP模式下向XCMP寄存器加载数据。分配机制这8个XCMP寄存器如何分配给PWM的A通道EPWMxA和B通道EPWMxB使用由XCMPCTL1.XCMPSPLIT位控制。XCMPSPLIT 0不分拆。所有8个XCMP寄存器XCMP1-XCMP8都分配给CMPA用于控制A通道。此时B通道无法使用XCMP功能生成复杂波形。这是单通道复杂波形输出的配置。XCMPSPLIT 1分拆。将XCMP寄存器池分成两部分给A和B通道使用。具体分配数量由XCMPCTL1.CMPA_ALLOC和XCMPCTL1.CMPB_ALLOC两个字段决定。CMPA_ALLOC定义分配给CMPA即A通道的XCMP寄存器数量取值范围1-4。例如设为3则XCMP1, XCMP2, XCMP3归A通道使用。CMPB_ALLOC定义分配给CMPB即B通道的XCMP寄存器数量取值范围5-8。注意这里不是1-4而是5-8例如设为6则XCMP5, XCMP6归B通道使用因为XCMP5和XCMP6是第5、6个。手册中CMPB_ALLOC的值直接对应结束的XCMP编号。实操心得分配时务必注意CMPB_ALLOC的取值含义。它不是数量而是结束索引。如果你想给B通道分配2个寄存器通常使用XCMP5和XCMP6那么CMPB_ALLOC应该设置为6。分配完成后XAQCTLA寄存器控制A通道每个XCMP匹配时的动作XAQCTLB控制B通道的。一个常见的坑是如果你只配置了CMPA_ALLOC3但XCMPSPLIT1那么B通道默认可能不会工作除非你也正确配置了CMPB_ALLOC。2.3 三缓冲阴影加载机制实现波形序列的关键如果说XCMP寄存器是“音符”那么三缓冲阴影加载机制就是让这些音符按“乐谱”连续播放的指挥家。这是XCMP模式最强大也最需要仔细理解的部分。为什么需要多缓冲在实时控制中我们经常需要预先设定好未来几个PWM周期的波形。例如在空间矢量调制SVPWM中每个开关周期都需要一组新的比较值。如果只在当前周期中途计算并写入下一个周期的值时间会非常紧张且容易出错。多缓冲机制允许CPU提前计算好几组数据最多3组存入阴影缓冲区SHDW1, SHDW2, SHDW3然后硬件会在合适的时机自动、无抖动地将它们加载到“活动寄存器”ACTIVE中生效。缓冲里有什么每个阴影缓冲区SHDW1/2/3都是一个完整的数据包包含XCMP1:XCMP1HR到XCMP8:XCMP8HR(通过CMPA:HR和CMPB:HR写入)XTBPRD(即TBPRD的映射)XAQCTLA和XAQCTLB(动作配置)XCMPC,XCMPD(额外的比较寄存器)XMINMAX(用于输入捕获事件逻辑)两种加载模式LOADONCE vs LOADMULTIPLE加载行为由XLOADCTL[LOADMODE]位控制。LOADONCE模式 (LOADMODE0)行为每次你通过软件写XLOAD[STARTLD]1来触发加载时硬件都会从同一个指定的阴影缓冲区由XLOADCTL[SHDWBUFPTR_LOADONCE]选择例如指向SHDW2加载数据到活动寄存器。指针管理SHDWBUFPTR_LOADONCE这个指针不会自动变化需要软件在每次触发加载前手动更新它来选择下一次加载哪个缓冲区的数据。适用场景适用于非周期性的、由事件触发的波形切换。比如当检测到过流故障后切换到一组特定的“保护模式”PWM参数。LOADMULTIPLE模式 (LOADMODE1)行为这是更常用的“自动播放”模式。你通过一次写STARTLD1来启动一个加载序列。硬件会按照SHDW3 - SHDW2 - SHDW1的顺序如果SHDWLEVEL3在每个PWM周期开始时TBCTR0之前3个时钟自动将下一个缓冲区的数据加载到活动寄存器。指针管理SHDWBUFPTR_LOADMULTIPLE是一个自动递减的指针。启动后它从SHDWLEVEL值例如3开始每完成一个周期加载就减1直到减到1指向SHDW1。此后它会一直使用SHDW1的数据直到你再次写STARTLD启动新一轮加载。缓冲重复SHDW2和SHDW3还可以配置重复次数RPTBUF2PRD,RPTBUF3PRD最多8次。这意味着你可以让SHDW3的数据生效连续N个周期然后自动切换到SHDW2生效M个周期最后锁定在SHDW1。这非常适合生成重复性的波形序列比如特定谐波消除所需的特定脉冲模式。加载时机非常重要阴影到活动的加载发生在TBCTR等于零事件前的第3个系统时钟周期。这保证了新旧波形数据在周期边界干净利落地切换没有毛刺或中间状态。XMINMAX,XCMPC,XCMPD的加载则发生在TBCTR等于周期值PRD的时刻。配置流程与避坑指南初始化顺序先配置XLOADCTL选择模式、缓冲深度、重复次数再填充SHDW缓冲区的数据最后使能XCMP模式并触发加载。数据一致性在填充阴影缓冲区时确保XTBPRD、XCMPn、XAQCTLn这些值是针对同一个PWM周期设计好的、自洽的一组参数。错误的组合会导致波形混乱。全局加载链接多个ePWM模块可以通过EPWMXLINKXLOAD寄存器链接起来让它们在同一时刻开始各自的阴影加载序列这对于多相并联电源的同步至关重要。调试观察在调试时除了看输出波形一定要通过CCS的寄存器观察窗口监控XLOADCTL[SHDWBUFPTR]的变化以及SHDWxFULL状态位确认阴影加载是否按预期进行。2.4 XCMP操作流程与最小脉冲宽度约束配置好了怎么让它跑起来以下是核心操作流程基础ePWM配置配置时基模块TB为增计数模式设置好TBPRD周期。切记关闭同步输入。使能与分配XCMP设置XCMPCTL1.XCMPEN1使能模式。根据需求配置XCMPSPLIT、CMPA_ALLOC、CMPB_ALLOC。配置动作限定器在XAQCTLA和XAQCTLB中为每一个你将用到的XCMPn匹配事件定义动作置高、拉低、翻转。这是“雕刻”波形的刻刀。配置阴影加载选择LOADMODE设置SHDWLEVEL通常为3如需重复则设置RPTBUFxPRD。填充SHDW3, SHDW2, SHDW1缓冲区。触发加载写XLOAD[STARTLD]1。硬件会自动开启加载序列。运行时更新在波形运行过程中CPU可以在后台计算未来的波形数据并写入到当前未使用的阴影缓冲区中通过监控SHDWxFULL状态位判断哪个缓冲区空闲等待下一轮加载序列启动。最小脉冲宽度约束 手册中特别强调相邻的XCMP值之间必须保持至少4个TBCLK周期的差值如果使用了HRPWM的高分辨率部分这个差值需要包含HR分量。为什么这是硬件比较器、动作逻辑和信号路径的物理延迟要求。如果不满足可能导致脉冲无法正常产生或者产生极窄的、无法被驱动的脉冲损坏功率器件。如何计算假设TBCLK 100MHz (10ns)那么XCMP(n1) - XCMP(n) 4。如果你在XCMPn中使用了高分辨率部分比如CMPAHR0x80代表半个时钟周期那么计算差值时需要将高分辨率部分转换为等效的TBCLK计数确保总差值大于4个时钟周期。检查工具在软件中写入XCMP值前必须做差值校验。可以写一个封装函数在设置XCMP序列时自动检查并报错。3. HRPWM高分辨率技术突破时间精度极限3.1 HRPWM的原理与性能提升当PWM频率上升到几百kHz甚至MHz时传统基于系统时钟计数的PWM分辨率会急剧下降。分辨率比特数的计算公式是Log2(PWM周期 / 系统时钟周期)。例如在200kHz的PWM频率和100MHz的系统时钟下分辨率约为9比特即最小占空比步进约为1/512 ≈ 0.2%。这对于追求极致效率的现代开关电源来说可能不够精细。HRPWM的核心理念是用时间插值替代整数计数。它在一个粗粒度的系统时钟周期内通过一个叫做微边沿定位器MEP的模拟/数字混合电路进一步细分出数百个更小的时间步进Step。每个MEP步进的大小在皮秒量级例如AM261x典型值为180ps。性能对比 假设系统时钟为100MHz周期10nsMEP步进为180ps。传统PWM在200kHz下分辨率 Log2(5000ns / 10ns) ≈ Log2(500) ≈ 9比特。HRPWM在200kHz下一个PWM周期内包含的MEP步进数 5000ns / 0.18ns ≈ 27778个。分辨率 Log2(27778) ≈ 14.8比特。可以看到分辨率从9比特提升到了近15比特最小占空比调节能力从0.2%提升到了0.004%提升了近50倍这在需要精细电压调节或低谐波失真的场合至关重要。3.2 MEP工作机制与寄存器配置MEP逻辑需要与传统的PWM寄存器协同工作。它通过一组8位或7位的高分辨率扩展寄存器来工作CMPAHR(8位): 对应CMPA的高分辨率部分。CMPBHR(8位): 对应CMPB的高分辨率部分。TBPHSHR(8位): 对应TBPHS时基相位的高分辨率部分。TBPRDHR(8位): 对应TBPRD周期的高分辨率部分。部分器件支持DBREDHR(7位),DBFEDHR(7位): 对应死区上升沿/下降沿延迟的高分辨率部分。这些扩展寄存器与它们对应的16位主寄存器如CMPA共同组成一个24位的“复合”比较值。其中高16位是粗调Coarse由主寄存器控制单位是系统时钟周期低8位是微调Fine由扩展寄存器控制单位是MEP步进。关键配置寄存器HRCNFG 这个寄存器是HRPWM的大脑需要仔细配置HRCNFG[EDGMODE](边沿模式)00- 高分辨率禁用。01- 仅在上升沿启用高分辨率用于占空比控制。10- 仅在下降沿启用高分辨率用于占空比控制。11- 在双边沿启用高分辨率用于相位控制或周期控制。HRCNFG[CTLMODE](控制模式)0- 由CMPAHR/CMPBHR控制占空比高分辨率模式。1- 由TBPHSHR控制相位高分辨率模式。当器件支持TBPRDHR时还有专门的周期控制模式。HRCNFG[SHDWBMODE](阴影模式)决定高分辨率扩展寄存器何时从阴影加载到活动寄存器。通常设置为与对应的主寄存器如CMPA同步。HRCNFG[HRB_MODE](B通道高分辨率模式)控制B通道如何获得高分辨率能力。可以是独立控制CMPBHR、链接到A通道CMPAHR或者通过A通道反相获得。HRCNFG[AUTOCONV](自动转换模式)这是最重要的位之一。1启用在此模式下你只需要向CMPAHR写入目标占空比的小数部分Q8格式即小数部分左移8位。MEP校准模块HRCAL会自动读取HRMSTEP寄存器中的MEP比例因子由SFO软件后台计算并完成小数部分 * MEP比例因子的计算最终控制边沿位置。这是推荐模式大大简化了软件计算。0禁用你需要自己在软件中完成上述计算并将结果写入CMPAHR。这要求你实时获取准确的HRMSTEP值并处理浮点或定点运算复杂且容易出错。3.3 SFO软件与MEP比例因子MEP的步进大小例如180ps是一个工艺、电压、温度PVT相关的参数不是固定值。因此TI提供了比例因子优化软件SFO Scale Factor Optimizing software通常以库函数如SFO()的形式提供。SFO的作用在线校准SFO函数会在后台行向HRPWM模块发送测试模式测量出在当前芯片工况下一个系统时钟周期内包含多少个MEP步进。这个数值就是MEP比例因子MEP Scale Factor被更新到HRMSTEP寄存器中。支持自动转换当AUTOCONV1时HRPWM硬件会直接使用HRMSTEP的值自动将你写入的CMPAHR占空比小数转换为实际的MEP步进数。使用SFO的要点初始化调用在ePWM和HRPWM模块初始化后需要调用一次SFO()进行初始校准。周期性调用由于PVT会漂移建议在后台任务中每隔几十到几百毫秒调用一次SFO()以更新HRMSTEP确保精度。调用频率取决于应用对环境稳定性的要求。检查状态SFO()函数会返回一个状态指示校准是否成功SFO_ERROR或SFO_COMPLETE。在校准完成前不要依赖HRPWM输出。链接CMPBHR在Type 5 ePWM中可以通过CMPCTL.LINKDUTYHR位将CMPBHR链接到CMPAHR。这样你只需要配置CMPAHRB通道会自动获得相同的高分辨率延时。这在互补对称输出如半桥中非常有用可以确保上下管驱动信号的死区时间也具有高分辨率精度。3.4 HRPWM与XCMP的协同工作这是AM261x ePWM的终极玩法。XCMP提供了波形复杂度HRPWM提供了边沿精度二者结合可以生成极其精确和复杂的PWM序列。协同配置要点寄存器配对在XCMP模式下每个XCMPn寄存器都对应一个XCMPnHR高分辨率扩展部分。当你通过CMPA:HR写入XCMP值时实际上是在同时设置XCMPn的粗调值和XCMPnHR的微调值。阴影加载同步XCMPn和XCMPnHR的阴影加载是同步的。当你配置三缓冲机制加载一组新的XCMP序列时对应的高分辨率微调值也一并被加载。最小脉冲宽度如前所述在同时使用HRPWM时计算XCMPn之间的间隔必须将高分辨率部分考虑进去。间隔必须大于4个TBCLK周期粗调微调换算后。配置顺序建议先配置和校准HRPWM包括调用SFO确保高分辨率功能正常工作。然后再配置XCMP模式及其阴影加载。这样可以避免在复杂模式下定位问题。4. 输入捕获与MIN-MAX事件逻辑解析虽然项目正文主要聚焦于XCMP和HRPWM的输出生成但与之紧密相关的输入捕获DCCAP和MIN-MAX事件逻辑也是高级应用的重要组成部分尤其在数字电源的峰值电流控制、频率测量等场景中。4.1 输入信号检测与路径选择输入捕获逻辑的源头是CAPIN和CAPGATE这两个信号它们都来自EPWM X-BAR交叉开关可以灵活地映射到芯片的任意一个GPIO或内部事件。CAPIN信号这是待检测边沿的主信号。例如你可以将电流采样的比较器输出接到这里用于捕获电流过零或峰值时刻。CAPGATE信号这是一个门控信号用于在特定时间窗口内使能或禁用对CAPIN的捕获。例如在开关管导通的区间内才开启电流采样捕获以避免开关噪声干扰。信号的选择通过多路复用器完成CAPTRIPSEL[CAPINCOMPSEL]选择CAPIN信号的来源从多个X-BAR输入中选一个。CAPINTRIPSEL进一步对CAPIN源进行选择或逻辑组合如与DCAEVT等事件结合。CAPGATETRIPSEL选择CAPGATE信号的来源。CAPCTL[SRCSEL]选择CAPIN.sync信号的最终来源是直接使用CAPIN还是经过数字比较滤波器DCEVTFILT处理后的信号。边沿检测与滤波 选定的CAPIN信号会经过边沿检测逻辑其极性由CAPCTL[CAPINPOL]配置上升沿、下降沿或双边沿。为了抗噪声还可以通过DCFCTL[EDGEFILTSEL]配置数字滤波器只有在信号稳定持续若干个时钟周期后边沿事件才被确认。4.2 MIN-MAX可编程窗口捕获机制这是输入捕获的精髓所在它不是一个简单的边沿触发而是一个基于时间窗口的智能捕获。工作原理窗口定义通过XMINMAX寄存器的XMIN和XMAX字段定义一个时间窗口。这个窗口的加载时机与XCMP寄存器同步同样支持三缓冲。监控使能捕获电路可以通过DCCAPCTL[CAPE]位全局使能也可以通过CAPGATE信号在局部时间段内使能。捕获流程当时基计数器TBCNT的值等于XMIN时硬件开始监控CAPIN信号等待其发生预设的边沿事件。如果在TBCNT到达XMAX之前等到了CAPIN的边沿则产生一个捕获事件CAPEVT并可配置中断。这表示信号在预期窗口内出现。如果在TBCNT到达XMAX时仍未检测到CAPIN边沿则CAPEVT也会被置位但此时它表示的是“超时未捕获”事件。这非常有用例如可以用于检测是否发生欠流或信号丢失故障。窗口边界处理手册提到了一个高级特性XMAX可以小于XMIN。这意味着时间窗口可以跨越PWM周期的边界。例如TBPRD100,XMIN95,XMAX5定义了一个从95到100再从0到5的窗口。这在检测靠近周期末尾发生的事件时非常方便。与XCMP的联动XMINMAX寄存器也存放在SHDW1/2/3缓冲区中并与XCMP值同步加载。这意味着你可以为未来连续的几个PWM周期预定义不同的捕获窗口。例如在SVPWM的每个扇区电流采样的最佳窗口位置是不同的你可以提前配置好实现全数字化的、无CPU干预的精准采样。5. 实战配置示例与常见问题排查5.1 示例生成一个带死区的三脉冲PWMA通道假设我们需要在A通道上生成一个周期为1000 TBCLK计数在一个周期内包含三个脉冲的波形同时使用HRPWM进行高精度边沿定位。步骤1基础与HRPWM配置// 1. 配置时基模块 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 增计数模式XCMP必须 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 必须禁用同步 EPwm1Regs.TBPRD 1000; // 周期值 // 2. 配置HRPWM (假设使用CMPAHR控制上升沿高分辨率) EPwm1Regs.HRCNFG.all 0x0; EPwm1Regs.HRCNFG.bit.EDGMODE HR_FEP; // 下降沿高分辨率 (也可用上升沿) EPwm1Regs.HRCNFG.bit.CTLMODE HR_CMP; // 由CMPAHR控制 EPwm1Regs.HRCNFG.bit.HRLOAD HR_CTR_ZERO; // 在CTRZERO时加载阴影 EPwm1Regs.HRCNFG.bit.AUTOCONV 1; // 启用自动转换简化软件 // 3. 调用SFO库函数进行初始校准 (需链接SFO库) int sfo_status; sfo_status SFO(); // 调用一次可在循环中定期调用 while(sfo_status ! SFO_COMPLETE) { // 等待校准完成或处理错误 }步骤2配置XCMP模式与分配// 4. 配置XCMP控制寄存器 EPwm1Regs.XCMPCTL1.all 0x0; EPwm1Regs.XCMPCTL1.bit.XCMPEN 1; // 使能XCMP模式 EPwm1Regs.XCMPCTL1.bit.XCMPSPLIT 0; // 所有XCMP给A通道 EPwm1Regs.XCMPCTL1.bit.CMPA_ALLOC 6; // 使用XCMP1-6 (共6个边沿3个脉冲) // 5. 配置动作限定器 (XAQCTLA) // 假设我们要的波形低电平开始在XCMP1变高XCMP2变低XCMP3变高XCMP4变低XCMP5变高XCMP6变低。 // 每个XCMP匹配时的动作 EPwm1Regs.XAQCTLA.bit.XCMP1ACTION AQ_SET; // XCMP1匹配时置高 EPwm1Regs.XAQCTLA.bit.XCMP2ACTION AQ_CLEAR; // XCMP2匹配时拉低 EPwm1Regs.XAQCTLA.bit.XCMP3ACTION AQ_SET; EPwm1Regs.XAQCTLA.bit.XCMP4ACTION AQ_CLEAR; EPwm1Regs.XAQCTLA.bit.XCMP5ACTION AQ_SET; EPwm1Regs.XAQCTLA.bit.XCMP6ACTION AQ_CLEAR; // XCMP7ACTION, XCMP8ACTION 保持为0 (AQ_NO_ACTION)步骤3配置阴影加载与填充数据// 6. 配置阴影加载控制 (使用LOADMULTIPLE模式3级缓冲) EPwm1Regs.XLOADCTL.all 0x0; EPwm1Regs.XLOADCTL.bit.LOADMODE LOADMULTIPLE_MODE; EPwm1Regs.XLOADCTL.bit.SHDWLEVEL 3; // 使用3级缓冲 // 假设不需要重复RPTBUF2PRD/RPTBUF3PRD保持为0 // 7. 填充SHDW3, SHDW2, SHDW1缓冲区的数据 (以SHDW1为例) // 注意通过写入CMPA:HR来设置XCMP1:XCMP1HR等。需要先计算粗调值(CMPA)和微调值(CMPAHR)。 // 假设我们想要三个脉冲的边沿位置(以TBCLK计数为单位): 上升沿100, 下降沿150; 上升沿400, 下降沿450; 上升沿700, 下降沿750。 // 同时我们想要第二个脉冲的下降沿有0.25个TBCLK的高分辨率延时。 // 首先禁用影子加载直接写活动寄存器进行测试会更直观但这里演示影子缓冲写法。 // 写入SHDW1缓冲区的CMPA:HR (对应XCMP1-XCMP6) // 寄存器映射: CMPA:HR 写入操作会根据 XCMPCTL1.CMPA_ALLOC 自动填充到 XCMP1_ACTIVE:HR ... XCMP6_ACTIVE:HR // 但为了清晰我们假设通过特定函数或寄存器位域来分别设置。实际上可能需要通过结构体或位域访问。 // 以下为伪代码示意过程 // 计算高分辨率部分 (Q8格式0x80代表0.5个TBCLK)。假设MEP比例因子已由SFO计算好。 // 对于普通边沿高分辨率部分为0。 // 对于第二个脉冲下降沿(对应XCMP4)我们想要0.25个TBCLK的延时。 // 在AUTOCONV模式下CMPAHR 期望的小数部分 * 256。 // 0.25 * 256 64 0x40。 uint16_t cmp_coarse_values[6] {100, 150, 400, 450, 700, 750}; // 粗调值 uint16_t cmp_fine_values[6] {0, 0, 0, 0x40, 0, 0}; // 微调值仅XCMP4有 // 填充到阴影缓冲区需要操作特定的影子寄存器组这通常由TI的驱动库提供API。 // 例如可能是 EPwm1Regs.SHDW1.CMPAHR1 之类的结构。这里需要查阅具体的数据手册和库文件。 // 假设我们有一个函数 writeXcmpShadowBuffer(shadow_buf_num, xcmp_index, coarse_val, fine_val); for(int i0; i6; i) { writeXcmpShadowBuffer(SHADOW_BUF_1, i1, cmp_coarse_values[i], cmp_fine_values[i]); } // 同样设置SHDW2和SHDW3的数据可以是不同的波形模式 // 8. 触发阴影加载 EPwm1Regs.XLOAD.bit.STARTLD 1; // 启动加载序列硬件会自动按SHDW3-2-1的顺序加载5.2 常见问题与排查技巧问题使能XCMP后没有PWM输出。检查1计数器模式。确认TBCTL.CTRMODE是否为TB_COUNT_UP增计数。XCMP不支持其他模式。检查2同步输入。确认TBCTL.SYNCOSEL是否设置为TB_SYNC_DISABLE。XCMP模式下必须禁用。检查3动作配置。检查XAQCTLA和XAQCTLB是否为用到的XCMPn配置了有效的动作AQ_SET,AQ_CLEAR,AQ_TOGGLE。默认是AQ_NO_ACTION。检查4输出使能。确认AQCTLA.bit.ZRO等传统动作是否被意外配置可能会覆盖XCMP输出。在纯XCMP模式下这些应设为AQ_NO_ACTION。问题波形混乱边沿位置不对或脉冲丢失。检查1最小脉冲宽度。使用调试器或打印所有XCMPn的值计算相邻XCMP的差值。确保XCMP(n1) - XCMP(n) 4如果用了HRPWM需换算总时间。检查2阴影加载指针。监控XLOADCTL[SHDWBUFPTR]和SHDWxFULL标志。确认数据是否按预期SHDW3-2-1加载到了活动寄存器。可能软件加载了数据但未触发STARTLD或者LOADMODE配置错误。检查3HRPWM干扰。如果同时使用HRPWM检查CMPAHR等扩展寄存器的值是否正确。错误的HR值会导致边沿严重偏移。确认HRCNFG.AUTOCONV设置是否符合你的写入习惯。问题HRPWM边沿抖动或不精确。检查1SFO状态。定期检查SFO()函数的返回值确保MEP比例因子HRMSTEP被成功校准和更新。在温度变化大的环境中需要更频繁地调用SFO。检查2电源噪声。HRPWM的皮秒级精度对电源纹波非常敏感。确保芯片的模拟电源VDDA和数字电源干净、稳定并遵循数据手册的PCB布局建议特别是HRPWM相关引脚的走线。检查3时钟稳定性。确保EPWMxCLK的时钟源稳定抖动小。问题使用LOADMULTIPLE模式时波形在几个周期后停止变化。检查这是正常行为。在LOADMULTIPLE模式下当阴影缓冲区指针SHDWBUFPTR递减到1后会一直使用SHDW1的数据直到下一次软件写STARTLD1触发新的加载序列。如果你需要循环不同的波形需要在每次指针到达1后重新填充SHDW2/SHDW3缓冲区并再次触发STARTLD。问题输入捕获事件CAPEVT不触发或误触发。检查1信号路径。使用示波器确认CAPIN和CAPGATE信号是否确实到达了ePWM模块的引脚并通过EPWM X-BAR正确路由。检查2MIN-MAX窗口。确认XMIN和XMAX的值设置合理且TBCNT确实能运行到该区间。检查XMINMAX是否成功从阴影缓冲区加载其加载与XCMP同步。检查3边沿极性。确认CAPCTL[CAPINPOL]设置的边沿极性与你实际的信号边沿匹配。检查4数字滤波。如果信号有噪声可以适当启用并配置DCFCTL[EDGEFILTSEL]进行滤波但注意滤波会引入几个时钟周期的延迟。