TMS320F2837xS CMPSS数字滤波器配置、校准与ePWM协同实战

📅 2026/7/22 9:04:16 👁️ 阅读次数 📝 编程学习
TMS320F2837xS CMPSS数字滤波器配置、校准与ePWM协同实战

1. CMPSS数字滤波器:从噪声中提取可靠信号的“守门员”

在电机驱动、数字电源或者任何需要精确电压比较的实时控制系统中,我们常常会遇到一个头疼的问题:模拟信号总是伴随着噪声。这些噪声可能来自开关电源的纹波、电机换相产生的尖峰,或者是PCB走线引入的干扰。如果直接将这样的信号送入比较器,输出会频繁地在高低电平之间“抖动”,导致后续的PWM保护误动作、电流环控制紊乱,整个系统变得极不稳定。这时候,TMS320F2837xS的比较器子系统(CMPSS)内置的数字滤波器,就扮演了至关重要的“守门员”角色。

这个数字滤波器不是一个复杂的算法,而是一个基于硬件的、实时的信号整形器。它的核心思想很简单:不要相信单次采样的结果,要看一段时间内的“民意”。它持续地对比较器的原始输出进行采样,并设置一个观察窗口(比如连续8次采样)和一个表决阈值(比如要求其中至少6次为高,才最终判定为高)。只有当一个电平状态在窗口内占据了“绝对多数”,滤波器的输出才会改变。这能有效滤除那些短暂、孤立的噪声毛刺,只让稳定、真实的信号变化通过。对于需要高可靠性的保护电路(如过流、过压保护)或精密的阈值检测应用,配置好这个数字滤波器是确保系统稳健性的第一步。接下来,我们就深入这个“守门员”的内部,看看如何正确地唤醒它、训练它,并校准它的判断基准。

2. 数字滤波器初始化:一个不可错过的“上电仪式”

很多工程师在配置CMPSS时,可能会直接设置好滤波参数就期待它工作,结果发现输出要么没反应,要么行为诡异。这往往是因为漏掉或颠倒了关键的初始化序列。这个序列不是建议,而是确保数字滤波器内部逻辑处于已知、正确状态的强制性步骤。跳过它,就等于让一个逻辑电路在未知的初始状态下运行,后果难以预料。

2.1 初始化序列的逐条精解

