深入解析C2000 eHRPWM:从寄存器到电机控制实战

深入解析C2000 eHRPWM:从寄存器到电机控制实战
1. 项目概述与eHRPWM核心价值在电机控制、数字电源或者任何需要精确控制能量输出的嵌入式系统里PWM脉冲宽度调制技术是工程师手中的“瑞士军刀”。我们通过调节一个方波信号高电平的持续时间脉宽占整个周期的比例占空比就能等效地控制平均电压或电流从而驱动电机转速、调节LED亮度或是稳定电源输出电压。然而当你的项目对效率、精度和响应速度的要求越来越高时通用定时器生成的PWM往往就显得力不从心了——分辨率不够导致电机抖动、死区时间控制不精准引发桥臂直通风险、多路PWM同步困难造成系统噪声。这时你就需要像德州仪器TIC2000系列微控制器中集成的增强型高分辨率PWMeHRPWM模块这样的专业选手登场。eHRPWM远不止是一个能产生PWM的定时器。它是一个高度集成化、可灵活配置的“PWM生成引擎”将整个波形生成、保护和管理的流程拆解为多个专注的子模块并通过一套精密的寄存器体系进行控制。理解这套架构就像理解一台精密仪器的内部构造你才能从“会配置参数”进阶到“能设计系统”。本文将带你深入eHRPWM的寄存器世界和子模块架构从最底层的寄存器位定义到各子模块如时间基准TB、计数器比较CC如何协同工作的逻辑并结合实际配置代码和避坑经验为你呈现一份从原理到实战的深度解析。无论你是在调试一台伺服驱动器还是在设计一个高功率密度的数字电源掌握eHRPWM的配置精髓都能让你的系统性能和控制精度提升一个档次。2. eHRPWM整体架构与寄存器地图解析在开始配置任何一个子模块之前我们必须先拿到eHRPWM的“地图”——寄存器映射表。这张表告诉你所有控制开关的位置和功能。根据TI的技术手册每个ePWM模块实例都有一套完整的寄存器组它们按功能被清晰地划分到各个子模块下。2.1 寄存器分组与寻址逻辑eHRPWM的寄存器不是杂乱无章地堆在一起而是严格按照子模块进行分组。例如所有与控制时间基准计数器相关的寄存器如TBCTL控制、TBSTS状态、TBPHS相位、TBPRD周期都被归在“Time-Base Submodule Registers”组里。这种分组方式非常符合我们的编程和调试思维当我想调整PWM频率时我就去时间基准组的寄存器里操作当我想设置占空比时我就去找计数器比较组的CMPA和CMPB。每个ePWM模块例如EPWM1, EPWM2...在内存中都有自己独立的寄存器文件起始地址。在编程时我们通常会通过TI提供的驱动程序库如driverlib中定义的结构体指针例如EPWM_Regs*来访问这些寄存器。这些结构体的成员变量名称与手册中的寄存器缩写名一一对应这极大地方便了我们的代码编写和阅读。例如EPwm1Regs.TBCTL就对应着EPWM1模块的时间基准控制寄存器。注意在查阅寄存器表时要特别注意“Shadow”这一列。标记为“Yes”的寄存器如TBPRD,CMPA,CMPB具有影子寄存器功能。这意味着你写入的值不会立即生效去影响硬件波形而是先存入一个缓冲寄存器影子寄存器在特定的、安全的时刻如计数器为零或达到周期值时才会自动加载到活动寄存器中。这个机制是防止在PWM周期中间修改关键参数导致输出毛刺或异常的关键设计务必在编程时理解其加载机制。2.2 关键寄存器功能速览为了让你快速建立印象我将核心子模块的几个关键寄存器及其作用整理如下表。在后续深入每个子模块时我们会再详细拆解它们的每一个配置位。子模块寄存器缩写寄存器全称核心作用简述时间基准 (TB)TBCTLTime-Base Control Register配置计数器模式增/减/增减、时钟分频、同步使能等全局模式。TBPRDTime-Base Period Register设置PWM的周期值是决定PWM频率的核心参数。TBPHSTime-Base Phase Register设置相位寄存器用于实现多个PWM模块之间的波形相位差。计数器比较 (CC)CMPCTLCounter-Compare Control Register控制CMPA/CMPB影子寄存器的加载模式和时机。CMPACounter-Compare A Register设置与EPWMxA输出相关的比较值直接影响A路输出的占空比或开关点。CMPBCounter-Compare B Register设置与EPWMxB输出相关的比较值用于控制B路输出或辅助事件。动作限定器 (AQ)AQCTLAAction-Qualifier Control Reg for A定义当CTRCMPA,CTRPRD等事件发生时EPWMxA输出要执行的动作置高、置低、翻转。AQCTLBAction-Qualifier Control Reg for B定义事件发生时EPWMxB输出要执行的动作。死区发生器 (DB)DBCTLDead-Band Control Register配置死区生成模式、输出极性等。DBREDRising Edge Delay Register设置上升沿延迟的计数值。DBFEDFalling Edge Delay Register设置下降沿延迟的计数值。事件触发 (ET)ETSELEvent-Trigger Selection Register选择哪些事件如CTRPRD,CTRCMPA可以触发中断。ETPSEvent-Trigger Pre-Scale Register设置事件触发中断的预分频每1次、每2次...事件才触发一次中断。这张表是你配置eHRPWM的“菜单”。接下来我们就从最重要的“厨房”——时间基准子模块开始看看如何准备这顿PWM“大餐”的基础时序。3. 时间基准TB子模块PWM节拍器的核心你可以把时间基准子模块想象成整个eHRPWM系统的“心脏”或“节拍器”。它产生一个基础的、不断循环的计数序列TBCNT所有其他子模块的动作比较、输出动作、产生中断都以此计数器的值为基准来触发。因此理解并正确配置TB模块是生成稳定、准确PWM波形的第一步。3.1 计数器模式与PWM频率计算TB模块的核心是一个16位的向上/向下计数器TBCNT。它的计数模式由TBCTL[CTRMODE]位决定直接决定了你生成的是对称PWM还是非对称PWM也决定了PWM频率的计算公式。1. 递增计数模式 (TB_COUNT_UP)工作方式计数器从0开始每个TBCLK时钟加1直到等于周期值TBPRD然后立即复位到0重新开始。波形特性生成非对称PWM。波形事件如比较点只在每个周期内出现一次。频率公式PWM频率 TBCLK频率 / (TBPRD 1)典型应用简单的LED调光、蜂鸣器驱动等对波形对称性无要求的场合。2. 递减计数模式 (TB_COUNT_DOWN)工作方式计数器从TBPRD值开始每个TBCLK时钟减1直到等于0然后立即重载为TBPRD重新开始。波形特性同样生成非对称PWM。频率公式与递增模式相同PWM频率 TBCLK频率 / (TBPRD 1)应用场景与递增模式类似但某些特定算法或与其他模块配合时递减逻辑可能更直观。3. 递增-递减计数模式 (TB_COUNT_UPDOWN)工作方式计数器从0开始递增到TBPRD然后立即转向递减回0如此循环。波形特性生成对称PWM中心对齐PWM。每个PWM周期内比较事件会触发两次一次在递增过程一次在递减过程这能有效减少谐波分量。频率公式PWM频率 TBCLK频率 / (2 * TBPRD)典型应用电机控制如FOC算法和全桥/半桥电源拓扑的绝佳选择。对称PWM可以显著降低电机噪音和电源的电磁干扰EMI。配置示例与计算 假设系统时钟SYSCLKOUT 100MHz我们希望生成一个20kHz的对称PWM用于电机控制。首先设置TBCTL[HSPCLKDIV]和TBCTL[CLKDIV]决定TBCLK的分频。为了获得较高的计数器分辨率我们通常先不分频或低分频。这里设为TB_DIV1即TBCLK SYSCLKOUT 100MHz。选择TB_COUNT_UPDOWN模式。计算TBPRDTBPRD TBCLK频率 / (2 * PWM频率) 100e6 / (2 * 20e3) 2500。将TBPRD 2500写入寄存器。// 假设使用TI的driverlib库 EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_CLOCK_DIVIDER_1); // TBCLK SYSCLKOUT EPWM_setTimeBasePeriod(EPWM1_BASE, 2500); // 设置周期值 EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 设置为增减模式 EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // 计数器从0开始实操心得在电机控制中我强烈建议使用递增-递减模式。除了降低EMI它还有一个巨大优势在计数器达到峰值TBPRD和谷底0时都会产生CTRPRD和CTR0事件。这为同步ADC采样例如在PWM周期中点或终点进行电流采样提供了非常方便且对称的时间点简化了控制环路的设计。3.2 时钟同步与相位控制在复杂的多轴运动控制或多相交错并联电源中我们经常需要多个PWM模块协同工作它们的波形可能需要严格同步或者保持特定的相位差。eHRPWM的TB模块提供了强大的同步链机制。同步链每个ePWM模块都有一个同步输入EPWMxSYNCI和一个同步输出EPWMxSYNCO。通常EPWM1的同步输入来自外部引脚或特定同步源而EPWM2的同步输入可以连接到EPWM1的同步输出以此类推形成一个链式结构。通过配置TBCTL[SYNCOSEL]你可以选择本模块的同步输出信号源可以是输入同步信号、CTR0事件或CTRCMPB事件。相位控制这是实现多相PWM如三相逆变器的关键。通过设置TBPHS相位寄存器和使能TBCTL[PHSEN]当模块收到同步输入脉冲时其计数器TBCNT不会复位而是会被加载为TBPHS的值。这样该模块的PWM波形就相对于同步源产生了一个固定的相位偏移。配置示例假设我们使用EPWM1作为主模块EPWM2作为从模块希望EPWM2的波形滞后于EPWM190度即1/4周期。配置EPWM1为递增-递减模式TBPRD 1000。设置EPWM1的SYNCOSEL为CTR0这样每当EPWM1的计数器回到0时它就产生一个同步输出脉冲。配置EPWM2同样为递增-递减模式TBPRD 1000。使能EPWM2的相位加载PHSEN1并设置TBPHS 250因为1000的1/4是250。设置EPWM2的同步输入源为EPWM1的输出。当EPWM1计数器归零并发出同步脉冲时EPWM2的计数器会被强制设置为250从而其整个波形周期相对于EPWM1延迟了1/4。// 配置EPWM1为主模块 EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); // 配置EPWM2为从模块并设置相位滞后 EPWM_setPhaseShift(EPWM2_BASE, 250); EPWM_syncPhaseShift(EPWM2_BASE); // 使能相位加载 EPWM_setSyncInPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_EXTERNAL); // 假设硬件上已连接避坑指南同步和相位加载功能非常强大但配置不当会导致灾难。一个常见的坑是在计数器运行过程中修改TBPHS寄存器。如果影子寄存器未使能修改会立即生效可能导致计数器跳变产生非预期的脉冲。安全的做法是1) 在初始化、计数器停止时配置相位值2) 如果必须动态调整确保使用影子寄存器功能但TBPHS通常没有影子寄存器需格外小心并在安全时刻如下一个同步事件到来前更新。3.3 影子寄存器机制深度解析前面提到TBPRD有影子寄存器这是eHRPWM稳定性的重要保障。我们通过TBCTL[PRDLD]位来控制其加载模式。PRDLD0影子模式默认软件写入TBPRD地址的值实际是写入了影子寄存器。硬件会在CTR0的时刻自动将影子寄存器的值加载到活动寄存器中。这意味着你可以在任何时刻安全地更新周期值而不会打断当前正在输出的PWM周期。PRDLD1立即加载模式写入操作直接修改活动寄存器立即影响下一个计数时钟沿的周期比较。这可能会在当前周期内造成毛刺或周期长度突变除非有特殊需求如特定类型的频率突变否则不推荐使用。为什么需要影子寄存器想象一下你在开车时突然换挡如果换挡过程与发动机冲程不同步就会产生顿挫甚至损坏。PWM生成也一样在周期中间改变TBPRD相当于突然改变跑道的长度计数器可能会产生混乱的比较事件导致输出脉冲宽度异常。影子寄存器机制确保了参数更新与硬件时序的“同步换挡”。4. 计数器比较CC子模块PWM占空比的画笔如果说TB模块定义了画布的尺寸周期那么CC模块就是决定在哪里落笔产生跳变沿的画笔。它通过CMPA和CMPB这两个比较寄存器在TB计数器运行的“时间轴”上打上标记从而精确控制波形的关键时间点。4.1 CMPA与CMPB的角色与配置CMPA和CMPB是两个独立的16位比较寄存器。它们的核心功能是持续将自身的值与时间基准计数器TBCNT的值进行比较当两者相等时分别产生CTRCMPA和CTRCMPB事件。这些事件被送到后续的动作限定器AQ子模块最终决定PWM输出引脚EPWMxA和EPWMxB的电平变化。占空比计算对于递增计数模式占空比 CMPA / (TBPRD 1)。例如TBPRD999,CMPA300则占空比约为30%。对于递减计数模式占空比 (TBPRD - CMPA) / (TBPRD 1)。注意比较值的意义相反。对于递增-递减计数模式情况稍复杂。通常我们通过AQ模块的配置让CMPA在递增和递减过程中分别触发不同的动作如递增时置高递减时置低从而生成一个对称的PWM脉冲。此时脉冲宽度与CMPA值相关但占空比计算不再是简单的除法。脉冲的开始点和结束点由CMPA在递增和递减过程中触发的事件决定。影子寄存器与加载点CMPA和CMPB也拥有影子寄存器由CMPCTL[SHDWAMODE]和CMPCTL[SHDWBMODE]控制。更重要的是CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]决定了影子寄存器值加载到活动寄存器的时机CTRPRD在计数器达到周期值时加载。CTR0在计数器归零时加载。CTRPRD or CTR0在以上两个事件任一发生时加载。配置策略在电机控制等实时性要求高的应用中我们通常采用**CTRPRD或CTR0时加载**。这样在一个PWM周期开始时新的比较值就已就位确保整个新周期的波形都是基于新参数生成的避免了在一个周期内波形不一致的问题。这对于实现平滑的占空比变化至关重要。4.2 不同计数模式下的比较事件特性理解CC事件在不同计数模式下的行为是正确配置AQ模块的前提。递增/递减模式在一个PWM周期内CTRCMPA和CTRCMPB事件各发生一次。这很直观。递增-递减模式这是最容易错的地方。如果CMPA的值在0和TBPRD之间不包括0和TBPRD那么在一个完整的增减周期内CTRCMPA事件会发生两次一次在递增过程中CTR从0向上经过CMPA时一次在递减过程中CTR从TBPRD向下经过CMPA时。CTRCMPB事件同理。这个特性正是生成对称PWM的基础。我们可以配置AQ模块让递增过程中的CTRCMPA事件将输出置高递减过程中的CTRCMPA事件将输出置低这样就产生了一个以周期中心为对称点的脉冲。配置示例生成一个中心对称的PWM// 假设已配置TB模块为增减模式TBPRD1000 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 300); // 设置CMPA300 // 配置AQ模块详见下一章 // 当 CTR 递增且等于 CMPA 时将 EPWMxA 置高 (AQ_SET on CAU) EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 当 CTR 递减且等于 CMPA 时将 EPWMxA 置低 (AQ_CLEAR on CAD) EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);这段配置会产生一个脉冲在TBCNT从0递增到300时输出变高在TBCNT从1000递减到300时输出变低。脉冲在周期内是对称的。常见问题排查“我修改了CMPA的值但PWM输出占空比没有变化”首先检查CMPCTL[SHDWAMODE]是否为影子模式。如果是检查LOADAMODE设置的加载事件是否已发生。一个高效的调试方法是在调试器中单步运行在修改CMPA影子寄存器后手动触发一个CTR0或CTRPRD事件例如通过强制同步或者等待一个完整的PWM周期过去再观察输出。其次确认你修改的是正确的寄存器。有些库函数可能直接操作活动寄存器有些则操作影子寄存器务必查阅库函数说明。5. 动作限定器AQ与死区DB子模块从事件到安全波形CC模块产生了“何时”的事件而AQ模块则定义了“做什么”的动作。DB模块则是在此基础上为桥式电路如H桥、半桥增加至关重要的安全延迟。5.1 动作限定器AQ事件到动作的翻译官AQ模块接收来自TB模块的CTRPRD、CTR0事件以及来自CC模块的CTRCMPA、CTRCMPB事件。对于每一个输出通道EPWMxA和EPWMxBAQ模块都有一组独立的控制寄存器AQCTLA,AQCTLB来定义当某个特定事件发生时对应的输出引脚应该执行什么动作。可执行的动作AQ_NO_ACTION无动作。AQ_CLEAR将输出置为低电平。AQ_SET将输出置为高电平。AQ_TOGGLE将输出电平翻转。关键配置思路AQ的配置逻辑是eHRPWM编程中最体现“设计”的部分。你需要根据想要的PWM波形逆向思考在每个关键时间点事件需要什么动作。以生成一个简单的递增计数模式PWM为例假设使用EPWMxA高电平有效目标在周期开始时输出高电平当计数器等于CMPA时输出变低。配置在CTR0事件时对A输出执行AQ_SET置高。在CTRCMPA事件时对A输出执行AQ_CLEAR置低。代码片段EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);对于更常用的增减计数模式对称PWM假设使用EPWMxA高电平有效目标在计数器递增到CMPA时输出变高在计数器递减到CMPA时输出变低。配置在CTR递增且等于CMPA(CAU)事件时对A输出执行AQ_SET。在CTR递减且等于CMPA(CAD)事件时对A输出执行AQ_CLEAR。代码片段EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);5.2 死区发生器DB功率电路的保护神在驱动MOSFET或IGBT的桥式电路中同一桥臂的上管和下管绝不能同时导通否则会造成电源直通短路瞬间烧毁器件。死区时间就是在控制上管关断和下管导通或反之之间插入的一段两个管子都关断的安全延时。eHRPWM的DB模块接收来自AQ模块的原始PWM信号通常称为EPWMxA和EPWMxB经过可配置的延迟后生成带死区的两路互补信号EPWMxA_DB和EPWMxB_DB通常连接到驱动芯片。核心寄存器DBCTL控制死区模式、输入信号极性等。DBRED上升沿延迟寄存器。定义输入信号上升沿到输出信号上升沿的延迟时间以TBCLK周期为单位。DBFED下降沿延迟寄存器。定义输入信号下降沿到输出信号下降沿的延迟时间。工作模式DB模块有多种模式最常用的是主动高互补模式。在此模式下假设输入EPWMxA为高有效PWMEPWMxB为其反相可通过AQ配置实现。DB模块会对EPWMxA的上升沿添加DBRED延迟对EPWMxB的上升沿添加DBFED延迟注意对于EPWMxB其上升沿对应原EPWMxA的下降沿。最终输出EPWMxA_DB和EPWMxB_DB是互补的且在任何切换时刻都保证了先关断、后导通的安全间隔。死区时间计算死区时间 延迟值 *TBCLK周期。例如TBCLK 100MHz (10ns)DBRED 50则上升沿死区时间为 50 * 10ns 500ns。配置示例// 首先通过AQ模块生成EPWMxA和其反相的EPWMxB假设用于上下管 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, ...); // 配置A输出 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, ...); // 配置B输出为A的反相 // 然后配置死区模块 EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_FED); // 使能上升沿和下降沿延迟 EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_POLARITY_ACTIVE_HIGH, EPWM_DB_POLARITY_ACTIVE_HIGH_COMPL); // 主动高互补模式 EPWM_setRisingEdgeDeadBandDelay(EPWM1_BASE, 50); // 设置DBRED 50个TBCLK EPWM_setFallingEdgeDeadBandDelay(EPWM1_BASE, 50); // 设置DBFED 50个TBCLK // 最后将EPWMxA_DB和EPWMxB_DB输出到引脚避坑指南与实操心得死区时间不是越长越好死区时间会引入波形失真降低有效输出电压尤其在高速开关场合。需要根据你所使用的功率器件的开关特性特别是关断延迟时间来精确计算。通常死区时间应略大于器件的最大关断延迟时间。务必使用示波器验证配置完死区后一定要用示波器同时测量上下管的驱动波形确认在切换瞬间存在明显的共态关断区间且时间符合设定。AQ与DB的联动有时为了生成特定的PWM模式如带死区的对称PWM需要仔细设计AQ的动作使其产生的原始EPWMxA和EPWMxB信号能满足DB模块的输入预期。画一下时序图会非常有帮助。影子寄存器DBRED和DBFED通常没有影子寄存器修改会立即生效。因此尽量避免在PWM运行时动态修改死区时间。如果必须修改应在PWM输出被禁用或处于安全状态如下管恒通时进行。6. 事件触发ET与错误联防TZ子模块让系统更智能可靠eHRPWM不仅负产生波形还提供了完善的事件管理和故障保护机制这对于构建健壮的工业系统至关重要。6.1 事件触发ET子模块精准的中断发生器在电机控制或数字电源中我们经常需要在PWM周期的特定时刻触发ADC采样用于读取电流、电压或者执行控制算法计算。ET模块就是为此而生。它允许你选择ePWM内部的各种事件如CTRPRD,CTR0,CTRCMPA等作为中断源。核心寄存器ETSEL选择中断事件。例如ETSEL[INTSEL]位域用于选择具体哪个事件能触发中断。ETPS中断预分频。你可以设置中断是每个事件都触发ET_1ST还是每2个、每3个事件才触发一次ET_2ND,ET_3RD。这在需要降低CPU中断负载时非常有用。ETFLG中断标志位。当选定的事件发生时此标志位置1。ETCLR用于在中断服务程序ISR中清除中断标志。ETFRC软件强制中断位可用于测试。典型配置流程选择中断事件在ETSEL寄存器中选择你关心的事件。例如在对称PWM中我们常在CTRPRD周期中点或CTR0周期结束时采样电流。那就将INTSEL配置为ET_CTR_PRD或ET_CTR_ZERO。设置中断预分频在ETPS寄存器中设置INTPRD。如果每个PWM周期都需要中断就设为ET_1ST。使能中断设置ETSEL[INTEN]1。在中断服务程序中读取ETFLG确认中断源。执行关键操作如启动ADC转换、运行PID计算、更新CMPA/CMPB值。写ETCLR寄存器相应的位来清除中断标志。配置示例在每个PWM周期结束时触发中断EPWM_enableInterrupt(EPWM1_BASE); // 使能EPWM1中断底层会操作ETSEL EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO); // 选择CTR0为中断源 EPWM_setInterruptEventCount(EPWM1_BASE, 1); // 每个事件都触发中断 (ET_1ST) // 注意还需要在PIE/CPU级别配置中断向量和使能全局中断注意事项中断服务程序ISR必须尽可能高效。长时间停留在ISR中会导致错过后续的中断造成系统控制失调。对于复杂的计算应考虑在ISR中设置标志位在主循环中处理。6.2 错误联防TZ子模块系统的紧急制动TZ模块是eHRPWM的安全卫士。它连接到一个或多个外部故障引脚TZ1-TZn当这些引脚被触发通常由过流、过压、过热等硬件保护电路拉低TZ模块可以立即强制PWM输出进入预定义的安全状态如全部置高、全部置低或高阻态从而保护功率电路和电机。核心寄存器TZSEL选择哪些故障引脚TZ1-TZn可以触发保护动作。你可以配置为“任一引脚触发即动作”或“所有选定引脚同时触发才动作”。TZCTL定义当故障发生时EPWMxA和EPWMxB输出应被强制为何种状态TZ_FORCE_HI,TZ_FORCE_LO,TZ_HIZ高阻TZ_NONE忽略。TZEINT使能故障触发CPU中断以便软件记录故障日志或进行恢复操作。TZFLG故障标志寄存器。TZCLR清除故障标志。TZFRC软件强制产生故障信号用于测试。动作模式单次触发One-Shot故障事件发生后PWM输出被强制锁定在安全状态直到软件通过TZCLR清除标志位后才会恢复。适用于需要人工干预的严重故障。周期循环Cycle-By-Cycle故障事件发生后PWM输出在当前周期被强制为安全状态但下一个PWM周期会自动恢复。如果故障信号持续存在则下个周期会再次被强制。适用于可自恢复的瞬时过流保护。配置示例配置TZ1引脚为周期循环过流保护触发时强制两路输出为低EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_1); // 使能TZ1信号 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); // TZA故障时拉低 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW); // TZB故障时拉低 EPWM_setTripZoneCycleByCycle(EPWM1_BASE); // 设置为周期循环模式 // 如果需要中断再使能TZ中断 EPWM_enableTripZoneInterrupt(EPWM1_BASE);安全第一原则硬件连接是关键TZ引脚必须可靠地连接到你的硬件保护电路如比较器输出。确保故障信号的极性正确通常是低电平有效。默认安全状态TZCTL中配置的强制状态必须是电气上的安全状态。对于大多数桥式电路强制所有输出为低下管导通上管关断或高阻是常见的安全选择强制为高可能导致直通。务必测试在系统上电前通过短接TZ引脚到地等方式模拟故障条件用示波器验证PWM输出是否能按预期被强制并且恢复逻辑是否符合预期。这是保证产品可靠性的最后一道硬件防火墙。7. 高分辨率PWMHRPWM扩展与初始化流程对于追求极致控制精度的应用如高性能数字电源LLC, PFC或需要极细步进调节的场合标准的PWM分辨率可能不够。eHRPWM模块的HRPWM扩展功能通过微调PWM边沿的位置可以将时间分辨率提升到皮秒ps级别。7.1 HRPWM原理简介传统PWM的边沿切换时刻只能发生在TBCLK的整数倍时刻。HRPWM通过一个称为“微边沿定位MEP”的技术在TBCLK的一个周期内进一步插入数百个精细的步进从而允许边沿在子TBCLK周期内移动。这通常通过一个特殊的CMPAHR寄存器高分辨率比较寄存器来实现它与标准的CMPA寄存器配合使用。CMPA决定粗调位置哪个TBCLKCMPAHR决定微调位置在该TBCLK周期内的具体时刻。配置要点确认模块支持并非所有ePWM实例都支持HRPWM需查阅芯片数据手册。配置HRPWM时钟需要通过HRCNFG寄存器配置MEP步进的比例尺。使用扩展寄存器使用CMPAHR来设置高分辨率部分的值。占空比的微调通过一个公式计算后写入CMPAHR。由于HRPWM的配置相对复杂且与具体芯片型号强相关这里不展开具体位域。但其核心思想是通过牺牲一定的动态范围因为部分寄存器位用于微调来换取极高的时间分辨率。在需要非常平滑的电压调节或极低谐波失真的应用中HRPWM价值巨大。7.2 eHRPWM模块标准初始化流程一个稳健的eHRPWM初始化流程可以避免因寄存器状态不确定而导致的毛刺或异常输出。TI手册推荐的标准流程如下禁用全局中断操作CPU INTM位防止初始化过程中被中断打断。禁用ePWM模块中断清除ETSEL[INTEN]等中断使能位。初始化外设寄存器按照从“上游”到“下游”的顺序配置寄存器先配置TB模块设置时钟分频、计数模式、周期值。此时先不要启动计数器或将其置于冻结模式TB_FREEZE。再配置CC模块设置CMPA,CMPB及其影子加载模式。然后配置AQ模块定义输出动作逻辑。接着配置DB, PC, TZ, ET等模块根据需求配置死区、故障保护等。清除虚假的中断标志读取并清除ETFLG,TZFLG等标志寄存器避免残留标志导致误中断。使能ePWM模块中断配置ETSEL等使能所需的中断源。使能全局中断操作CPU INTM位。启动时间基准时钟同步如果使用多个ePWM模块且需要时钟同步按照第3.2节描述的流程最后操作CFGCHIP1[TBCLKSYNC]位同时启动所有模块的TBCLK。解除计数器冻结将TBCTL[CTRMODE]从TB_FREEZE改为所需的计数模式如TB_COUNT_UPDOWNPWM波形开始输出。这个流程的核心思想是在输出使能前完成所有静态配置在逻辑正确建立后再统一启动时序。遵循此流程能最大程度保证系统从上电开始就处于确定、可控的状态。在我多年的电机驱动开发中eHRPWM模块的深度配置是区分普通应用和高端应用的关键。从寄存器映射理解其能力边界通过子模块化配置构建所需波形再利用事件触发和错误联防实现智能控制与保护这套组合拳打好了你的电力电子项目就拥有了一个强大而可靠的心脏。调试时善用仿真器的寄存器观察窗口和示波器从TB的计数器波形看起逐步验证CC、AQ、DB各环节的输出是快速定位问题的有效方法。