1. 项目概述:为什么我们需要高分辨率PWM?
在电力电子和电机驱动的世界里,脉冲宽度调制(PWM)就像一位指挥家,通过调节开关的通断时间来精确控制功率的流动。无论是驱动一台无刷电机平稳旋转,还是让一个开关电源高效输出稳定的电压,PWM都是背后的核心。然而,随着应用频率的不断提升,传统PWM遇到了一个瓶颈:分辨率。
想象一下,你的系统时钟频率是100MHz,这意味着每个时钟周期是10纳秒。在传统的数字PWM生成方式下,你能控制的最小时间单位就是这10纳秒。当你需要生成一个1MHz的PWM波时,一个周期有100个这样的时钟“格子”,你的占空比调节精度大约是1%。这听起来还不错。但当频率上升到2MHz,周期内只剩下50个格子,精度就降到了2%。对于追求极致效率的现代开关电源(比如工作频率在数百kHz到数MHz的LLC谐振变换器)或需要高保真度的D类音频功放,2%的调节“步进”可能意味着显著的谐波失真、额外的开关损耗,或者干脆无法实现精确的软开关条件,导致效率下降和电磁干扰(EMI)问题。
这就是高分辨率PWM(HRPWM)登场的时候。它的核心思想非常巧妙:既然我无法让系统时钟跑得更快,那我能不能在现有的一个时钟周期内,“塞”进更多个可控的时间点?HRPWM通过一种称为微边沿定位器(MEP)的技术,实现了这一点。MEP能够将一个粗粒度的系统时钟周期(例如10ns)进一步细分成多达255个微步进(MEP Step),每个步进的时间精度可以达到惊人的150皮秒(ps)量级。这就好比原来你只能用厘米尺来测量,现在换成了带游标的千分尺,测量精度得到了质的飞跃。
基于MEP的HRPWM技术,使得数字控制器在高频PWM应用中的控制精度不再受限于系统时钟频率。它允许工程师以亚纳秒级的精度来定位PWM波的上升沿或下降沿,从而实现对占空比、相位甚至周期的超精细控制。这项技术对于提升开关电源的轻载效率、优化电机驱动的电流波形、以及实现高性能D类放大器的低失真输出至关重要。接下来,我们将以德州仪器(TI)TMS320F28003x系列微控制器中的增强型PWM(ePWM)模块为例,深入拆解HRPWM的工作原理、配置要点和实战中的那些“坑”。
2. HRPWM核心原理与MEP技术深度解析
要理解HRPWM,必须首先吃透其基石——微边沿定位器(MEP)技术。这不仅仅是简单的分频,而是一种智能的、基于延迟链或数字校准的边沿微调机制。
2.1 MEP:如何“切割”时间?
传统PWM的边沿切换时刻,完全由计数器(TBCTR)与比较寄存器(CMPA/CMPB)的值在系统时钟边沿对齐时决定。当TBCTR == CMPA时,在下一个系统时钟(TBCLK)的上升沿,动作限定器(AQ)模块会改变输出电平。这个“对齐”动作的精度就是1个TBCLK周期。
MEP的魔法在于,它在“比较匹配事件发生”到“实际输出电平改变”这个路径中,插入了一个可编程的、高精度的延迟线。这个延迟线可以被精细地控制。具体来说,硬件内部会测量在当前的电压、温度、工艺角下,一个TBCLK周期内可以容纳多少个标准延迟单元(即MEP步进)。这个数量就是MEP比例因子(MEP Scale Factor),它不是一个固定值,而是会随环境缓慢变化的。例如,在100MHz系统时钟和特定条件下,一个10ns的TBCLK周期可能被细分成大约55个MEP步进,那么每个MEP步进就约等于10ns / 55 ≈ 181.8ps。
2.2 寄存器架构:16位+8位的精妙组合
HRPWM功能通过扩展寄存器来实现,这些寄存器与传统的ePWM寄存器“拼接”使用,形成了24位的控制精度。这是理解配置的关键:
- CMPAHR (8位): 高分辨率比较A寄存器。它与标准的16位CMPA寄存器共同组成一个24位的比较值
[CMPA:CMPAHR]。CMPA决定边沿的“粗调”位置(以TBCLK为单位),CMPAHR则负责“微调”,指定在最后一个TBCLK周期内,需要延迟多少个MEP步进再触发边沿动作。 - CMPBHR (8位): 高分辨率比较B寄存器,功能同CMPAHR,用于B通道。
- TBPRDHR (8位): 高分辨率周期寄存器。与TBPRD寄存器结合,可以实现对PWM周期的高分辨率控制。注意:此功能仅在部分型号的ePWM模块(Type 1及以上)中支持。
- TBPHSHR (8位): 高分辨率相位寄存器。用于在多个ePWM模块同步时,实现亚时钟周期的相位偏移。
- DBREDHR/DBFEDHR (7位): 高分辨率死区寄存器。用于在死区模块的半周期时钟模式下,对上升沿延迟(RED)和下降沿延迟(FED)进行高精度控制。
这些扩展寄存器与主寄存器在内存中是32位对齐的,这意味着CPU可以通过一次32位写操作,同时更新常规值和微调值,确保了操作的原子性和实时性。
2.3 核心工作模式
HRPWM主要支持三种边沿控制模式,通过HRCNFG.EDGMODE位配置:
- 上升沿模式 (Rising Edge, RE): 仅对PWM波的上升沿进行高分辨率控制。适用于需要精确控制导通起点的应用,如某些拓扑的占空比控制。
- 下降沿模式 (Falling Edge, FE): 仅对下降沿进行高分辨率控制。同样用于占空比控制。
- 双边沿模式 (Both Edges, BE): 对上升沿和下降沿同时进行高分辨率控制。这通常用于相位控制模式,此时高分辨率控制的是TBPHSHR(相位偏移),而不是占空比。在移相全桥等拓扑中非常有用。
2.4 自动转换模式:让算法更简洁
手动计算MEP步进数并写入CMPAHR是一个繁琐且容易出错的过程,因为MEP比例因子(HRMSTEP)是动态变化的。为此,HRPWM模块提供了自动转换模式(HRCNFG.AUTOCONV = 1)。
在此模式下,你只需要告诉硬件你想要的分数部分。例如,你想要40.5%的占空比,PWM周期对应80个TBCLK。那么:
CMPA = int(0.405 * 80) = 32(整数部分)CMPAHR = frac(0.405 * 80) << 8 = (0.4) * 256 = 102.4,取整后为0x66(注意,这里写入的是分数部分的Q8格式表示,即小数部分乘以256)。
你只需要写入这个[CMPA: CMPAHR]组合值。硬件会自动读取HRMSTEP寄存器中当前的MEP比例因子(比如55),并在内部完成运算:实际MEP步进数 = (CMPAHR高8位代表的分数 * HRMSTEP + 0.5)。这个“0.5”是为了四舍五入。最终,硬件使用计算出的实际MEP步进数去精确延迟边沿。
自动转换模式极大地简化了软件设计,开发者可以像使用传统PWM一样,用分数形式(如Q15或Q24格式)直接表示占空比或相位,而无需关心底层时基和MEP的换算。TI提供的SFO(Scale Factor Optimizer)库函数,就是在后台不断运行,实时估算并更新HRMSTEP寄存器,确保自动转换的准确性。
注意:自动转换模式是使用HRPWM的推荐方式。除非有极致的实时性要求(需要手动计算以节省几个CPU周期),否则都应启用此模式。
3. 实战配置:从零搭建一个HRPWM通道
理论说得再多,不如一行代码。我们以TMS320F28003x的ePWM1模块为例,配置一个在EPWM1A输出上实现高分辨率占空比控制的通道,PWM频率设为1MHz,系统时钟100MHz。
3.1 基础ePWM配置
HRPWM建立在标准ePWM功能之上,因此必须先正确配置ePWM。
// 假设系统初始化已完成,SYSCLK = 100MHz void InitEPWM1_For_HRPWM(void) { // 1. 使能ePWM1和HRPWM时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM); // 2. 禁用时基时钟同步,以便独立配置各个ePWM模块 SysCtl_disableTBCLKSync(SYSCTL_TBCLK_SYNC_DISABLE); // 3. 配置时基子模块 (TB) EPWM_setTimeBasePeriod(EPWM1_BASE, 99); // PWM 频率 = 100MHz / (99+1) = 1MHz EPWM_setPhaseShift(EPWM1_BASE, 0); EPWM_setTimeBaseCounter(EPWM1_BASE, 0); EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP); // 向上计数模式 EPWM_disablePhaseShiftLoad(EPWM1_BASE); // 默认禁用相位加载 EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // 时钟不分频 // 4. 配置比较子模块 (CC) - 使用CMPA,并设置影子寄存器加载模式 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 50); // 初始占空比50%,对应CMPA=50 EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); // 在CTR=0时从影子寄存器加载 // 5. 配置动作限定器子模块 (AQ) - 设置高有效PWM 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_PERIOD); // 注意:这里使用PERIOD事件,在UP计数模式下,PERIOD事件发生在计数器等于周期值时。 // 对于HRPWM占空比控制,通常使用CMPA事件来切换,但为了与HRPWM扩展寄存器配合,我们使用PERIOD事件来定义周期终点。 // 实际的占空比由CMPA值决定,而CMPA事件在AQ模块中触发切换动作。这里是一个简化的配置逻辑,实际中需根据HRPWM边沿模式调整AQ配置。 // 更常见的AQ配置(用于上升沿HRPWM控制): // 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_COMPARE_A); // 这样,上升沿在CTR=0时固定,下降沿由CMPA(及CMPAHR)高精度控制。 // 6. 禁用死区、故障捕获、斩波器等我们暂时不用的子模块 EPWM_disableDeadBand(EPWM1_BASE); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1 | EPWM_TZ_SIGNAL_CBC1 | EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1); EPWM_disableChopper(EPWM1_BASE); }3.2 HRPWM专用配置
基础ePWM配置好后,开始配置HRPWM的核心部分。
void InitHRPWM1(void) { // 1. 配置HRPWM控制寄存器 (HRCNFG) // 假设我们使用CMPAHR控制下降沿(FE模式)进行高分辨率占空比调节 // 使用自动转换模式,影子寄存器加载模式与CMPA保持一致(CTR=ZERO时加载) // 注意:寄存器位域操作需参考具体器件头文件,以下为逻辑描述 EPWM_setHighResolutionControlMode(EPWM1_BASE, EPWM_HIGHRESOLUTION_CONTROL_MODE_DUTY); // 控制模式:占空比 EPWM_setHighResolutionEdgeMode(EPWM1_BASE, EPWM_HIGHRESOLUTION_EDGE_MODE_FALLING); // 边沿模式:下降沿 EPWM_setHighResolutionLoadMode(EPWM1_BASE, EPWM_HIGHRESOLUTION_LOAD_ON_CNTR_ZERO); // 加载模式:CTR=0 EPWM_enableHighResolutionAutoConversion(EPWM1_BASE); // 启用自动转换! EPWM_disableHighResolutionSwap(EPWM1_BASE); // 不交换A/B输出 EPWM_disableHighResolutionBOutput(EPWM1_BASE); // B通道不使用高分辨率(除非需要) // 2. 初始化HRMSTEP寄存器(MEP比例因子) // 这是一个关键步骤!必须通过SFO函数获取当前条件下的准确值。 // 这里先写一个估计值,后续由SFO函数更新。例如,假设初始值为55。 EPWM_setMEPEdgeScale(EPWM1_BASE, 55); // 写入HRMSTEP寄存器 // 3. 启用HRPWM模块 EPWM_enableHighResolutionPWM(EPWM1_BASE); // 4. 重新使能时基时钟同步,让所有ePWM开始运行 SysCtl_enableTBCLKSync(SYSCTL_TBCLK_SYNC_ENABLE); }3.3 使用SFO函数校准MEP比例因子
HRMSTEP的值不是固定的,必须通过TI提供的SFO库函数在线校准。
#include "sfov5.h" // 包含SFO库头文件 int MEP_ScaleFactor = 0; // 用于存储计算出的比例因子 int SFO_Status = 0; // SFO函数运行状态 void Run_SFO_Calibration(void) { // 定期在后台循环中调用此函数(例如,每100ms调用一次) // SFO函数会测量并更新所有使能了HRPWM的通道的HRMSTEP寄存器 SFO_Status = SFO_v5_1(); // 调用SFO函数,v5_1对应特定版本的库 if (SFO_Status == SFO_INCOMPLETE_ERROR) { // 校准未完成,需要继续调用 // 在初始化阶段,可能需要循环调用直到返回SFO_COMPLETE } else if (SFO_Status == SFO_COMPLETE) { // 校准成功完成,可以读取最新的比例因子(例如,用于监控) MEP_ScaleFactor = EPWM_getMEPEdgeScale(EPWM1_BASE); } else { // 发生错误,需要处理 } } // 在main函数初始化部分,确保SFO校准完成一次再开始主要控制循环 void main(void) { Device_init(); Interrupt_initModule(); InitEPWM1_For_HRPWM(); InitHRPWM1(); // 强制运行SFO直到完成初始校准 do { SFO_Status = SFO_v5_1(); } while (SFO_Status == SFO_INCOMPLETE_ERROR); if (SFO_Status == SFO_COMPLETE) { // 校准成功,开始主循环 while(1) { // 主控制逻辑 Run_SFO_Calibration(); // 在后台定期运行 } } }3.4 动态更新高分辨率占空比
配置完成后,如何实时更新一个高精度的占空比?在自动转换模式下,这变得非常简单。
void Update_HRPWM_DutyCycle(float duty_cycle_percent) { uint32_t pwm_period_counts = 100; // 对应TBPRD=99,周期计数为100 (0-99) float duty_fraction = duty_cycle_percent / 100.0f; // 步骤1: 计算整数部分 (CMPA) // 注意:在UP计数模式下,比较值等于高电平时间对应的计数。 // 假设我们控制下降沿,且CTR=0时输出变高,CTR=CMPA时输出变低。 uint16_t cmp_a_integer = (uint16_t)(duty_fraction * pwm_period_counts); // 步骤2: 计算分数部分 (CMPAHR),并组合成32位值 // 分数 = (目标值 - 整数部分) * 256 (左移8位,Q8格式) // 在自动转换模式下,我们直接写入这个Q8格式的分数部分。 uint16_t cmp_ahr_fraction = (uint16_t)((duty_fraction * pwm_period_counts - cmp_a_integer) * 256.0f); // 组合成32位寄存器值 [CMPA : CMPAHR] uint32_t cmp_a_combined = ((uint32_t)cmp_a_integer << 16) | ((uint32_t)cmp_ahr_fraction << 8); // 注意:CMPAHR寄存器在32位字中的位置是bits[15:8],所以左移8位。 // 步骤3: 一次性写入组合寄存器 // 使用HWREGH或HWREG等宏直接操作寄存器地址,确保32位写入 // 假设CMPA:CMPAHR的映射地址是 EPWM1_BASE + 0x08 (EPWM1_CMPA) HWREG(EPWM1_BASE + EPWM_O_CMPA) = cmp_a_combined; // 或者,如果TI的驱动程序提供了专用API: // EPWM_setCounterCompareValueHighRes(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, cmp_a_integer, cmp_ahr_fraction); }通过调用Update_HRPWM_DutyCycle(40.5f),你就可以设置一个精确的40.5%占空比。硬件会根据当前的HRMSTEP值,自动将分数部分0.4 * 256 = 102 (0x66)转换为相应的MEP步进延迟,从而实现远高于1%的精度。
4. 关键限制与避坑指南
HRPWM功能强大,但也有一���必须注意的限制,忽略它们会导致波形异常甚至系统不稳定。
4.1 占空比有效范围限制
MEP逻辑并非在整个PWM周期内都有效。为了确保边沿定位逻辑有足够的时间稳定工作,在周期开始和结束的附近存在一个“盲区”。具体来说:
- 当高分辨率周期控制禁用时(默认):MEP在周期开始后的前3个TBCLK周期内不工作。这意味着,如果你试图生成一个非常小占空比的脉冲(高电平时间小于3个TBCLK),其下降沿将无法使用高分辨率定位,会回退到常规PWM精度。同样,对于接近100%的占空比(低电平时间小于3个TBCLK),上升沿的高分辨率控制也会失效。
- 当高分辨率周期控制启用时(HRPCTL.HRPE=1):限制更为严格。在向上计数模式下,有效占空比范围是从第3个TBCLK到
TBPRD-3个TBCLK。在向上-向下计数模式下,有效范围是计数器从0向上到TBPRD-3,以及从TBPRD向下到3。
影响与对策: 对于1MHz PWM(100MHz TBCLK),3个周期是30ns,占整个周期(1000ns)的3%。因此,可用的高分辨率占空比范围大约是3%到97%。在大多数开关电源应用中,工作点很少会接近0%或100%,所以这个限制通常可以接受。如果应用必须工作在极低占空比,可以考虑使用向下计数模式并控制上升沿,这样最小占空比限制就转移到了最大占空比上。
严重警告:如果启用了高分辨率周期控制(HRPE=1),而你的占空比指令进入了上述限制区域,ePWM输出可能会出现未定义行为(如毛刺、错误脉冲),必须通过软件进行限幅保护。
4.2 同步信号(SYNC)引入的抖动
当使用高分辨率周期控制时,需要特别注意同步信号。如果ePWM模块的同步输出(EPWMxSYNCO)被设置为CTR=ZERO或CTR=CMPB,那么每一个PWM周期都会产生一个同步脉冲。这个同步脉冲会引入±1个TBCLK周期(向上计数)或±2个TBCLK周期(向上-向下计数)的抖动到PWM输出上。
解决方案:
- 避免周期性的硬件同步:在高分辨率周期模式下,不要将EPWMxSYNCO源设置为会导致每个周期都同步的事件。
- 谨慎使用软件同步:
TBCTL.SWFSYNC位产生的软件同步脉冲,在初始化时可以使用一次来对齐所有ePWM模块。但在PWM运行过程中,应避免再次触发软件同步,否则会在同步时刻引入抖动。如果必须同步,需评估抖动对系统的影响。
4.3 死区高分辨率控制的特殊要求
高分辨率死区控制(使用DBREDHR/DBFEDHR)仅在半周期时钟模式下可用。这意味着必须配置死区子模块为半周期时钟模式(DBCTL.HALFCYCLE = 1)。同时,对应的常规死区延迟值(DBRED或DBFED)必须大于或等于7。如果设置小于7,高分辨率死区控制可能无法正常工作。
4.4 影子寄存器加载模式
在向上-向下计数模式下使用HRPWM时,影子寄存器的加载模式需要特别注意。即使你的新值只在CTR=ZERO时加载到影子寄存器,也必须将HRCNFG.HRLOAD位配置为在ZERO和PERIOD都加载(HRLOAD = 2)。这是因为HRPWM模块内部的一些逻辑需要用到CTR=PRD这个事件。
5. 在LLC谐振变换器中的应用实例
输入材料中提到了H桥LLC谐振变换器,这是一个HRPWM大显身手的典型场景。LLC变换器通过调节开关频率来控制增益,实现软开关(ZVS/ZCS),从而获得极高的效率。对开关频率的精度要求非常高。
5.1 传统PWM的瓶颈
在一个数字控制的LLC中,控制器根据输出电压反馈计算出一个目标开关频率。假设系统时钟100MHz,PWM模块工作在向上-向下计数模式(用于生成对称的互补驱动信号)。如果目标频率是200kHz,那么PWM周期对应的计数寄存器值TBPRD = (100MHz / 200kHz) / 2 = 250。此时,频率调节的最小步进是(100MHz / (2 * 251)) ≈ 199.2kHz到(100MHz / (2 * 249)) ≈ 200.8kHz,步进约为800Hz。在轻载或需要精细调压时,这个步进可能过大,导致输出电压纹波或环路不稳定。
5.2 HRPWM带来的提升
启用HRPWM的高分辨率周期控制(使用TBPRDHR寄存器)。仍然以200kHz目标频率为例,周期对应的精确计数值是250.0。传统PWM只能取250或249。而HRPWM允许你设置TBPRD = 249(整数部分),然后在TBPRDHR中设置分数部分,让实际周期无限接近250.0个TBCLK。假设MEP比例因子为55,那么你可以实现的频率分辨率将提高约55倍,频率调节步进从~800Hz精细到~15Hz。这使得数字控制器能够以极高的精度追踪LLC的谐振点,始终保持最优的软开关状态,最大化变换器效率。
配置要点:
- 启用高分辨率周期模式(
HRPCTL.HRPE = 1)。 - 在
HRCNFG寄存器中,设置边沿模式为双边沿控制(EDGMODE = BE),因为周期控制需要同时调整两个边沿。 - 确保
HRCNFG.HRLOAD模式与计数器模式匹配(向上-向下计数模式时设为CTR=0 or PRD)。 - 必须启用自动转换模式(
AUTOCONV=1)。 - 通过SFO函数持续校准
HRMSTEP。 - 在软件中,将计算出的目标周期值(以TBCLK为单位的浮点数)拆分为
TBPRD(整数部分)和TBPRDHR(Q8格式的分数部分),并组合写入。
通过这种方式,LLC变换器可以在整个输入电压和负载范围内,实现平滑、无级差的频率调节,这对于提升轻载效率和降低音频噪声(避免频率跳变引起的啸叫)尤其重要。
6. 调试技巧与常见问题排查
在实际项目中调试HRPWM,可能会遇到一些棘手的问题。以下是一些实战经验总结。
6.1 问题:HRPWM输出完全没有高分辨率效果,看起来和普通PWM一样。
- 排查步骤:
- 检查时钟:确认
EPWMxCLK和HRCAL时钟已使能。使用示波器测量ePWM输出频率是否与预期一致,确认时基时钟正常工作。 - 检查SFO状态:
HRMSTEP寄存器值是否为0?如果是0,说明SFO校准未运行或失败。检查SFO函数返回值,确保其返回SFO_COMPLETE。在初始化阶段,务必循环调用SFO直到完成。 - 检查自动转换:确认
HRCNFG.AUTOCONV位已置1。如果禁用,则需要软件手动计算并写入精确的MEP步进数到CMPAHR,计算错误会导致边沿偏移不准。 - 检查寄存器写入:确认你是以32位方式写入
[CMPA:CMPAHR]组合寄存器。如果先写CMPA,再写CMPAHR,可能在中间某个时刻产生错误的PWM脉冲。使用HWREG进行32位原子写入。 - 检查边沿模式:确认
HRCNFG.EDGMODE设置是否正确。如果你配置为控制上升沿(RE),但AQ模块设置的是由CMPA事件控制下降沿,那么高分辨率将不会生效。
- 检查时钟:确认
6.2 问题:PWM输出有周期性抖动或毛刺。
- 排查步骤:
- 检查同步源:如果启用了高分辨率周期控制,检查
EPWMxSYNCO的配置。确保它不是由CTR=ZERO或CTR=CMPB事件触发。将其配置为“禁用”或由外部信号触发。 - 检查中断冲突:高精度的HRPWM对中断延迟敏感。确保在频繁更新CMPAHR的ISR(中断服务程序)中,没有关闭全局中断或存在长时间关中断的操作。考虑使用DMA或影子寄存器在非关键时间点更新。
- 检查电源噪声:极精细的MEP步进(150ps)对电源完整性非常敏感。检查MCU的模拟和数字电源引脚是否都有良好的去耦电容(如100nF和10uF组合),并且布局布线合理,避免开关电源噪声耦合到时钟或PWM输出电路。
- 检查同步源:如果启用了高分辨率周期控制,检查
6.3 问题:在特定占空比下,输出波形异常。
- 排查步骤:
- 确认占空比范围:计算你试图设置的占空比对应的高电平时间(以TBCLK计)。如果它小于3(或大于
TBPRD-3),且你使用了高分辨率控制,那么你正处于限制区域。软件必须对占空比指令进行限幅。 - 检查死区配置:如果同时使用了死区和高分辨率,确保死区模块已使能且配置为半周期模式,并且
DBRED/DBFED的值大于等于7。 - 使用诊断模式:HRPWM模块包含一个自检诊断模式。可以通过配置
HRCNFG寄存器进入此模式,它会输出一个测试信号。通过测量这个测试信号的周期或占空比,可以验证MEP逻辑本身是否工作正常。具体方法需参考芯片勘误表和应用笔记。
- 确认占空比范围:计算你试图设置的占空比对应的高电平时间(以TBCLK计)。如果它小于3(或大于
6.4 性能优化建议
- 后台运行SFO:SFO函数计算量不大,但不应放在高速控制环中。将其置于一个低优先级的后台任务(例如,每10-100ms运行一次)是标准做法。
- 使用Q格式数学:在控制算法中,尽量使用定点数(如Q15、Q24格式)来表示占空比、频率等参数。这可以避免浮点运算的开销,并简化与HRPWM寄存器Q8格式分数部分的对接。
- 利用影子寄存器:将HRPWM扩展寄存器(如CMPAHR)也配置为影子寄存器加载模式,与主寄存器同步更新。这样,你可以在任意时间计算新值并写入影子寄存器,然后在
CTR=ZERO或CTR=PRD的安全时刻统一生效,避免PWM周期中间出现毛刺。
HRPWM是一项能够显著提升数字电源和电机控制性能的技术,但其配置相对复杂,对细节要求极高。理解MEP的原理、熟练掌握寄存器配置流程、并牢记各种限制条件,是成功应用它的关键。从简单的占空比控制开始,逐步应用到频率和相位控制,你将能充分释放数字控制器在功率转换领域的全部潜力。