参考技术手册,完整的初始化序列如下。我将结合自己的调试经验,为你解释每一步的深层意图操作要点

  1. 配置并使能比较器:这是所有操作的基础。你必须先告诉比较器,它的正端(CMPINxP)和负端(内部DAC或外部引脚)信号从哪里来,输出是否要取反,是否使能迟滞等。务必在这一步就完成比较器的基础配置并使其进入工作状态。因为后续的滤波器初始化(FILINIT)依赖于一个稳定的比较器输出作为初始值。如果比较器未使能,其输出是不确定的,用这个不确定值去初始化滤波器窗口,结果自然也是错的。

  2. 配置数字滤波器参数:这是滤波器的“行为准则”设定阶段。你需要设置三个核心寄存器:

    • SAMPWIN (Sample Window):设置在FIFO窗口中监控的样本数量。其有效值为SAMPWIN+1。例如,设置为7,则窗口大小为8个样本。这个值决定了滤波器的“记忆力”长度。窗口越大,抗单次突发噪声能力越强,但对信号变化的响应也越慢。在电机控制中,我通常根据PWM开关频率和预期噪声持续时间来设定。例如,对于100kHz的PWM,一个开关周期是10us。如果噪声毛刺通常持续小于200ns,那么设置窗口时间为1-2us(即10-20个系统时钟周期,假设SYSCLK=200MHz)通常就够了。
    • THRESH (Threshold):设置多数表决所需的阈值。其有效值为THRESH+1。这是滤波器的“判断力”参数。THRESH必须小于或等于SAMPWIN。例如,SAMPWIN=7(窗口8),THRESH=5,则意味着需要8个样本中至少有6个(5+1)为同一状态,输出才翻转。这个值越接近窗口大小,滤波器越“顽固”,需要更持续的信号才能改变输出;设置为0则相当于关闭滤波器(需要1个样本即可翻转)。
    • CLKPRESCALE:设置数字滤波器采样时钟的预分频值。采样周期为(CLKPRESCALE + 1)个系统时钟周期。这是决定滤波器带宽的关键。假设SYSCLK=200MHz,若CLKPRESCALE=199,则采样周期为200个系统时钟,即1us,采样频率为1MHz。你需要确保采样频率远高于你关心的信号频率(满足奈奎斯特采样定理),同时又足够低以滤除高频噪声。一个经验法则是:采样频率至少是你关心的信号最高频率的10倍,同时远低于噪声的主要频率成分。
  3. 通过FILINIT初始化FIFO窗口:这是最容易被忽略但至关重要的一步。在参数配置好后,滤波器内部的FIFO(先进先出队列)里填充的是随机或上次残留的数据。FILINIT位是一个“一次性”操作位,向其写入1,会立即将当前比较器的输出值(经过同步器后)填充到整个FIFO窗口的所有样本位置。这个操作必须在参数配置之后、启用滤波器输出路径之前进行。它确保了滤波器从一个明确的、与当前实际输入信号一致的状态开始工作,避免了因历史垃圾数据导致立即误触发。

  4. 清除COMPSTS锁存器:如果你计划使用锁存路径(即CTRIPxSEL或CTRIPOUTxSEL配置为3),那么需要在上电后清除锁存器的状态。通过向COMPSTSCLR寄存器中的HLATCHCLRLLATCHCLR位写1,可以生成一个脉冲来复位对应的锁存器。这确保了锁存器从“0”状态开始,等待一个真正的滤波后的事件来置位。

  5. 配置CTRIP和CTRIPOUT信号路径:现在可以决定滤波(或原始)信号去哪里了。通过COMPCTL寄存器的CTRIPxSELCTRIPOUTxSEL位,你可以选择信号来源:异步比较器输出(路径最短,延迟最小,但含噪声)、同步比较器输出(增加1-2个系统时钟同步延迟)、数字滤波器输出(滤波后,稳定)、数字滤波器锁存输出(滤波后且带锁存功能,常用于触发一次性事件)。根据你的应用选择:实时关闭PWM可能用滤波输出;故障锁存则用锁存输出。

  6. 配置目标模块:最后,将CMPSS产生的CTRIPCTRIPOUT信号通过Crossbar(输出交叉开关)路由到目标外设,例如ePWM模块的Trip-Zone输入,用于快速关断PWM;或者路由到GPIO,用于指示状态。

关键经验:这个序列的顺序逻辑非常强。简单来说,就是“搭建硬件(1) -> 设定规则(2)-> 初始化状态(3)-> 清空历史(4)-> 连接出口(5)-> 送达目标(6)”。在调试时,我习惯用CCS的寄存器观察窗口,严格按照这个顺序操作,并每步都验证相关寄存器位是否按预期变化。

2.2 寄存器配置代码示例与避坑指南

下面是一个针对CMPSS1高比较器(COMPH)的初始化函数示例,假设使用内部DAC作为负端输入,并启用数字滤波器:

#include "driverlib.h” #include “device.h” void CMPSS1_DigitalFilter_Init(void) { // 步骤1: 配置并使能高比较器 // 负端输入源选择内部DAC, 输出不取反 CMPSS_configHighComparator(CMPSS1_BASE, CMPSS_CTRIP_NEG_SRC_DAC, CMPSS_CTRIP_INV_DISABLE); // 使能比较器模块(同时使能内部DAC) CMPSS_enableModule(CMPSS1_BASE); // 步骤2: 配置数字滤波器参数 (以高比较器路径为例) // 定义滤波器配置结构体 CMPSS_FilterConfig filterConfig; filterConfig.maxSampleWindow = 7; // SAMPWIN = 7, 即8样本窗口 filterConfig.threshold = 5; // THRESH = 5, 即需要至少6个相同样本 filterConfig.clkPrescale = 199; // CLKPRESCALE = 199, 采样周期200个SYSCLK (假设200MHz -> 1us) filterConfig.filterType = CMPSS_FILTER_MAJORITY; // 使用多数表决模式 // 应用滤波器配置到高比较器路径 CMPSS_configFilterHigh(CMPSS1_BASE, &filterConfig); // 步骤3: 初始化滤波器FIFO窗口 CMPSS_initFilterHigh(CMPSS1_BASE); // 步骤4: 清除高比较器滤波锁存器 (如果后续要用) CMPSS_clearFilterLatchHigh(CMPSS1_BASE); // 注意:也可以配置为通过EPWMSYNCPER信号自动清除,这在周期性的保护中很有用 // CMPSS_enableLatchResetOnPWMSYNCHigh(CMPSS1_BASE); // 步骤5: 配置信号路径 - 选择数字滤波器输出作为CTRIPH和CTRIPOUTH的来源 CMPSS_configOutputsHigh(CMPSS1_BASE, CMPSS_TRIP_FILTER, CMPSS_TRIPOUT_FILTER); // 步骤6: 配置目标模块 (例如,将CTRIPH连接到ePWM1的Trip-Zone输入) // 这通常通过配置Output X-Bar (输出交叉开关) 完成 // 假设将CMPSS1.CTRIPH (输出信号) 映射到 OUTPUTXBAR1 XBAR_setOutputMuxConfig(XBAR_OUTPUT1, XBAR_OUT_MUX00_CMPSS1_CTRIPH); // 再将 OUTPUTXBAR1 连接到 ePWM1的TZ1输入 XBAR_linkOutputToInput(XBAR_OUTPUT1, XBAR_INPUT_EPWM1_TZ1); }

避坑指南:关于FILINIT的时机CMPSS_initFilterHigh()函数内部就是操作FILINIT位。务必确保在调用它之前,比较器已经稳定工作。我曾经犯过一个错误:在CMPSS_enableModule()之后立即调用初始化,但内部DAC的电压建立需要几个时钟周期,此时比较器输出可能还在 transient 状态。最佳实践是,在使能模块后,插入一个短暂的延时(例如,循环等待10个系统时钟),或者确保DAC值已设定并稳定后,再执行FILINIT操作。

3. 核心参数设计与延迟分析:平衡响应速度与抗噪能力

配置数字滤波器不是简单地填几个数字,而是在响应速度抗噪声能力之间做权衡。你需要根据具体的应用场景,计算出合适的SAMPWINTHRESHCLKPRESCALE

3.1 参数计算与选型逻辑

假设你的系统场景是:一个Buck电源的过流保护。电流采样信号上叠加了由MOSFET开关引起的、宽度约50ns的周期性噪声。SYSCLK = 200 MHz (周期5ns)。你希望滤波器能滤除所有宽度小于100ns的噪声脉冲,同时对真实的过流信号(持续时间超过500ns)做出快速响应。

  1. 确定采样周期(由CLKPRESCALE决定)

    • 要可靠检测100ns的脉冲,采样周期必须小于脉冲宽度。为了留有余量,我们选择采样周期为噪声宽度的1/2到1/3,即~30ns
    • 系统时钟周期为5ns,因此采样周期对应的系统时钟数 = 30ns / 5ns =6
    • 根据公式采样周期 = (CLKPRESCALE + 1) * T_sysclk,可得CLKPRESCALE = (采样周期 / T_sysclk) - 1 = 6 - 1 = 5
    • 结论:设置CLKPRESCALE = 5,此时实际采样周期为(5+1)*5ns = 30ns,采样频率约为33.3MHz。
  2. 确定窗口大小(由SAMPWIN决定)

    • 我们希望滤波器能“无视”持续时间小于100ns的噪声。在30ns的采样周期下,一个100ns的噪声最多能覆盖ceil(100ns / 30ns) = 4个采样点(向上取整)。
    • 为了让这个噪声无法触发输出翻转,我们需要确保窗口内“一致样本”的数量阈值,大于噪声能污染的最大样本数。因此,窗口大小必须大于4,且阈值设置要使得4个噪声样本不足以达成多数。
    • 我们选择一个适中的窗口大小,比如SAMPWIN = 7(即8个样本的窗口)。这样能提供较好的滤波效果,同时不会引入过大的延迟。
  3. 确定表决阈值(由THRESH决定)

    • 窗口大小为8。要改变输出状态,需要至少THRESH+1个样本为相反状态。
    • 为了抵抗最多4个连续噪声样本,我们需要确保至少需要5个样本才能翻转。因此,THRESH+1 >= 5,即THRESH >= 4
    • 同时,为了对真实信号保持敏感,阈值不宜过高。我们取THRESH = 5。这意味着需要6个一致样本才能翻转输出。这样,4个连续的噪声样本(无论高低)都无法改变输出,达到了滤除目的。

参数总结CLKPRESCALE=5,SAMPWIN=7,THRESH=5。在这个配置下,滤波器能免疫宽度小于(THRESH+1) * 采样周期 = 6 * 30ns = 180ns的噪声,而对持续超过(SAMPWIN+1 - THRESH) * 采样周期 = (8-6) * 30ns = 60ns的真实信号开始有反应(但需要持续180ns才能最终确认翻转)。

3.2 系统延迟分析与补偿

使用数字滤波器会引入不可忽略的延迟,在设计保护环路的响应时间时必须考虑。CMPSS信号路径的延迟由三部分组成:

  1. 同步器延迟:固定为1-2个系统时钟周期(T_sync = 1~2 * T_sysclk)。这是模拟信号进入数字域必需的步骤。
  2. 数字滤波器延迟:这是可变的主要延迟。最坏情况下的延迟等于滤波器确认一个新状态所需的时间。
    • 计算公式T_filter_max = (SAMPWIN + 1) * (CLKPRESCALE + 1) * T_sysclk
    • 代入我们的例子:T_filter_max = 8 * 6 * 5ns = 240ns
    • 这是从输入信号稳定变化到滤波器输出最终翻转到新状态的最大时间。平均延迟大约是最大延迟的一半。
  3. 锁存器延迟:如果使用锁存输出,额外增加1个系统时钟周期(T_latch = 1 * T_sysclk)。

总延迟示例T_total ≈ T_sync + T_filter_max + T_latch ≈ 2*5ns + 240ns + 5ns = 255ns

重要提示:这255ns是信号从比较器输入到CTRIPx/CTRIPOUTx有效的数字路径延迟。它还不包括比较器本身的传播延迟(模拟延迟,通常在数据手册中给出,如几十纳秒)以及内部DAC的建立时间。在计算整个系统的保护响应时间(从故障发生到PWM关闭)时,必须把这些延迟全部加起来。例如,ePWM的Trip-Zone动作本身也有几个时钟周期的延迟。我曾在一个高频伺服驱动器中,因为忽略了这总计近400ns的延迟,导致过流保护不够快,差点损坏IGBT。教训是:在计算保护阈值时,必须为延迟留出足够的裕量,或者通过提高PWM死区时间来补偿。

4. CMPSS校准实战:消除“与生俱来”的误差

即使配置完美,如果不进行校准,你的比较器触发点也可能存在几十毫伏甚至上百毫伏的误差。这个误差主要来自两个方面:比较器本身的输入失调电压,以及内部12位DAC的静态误差。数据手册会将它们分别列为“Input referred offset error”和“Static offset error”。对于高精度的阈值检测(例如,精确的过压点设置在12.1V),这个误差是不可接受的。

4.1 校准原理与流程拆解

校准的核心思想是**“寻找真实的跳变点”**。当比较器的反相端由内部DAC驱动时,DAC的误差已经包含了比较器的失调。所以,我们只需要校准DAC的误差。手册提供了一种“向下扫描”的校准算法,我将其转化为更易于实现的步骤:

校准前提(非常重要!)

  • 提供稳定的直流信号:在校准期间,必须给比较器的同相输入端(CMPINxP)施加一个稳定、干净的直流电压(V_target)。这可以是你的目标阈值电压,或者一个已知的中间电压。如果信号有噪声,校准结果会不准。
  • 禁用迟滞:在COMPHYSCTL寄存器中将迟滞(Hysteresis)设置为0,避免迟滞带来的回差影响对精确跳变点的判断。
  • 启���滤波和锁存:为了对抗可能存在的微小噪声,校准时应启用数字滤波器(设置非零参数)并使用锁存输出。这样,只有稳定、持续的过零才会被捕获。

校准流程(软件实现)

  1. 设置初始DAC值:将DAC值设置为最大值(0xFFF,对应参考电压V_ref)。这确保了初始状态下,DAC输出电压V_dac > V_target,比较器输出为低(假设同相接V_target,反相接V_dac,且比较器为同相>反相则输出高)。我们的目标是逐步降低V_dac,直到比较器翻转。

    • 优化技巧:如果你知道V_target的大致值(例如通过ADC读取),并且知道DAC的静态误差范围(V_offset_max,从数据手册查得),可以将起始值设为DAC_start = (V_target + V_offset_max + V_margin) / V_ref * 4095。其中V_margin是一个小的裕量电压(如10mV)。这可以大幅减少扫描步数,加快校准。如果V_target未知,则必须从最大值开始。
  2. 进入扫描循环: a.递减DAC值:将DAC值减1。 b.等待DAC建立:DAC输出电压需要时间稳定。插入一个短暂的延时,通常等待几个微秒即可。具体时间参考数据手册中DAC的建立时间参数。 c.清除锁存器:向COMPSTSCLR寄存器的对应xLATCHCLR位写1,清除之前的锁存状态。 d.等待并检查锁存:等待一个足够长的时间(至少大于数字滤波器的最大延迟),然后读取COMPSTS寄存器中的xLATCH位。 e.判断与退出:如果xLATCH被置位(通常为1),说明比较器已经翻转,当前DAC值对应的电压V_dac_actual非常接近V_target。记录下这个DAC值Code_trip可选:为了更精确,可以再将DAC值加1,确认锁存器是否复位,从而将跳变点定位在两个DAC码之间。 f.循环:如果锁存未置位,则回到步骤a,继续递减DAC。

  3. 计算校准偏移:校准完成后,你得到了使比较器在V_target输入下翻转的实际DAC码Code_trip

    • 理论上,预期的DAC码应为Code_expected = (V_target / V_ref) * 4095
    • DAC的增益误差和偏移误差就体现在Code_tripCode_expected的差异上。对于阈值检测应用,我们通常不直接计算误差系数,而是直接使用Code_trip作为我们后续应用的设定值。例如,如果你想在V_target电压点触发保护,那么就将DAC的阈值寄存器设置为Code_trip
    • 如果你需要在一个电压范围内进行线性补偿,可以取两个或多个电压点进行校准,然后拟合出DAC的实际传递函数(增益和偏移)。

4.2 校准代码实现与注意事项

以下是基于Driverlib库的校准函数示例,假设校准CMPSS1的高比较器路径,且同相输入端已施加稳定的校准电压V_calib

uint16_t CMPSS1_CalibrateDAC(float V_ref, float V_calib) { uint16_t dacCode = 0x0FFF; // 从最大值开始 uint16_t tripCode = 0x0000; bool tripFound = false; // 准备工作:禁用迟滞,配置一个较宽松的滤波器用于校准(抗微小噪声) CMPSS_setHysteresis(CMPSS1_BASE, CMPSS_HYST_DISABLE); CMPSS_FilterConfig calFilterConfig = {3, 2, 9, CMPSS_FILTER_MAJORITY}; // 小窗口,快速响应 CMPSS_configFilterHigh(CMPSS1_BASE, &calFilterConfig); CMPSS_initFilterHigh(CMPSS1_BASE); CMPSS_configOutputsHigh(CMPSS1_BASE, CMPSS_TRIP_LATCH, CMPSS_TRIPOUT_LATCH); // 使用锁存输出 // 开始向下扫描 for(; dacCode > 0; dacCode--) { // 步骤a: 设置DAC值 CMPSS_setDACValueHigh(CMPSS1_BASE, dacCode); // 步骤b: 等待DAC稳定 (假设需要 > 1us) DEVICE_DELAY_US(2); // 使用Device库的微秒延时函数 // 步骤c: 清除高比较器锁存 CMPSS_clearFilterLatchHigh(CMPSS1_BASE); // 步骤d: 等待滤波器稳定 (等待时间应大于滤波器最大延迟) // 滤波器延迟 ~ (SAMPWIN+1)*(CLKPRESCALE+1)*T_sysclk = 4*10*5ns=200ns DEVICE_DELAY_US(1); // 等待1us,足够 // 步骤e: 检查锁存状态 if(CMPSS_getStatus(CMPSS1_BASE) & CMPSS_STS_HI_LATCH) { tripCode = dacCode; tripFound = true; // 可选:双重验证 // CMPSS_setDACValueHigh(CMPSS1_BASE, dacCode + 1); // DEVICE_DELAY_US(2); // CMPSS_clearFilterLatchHigh(CMPSS1_BASE); // DEVICE_DELAY_US(1); // if(!(CMPSS_getStatus(CMPSS1_BASE) & CMPSS_STS_HI_LATCH)) { // tripCode = dacCode; // 确认跳变点在dacCode和dacCode+1之间 // } break; } } if(!tripFound) { // 处理错误:扫描到0仍未触发,可能是V_calib电压过高或硬件连接问题 // 可以返回一个错误码或默认值 tripCode = (uint16_t)((V_calib / V_ref) * 4095.0f); // 使用理论值 } // 恢复应用所需的滤波器配置和迟滞设置 // ... (此处恢复之前的配置) return tripCode; // 返回校准得到的DAC码 }

校准实战心得

  1. 环境要“静”:校准必须在系统最安静的时候进行,比如PWM关闭、负载稳定时。任何电源纹波或噪声都会导致跳变点抖动,使校准值不唯一。
  2. 电压要“准”:施加的V_calib必须尽可能精确。建议使用高精度基准源或经过校准的ADC通道来确认这个电压。
  3. 温度影响:比较器和DAC的偏移会随温度漂移。对于高精度应用,可能需要在不同工作温度点进行校准,并存储补偿曲线。
  4. DAC建立时间:数据手册中DAC的建立时间(Settling Time)是关键参数。如果等待时间不足,DAC输出电压未稳定就进行比较,校准会出错。我通常保守地等待数据手册规定时间的2-3倍。
  5. 校准结果的存储与应用:校准得到的tripCode应该存储在非易失性存储器(如Flash)中。每次系统上电初始化CMPSS时,从存储器读取该值并写入DAC阴影寄存器(DACHVALS),然后通过触发(如软件强制加载或EPWMSYNCPER)将其加载到活动寄存器。

5. 高级主题:与ePWM的协同及常见问题排查

CMPSS很少孤立工作,它与ePWM模块的联动是实现高级控制与保护功能的关键。

5.1 EPWMSYNCPER信号与同步清除

EPWMSYNCPER信号是连接CMPSS与ePWM的桥梁。它由ePWM的时基模块产生,在每个PWM周期开始时产生一个脉冲。

  • 作用1:同步加载DAC值。在斜坡发生器和DAC影子寄存器加载中,COMPDACCTL[SWLOADSEL]位可以选择在EPWMSYNCPER脉冲时,将影子寄存器的值加载到活动寄存器。这对于在固定的、与PWM同步的时刻更新比较阈值至关重要,可以避免在PWM周期中间阈值突变导致的不确定性。
  • 作用2:同步清除滤波器锁存。通过设置COMPSTSCLR寄存器中的xSYNCCLREN位,可以使能EPWMSYNCPER信号自动清除滤波器的锁存输出。这在周期性系统中非常有用。例如,在每个PWM周期开始时清除一次故障锁存,如果该周期内发生了故障,锁存器置位并触发保护;新的周期开始,锁存器自动清零,准备检测新的故障。这种机制实现了“逐周期保护”。

一个关键警告:技术手册特别指出,如果ePWM的时基计数器(TBCTR)和周期寄存器(TBPRD)都设置为0,EPWMSYNCPER会保持为高电平。此时,如果COMPDACCTL[SWLOADSEL]=1,DAC值会立即从影子寄存器加载,而不是在同步边沿。这可能导致不可控的行为。因此,务必先正确配置并启动ePWM模块(确保TBPRD非零且TBCTR在计数),然后再将CMPSS的SWLOADSEL位设置为1。

5.2 常见问题排查速查表

在实际项目中,CMPSS数字滤波器的问题五花八门。下面是我总结的一些常见症状、原因及排查思路,做成表格方便你快速对照:

问题现象可能原因排查步骤与解决方法
滤波器无输出,或输出常高/常低1. 初始化序列错误或遗漏。
2. 比较器未使能或配置��误(如输入源选错)。
3. 滤波器参数过于苛刻(如THRESH >= SAMPWIN)。
4.FILINIT未执行或执行时机不对。
1. 严格对照第2章的6步序列检查代码。
2. 用示波器或读取COMPSTS寄存器,确认比较器原始输出(COMPxSTS位)是否随输入变化。
3. 检查SAMPWINTHRESH设置,确保THRESH < SAMPWIN
4. 确保在比较器稳定输出后,再执行FILINIT操作。
输出响应极慢,延迟远大于计算值1.CLKPRESCALE值设置过大。
2. 误用了锁存路径且未正确清除锁存。
1. 重新计算并检查CLKPRESCALE寄存器值。
2. 如果使用锁存,检查是软件清除还是通过EPWMSYNCPER清除。确认清除机制正常工作。
校准结果重复性差,每次上电跳变点不同1. 校准输入电压V_calib不稳定或有噪声。
2. DAC建立时间等待不足。
3. 系统电源或参考电压V_ref不稳定。
4. 未禁用迟滞。
1. 用示波器检查校准电压的纹波,确保是干净的直流。
2. 增加DEVICE_DELAY_US()的延时值。
3. 检查电源和参考电压电路的质量。
4. 校准前确认COMPHYSCTL寄存器中迟滞已关闭。
与ePWM联动时,保护动作不一致或错拍1.EPWMSYNCPER信号未正确连接或ePWM未正确配置。
2. CMPSS输出到ePWM Trip-Zone的路径未通过Output X-Bar正确映射。
3. ePWM的Trip-Zone子模块未正确配置(如选择异步路径、动作条件等)。
4. 时序问题:CMPSS延迟 + ePWM响应延迟 > 允许的保护时间。
1. 检查ePWM时基配置,确认EPWMSYNCPER能正常产生。
2. 使用CCS的寄存器查看器和GPIO翻转功能,验证CMPSS输出信号能否到达ePWM输入引脚。
3. 仔细检查ePWM的Trip-Zone配置寄存器(TZSEL,TZCTL,TZEINT等)。
4. 精确计算总延迟,必要时调整PWM死区时间或提高CMPSS滤波器带宽(牺牲一些抗噪性)。
使能CMPSS时钟门控后功能异常在CMPSS运行时关闭了其模块时钟。手册明确指出,关闭时钟会冻结斜坡发生器、同步块和数字滤波器的状态。除非在系统低功耗模式中刻意为之,否则不要在CMPSS工作时动态开关其时钟。如果关闭了时钟,重新使能后需要重新初始化滤波器吗?根据描述,时钟恢复后模块会恢复到之前状态,但为了安全起见,我建议重新执行一遍初始化序列,特别是FILINIT

调试时,最有效的工具是CCS的寄存器实时观察窗口高速示波器。通过寄存器观察,你可以确认每一步配置是否写入成功;通过示波器,你可以同时捕捉模拟输入信号、比较器原始输出、滤波器后输出以及最终的ePWM动作信号,直观地看到信号链上每一级的延迟和波形,任何问题都无处遁形。

最后,关于CMPSS的更多高级功能,如斜坡发生器(Ramp Generator)用于产生动态变化的阈值,在峰值电流控制等应用中非常有用。其核心是RAMPSTS寄存器在EPWMSYNCPER触发下从RAMPMAXREF开始递减,当减到0或比较器触发时,可以重新加载。这部分的配置涉及COMPDACCTL[DACSOURCE]RAMPSOURCERAMPLOADSEL等寄存器,思路与数字滤波器配置一脉相承:理解每个模块的工作时序,严格按照数据手册的步骤进行配置和同步。掌握了数字滤波器和校准这两大核心,再去理解斜坡发生器就会容易得多。