TMS320F28004x DAC与CMPSS模块:偏移校准、时序依赖与实战配置详解

1. 项目概述与核心价值

在电机驱动、数字电源或者任何需要精密模拟信号输出的实时控制系统中,数字模拟转换器(DAC)和比较器子系统(CMPSS)往往是决定系统性能上限的关键模块。很多工程师在初次接触TMS320F28004x这类高性能MCU时,可能会觉得配置DAC输出一个固定电压、或者让CMPSS产生一个跳变信号,照着例程做就能跑通,似乎没什么难度。但当你真正要把这些模块用到对噪声敏感、对响应速度要求严苛的闭环控制里,比如无刷电机的相电流重构,或者LLC谐振变换器的峰值电流保护,就会发现“跑通”和“用好”之间隔着一道鸿沟。

这道鸿沟里,填满了诸如“为什么我的DAC输出在2.5V参考时很准,换成3.3V就有几十毫伏的偏差?”、“CMPSS配置好了但偶尔会误触发,加了数字滤波反而延迟太大怎么办?”、“斜坡发生器怎么就和我的PWM周期对不上了?”这类实际问题。这些问题往往不能单靠查数据手册的电气参数表解决,它们根植于模块的架构设计、寄存器间的联动逻辑以及校准策略。本文的目的,就是和你一起深挖TMS320F28004x的DAC与CMPSS模块,不满足于简单的功能启用,而是聚焦在 偏移校准 寄存器间的时序依赖 以及 CMPSS在复杂场景下的实战配置 这些容易踩坑的细节上。我会结合手册中的要点和实际调试中的经验,把配置背后的“为什么”讲清楚,并提供可直接复用的校准流程和配置框架,帮助你在下一个高精度实时控制项目中,让这些模拟外设真正稳定、可靠地工作起来。

2. DAC模块深度解析与偏移校准实践

DAC模块是将控制器数字世界决策结果转化为模拟世界执行命令的“喉舌”。在F28004x上,它是一个12位、带输出缓冲的DAC,但它的精度不仅仅取决于这12位的分辨率,更取决于其内部的校准机制。

2.1 DAC架构与核心寄存器精讲

在开始校准前,必须理解几个核心寄存器是如何协同工作的。这不仅仅是知道它们的功能,更要明白操作它们的先后顺序和潜在陷阱。

DACCTL (DAC控制寄存器) :这是DAC的“大脑”。其中几个关键位决定了DAC的行为模式:

  • DACREFSEL (位0) :参考电压选择。这是校准的 前提 0 表示使用外部引脚 VDAC VSSA 作为参考; 1 表示使用内部ADC的参考电压 VREFHI VSSA 。这个选择直接影响DAC的输出范围。例如,当 VDAC=3.3V 时,DAC输出范围为0~3.3V;当使用内部 VREFHI (通常为2.5V或3.0V,取决于配置)时,范围则相应变化。 关键点 :偏移校准值是在特定参考电压下(通常是内部2.5V参考)标定的,切换参考源后必须重新评估或调整偏移量。
  • LOADMODE (位2) :DACVALA加载模式。 0 表示在下一个系统时钟(SYSCLK)加载; 1 表示在指定的EPWMSYNCPER信号边沿加载。这个配置对于需要与PWM周期严格同步的应用(如生成与PWM死区对齐的模拟指令)至关重要。 但这里有一个巨坑 :手册15.2.3节明确指出,如果EPWM模块的 TBCTR TBPRD 寄存器都为0, EPWMSYNCPER 信号会保持为高电平,导致 DACVALA 立即从 DACVALS 加载, 无视 LOADMODE 的设置。因此, 务必先配置并启动EPWM模块,使其产生正常的同步信号,然后再将 LOADMODE 设为1 。错误的顺序会导致同步功能失效,输出时序混乱。
  • SYNCSEL (位[7:4]) :选择使用哪个EPWM模块的 EPWMSYNCPER 信号。这实现了DAC输出与多个PWM模块中某一个的精确同步。

DACVALS 与 DACVALA (影子与活动值寄存器) :这是典型的影子寄存器架构,用于实现无毛刺的数值更新。你写入 DACVALS (影子寄存器),然后在指定的同步事件(由 LOADMODE SYNCSEL 决定)发生时, DACVALS 的值被安全地传输到 DACVALA (活动寄存器),从而立即改变DAC的实际输出电压。这种机制确保了在复杂的实时控制循环中,DAC输出的更新是原子性的,不会在传输过程中产生中间状态的错误电压。

DACTRIM (DAC修调寄存器) :校准的核心所在。其低8位 OFFSET_TRIM 是一个 有符号 的补码值,范围从-128到+127。这个值会在DAC内部被转换为一个微小的模拟电压偏移量,与DAC的输出相加或相减,用以补偿制造工艺引入的固有零位误差。

2.2 偏移误差的本质与校准原理

手册15.2.2节对偏移误差(Zero offset error)的定义非常关键: 在中间码(2048,对于12位DAC即半量程)时,实际输出电压与理想值(参考电压的一半)的差值 。假设参考电压 VREF = 2.5V ,理想情况下,写入 DACVAL=2048 ,输出应为 1.25V 。如果实际测量为 1.23V ,那么偏移误差就是 -20mV

为什么校准如此重要?因为这个误差是 固定的系统误差 。无论你输出什么电压,这个 -20mV 的偏差都会叠加在上面。在开环应用中,这可能只是精度损失;但在闭环控制中,这个固定偏差会被积分器不断累积,可能导致系统稳态误差甚至不稳定。

芯片出厂时,TI的 Device_cal() 函数会在特定条件下(通常是 VREF=2.5V )计算出一个初始的 OFFSET_TRIM 值并写入。 但请注意 :这个校准值仅在出厂测试的特定参考电压下最优。一旦你改变了DAC的参考电压(例如,将 DACREFSEL 从内部 VREFHI 改为外部 VDAC=3.3V ),原有的 OFFSET_TRIM 值就不再准确。因为DAC内部的误差源其绝对值(以mV计)可能不变,但相对于新的满量程电压,其相对误差发生了变化。因此,在非2.5V参考电压下使用DAC,手动进行偏移校准是保证精度的必要步骤。

2.3 实战:基于DAC_tuneOffsetTrim()的校准流程

C2000Ware提供了 DAC_tuneOffsetTrim() 函数来辅助校准。但函数本身只是个工具,理解其背后的操作流程和硬件设置才是关键。下面是一个可操作的校准步骤:

  1. 硬件准备

    • 将DAC输出引脚(如 DACOUTA )连接至一个高精度数字万用表(建议6位半)或高精度ADC的输入通道,用于测量实际电压。
    • 确定并固定你的DAC参考电压( VDAC 或内部 VREFHI )。这是校准的基准,校准时和后续应用时必须一致。
    • 确保模拟地( VSSA )和数字地( VSS )之间连接良好,减少噪声干扰。
  2. 软件初始化

    • 配置DAC模块时钟并使能。
    • 配置 DACCTL 寄存器, 锁定你的参考电压选择 DACREFSEL )。
    • DACOUTEN 置1,使能输出缓冲器。
    • DACVALS 设置为中间码 2048 ,并确保 LOADMODE=0 (立即加载),让DAC输出目标电压。
  3. 执行校准函数

    // 假设使用DAC-A
    DAC_tuneOffsetTrim(DACA_BASE);
    

    这个函数内部会做一系列操作:它可能尝试写入不同的 OFFSET_TRIM 值,同时通过某种方式(通常需要配合ADC读取反馈,但函数本身是黑盒)评估输出,最终计算并写入一个优化的修调值。 重要提示 :调用此函数前,必须确保DAC已经按照上述步骤正确初始化并输出。同时,要查阅对应C2000Ware版本和芯片型号的文档或函数注释,确认其支持的参考电压模式。

  4. 验证与手动微调(可选但推荐)

    • 函数执行后,再次测量DAC在码字2048时的输出电压。
    • 如果误差仍超出你的应用允许范围(例如,数据手册标称的偏移误差范围),你可能需要手动微调。你可以读取当前 OFFSET_TRIM 值(使用 DAC_getOffsetTrim ),然后根据实测误差的方向和大���,手动增减该值,再次测量验证。
    • 手动调整的量化关系: OFFSET_TRIM 寄存器每个LSB对应的电压调整量,需要查阅芯片的 数据手册(Datasheet) 中的“DAC Offset Trim Step Size”参数,而不是技术参考手册(TRM)。这是一个关键区别,TRM讲功能,Datasheet给精度。
  5. 锁定寄存器 : 校准完成后,为了防止软件跑飞意外修改配置,建议使用 DAC_lockRegister 函数锁定 DACCTL DACVALS DACOUTEN 寄存器。

    // 锁定关键寄存器,KEY必须为0xA
    DAC_lockRegister(DACA_BASE, DAC_LOCK_CTL | DAC_LOCK_VALS | DAC_LOCK_OUTEN);
    

实操心得 :在校准过程中,最容易被忽略的是 电源和地的噪声 。如果测量时发现电压值在小范围内跳动,这很可能不是DAC的问题,而是电源噪声耦合进了测量系统。务必确保校准期间使用干净、稳定的电源,测量仪器的接地也要良好。此外, DAC_tuneOffsetTrim() 函数可能在某些非标准参考电压模式下工作不理想,这时手动校准流程(即写码字-测量-计算-写修调值)是更可靠的选择。

3. CMPSS模块架构与协同工作机制

比较器子系统(CMPSS)是一个为实时功率控制量身定做的混合信号模块。它不仅仅是一个简单的比较器,而是一个集成了可编程参考DAC、数字滤波器和斜坡发生器的“片上保护与控制电路”。

3.1 CMPSS核心组件功能拆解

模拟比较器(COMPH/COMPL) :核心判决单元。当正输入端(CMPINxP)电压高于负输入端电压时,输出高电平(数字1),反之输出低电平(0)。负输入端可由外部引脚或内部参考DAC驱动。 关键特性 :可配置迟滞(Hysteresis),这对于在噪声环境中防止比较器输出抖动至关重要。迟滞功能本质上是在跳变点附近创建一个“死区”,例如,上升阈值设为1.5V,下降阈值设为1.4V,只有电压变化超过这个窗口,输出才会改变。

内部12位参考DAC(DACH/DACL) :为比较器提供高精度的、可编程的阈值电压。其公式为: DACOUT = (DACVALA / 4096) * DACREF 。这里的 DACREF 可以是 VDDA VDAC ,通过 COMPDACCTL[SELREF] 选择。 特别注意 :手册16.3节有一个重要警告,当高、低两个DAC同时驱动比较器时,一个比较器的跳变可能会短暂扰动另一个DAC的输出(参数见数据手册“CMPSS DAC output disturbance”)。因此,在精密应用中,如果只用到一个比较器(比如只用COMPH),最好将不用的那个DAC(DACL)的值设置为0,以避免不必要的干扰。

数字滤波器 :消除比较器输出信号中的毛刺(Glitch)。其原理是一个可配置的“多数表决”窗口滤波器。你需要设置三个参数:

  • SAMPWIN :采样窗口大小(实际内部深度为 SAMPWIN+1 )。
  • THRESH :判决阈值(实际内部阈值为 THRESH+1 )。要求 SAMPWIN/2 < THRESH <= SAMPWIN
  • CLKPRESCALE :采样时钟分频(实际分频为 CLKPRESCALE+1 )。 只有当在采样窗口内,高电平(或低电平)的样本数达到或超过设定的阈值时,滤波器的输出才会改变。这能有效滤除窄于 (CLKPRESCALE+1) * (THRESH+1) * T_sysclk 的干扰脉冲。

斜坡发生器(Ramp Generator) :这是CMPSS用于峰值电流模式控制等应用的“灵魂”部件。它只能产生递减(Ramp Down)的斜坡。其核心寄存器 RAMPSTS 是一个16位计数器,其高12位( RAMPSTS[15:4] )会直接作为DACH的输入码值 DACHVALA 。在使能后,每个系统时钟周期, RAMPSTS 会减去 RAMPDECVALA 的值,从而产生一个线性下降的斜坡电压。 EPWMSYNCPER 信号用于重置 RAMPSTS 到初始值 RAMPMAXREFS ,从而实现斜坡与PWM周期的同步。

3.2 CMPSS与ePWM的深度联动:时序是关键

CMPSS的设计与ePWM模块紧密耦合,理解它们之间的信号交互是避免异步问题的关键。

EPWMSYNCPER信号 :如前所述,它用于同步DAC值的加载( COMPDACCTL[SWLOADSEL] )和重置斜坡发生器。手册16.6.1节再次强调了与DAC模块相同的警告: 如果ePWM的 TBCTR TBPRD 均为0, EPWMSYNCPER 会恒为高电平,导致立即加载,破坏同步逻辑 。因此,同样的原则适用:先配置并启动ePWM时基,再使能CMPSS中的同步加载功能。

EPWMBLANK信号 :这个信号通常来自ePWM的数字比较(DC)子模块的空白区(Blanking Window)。它可以用来扩展 LATCHCLR 信号的宽度。 LATCHCLR 用于复位滤波器和输出锁存器。在峰值电流控制中,你可能希望在每个PWM周期开始时(即开关管刚开通,电流上升阶段)的一小段时间内,屏蔽比较器跳变,防止开关噪声引起误触发。这时就可以用 EPWMBLANK 信号来拉长 LATCHCLR ,实现一个可编程的“盲区”。

CTRIPH/L信号 :这是CMPSS比较器(经过滤波和锁存后)的输出,直接连接到ePWM的跳闸区(Trip Zone)输入。一旦 CTRIP 信号有效,可以立即关闭PWM输出,实现硬件级的过流、过压保护,响应速度远快于软件中断。

3.3 CMPSS校准实战:确保跳变点的精确性

手册16.6.3节提供了一个非常实用的CMPSS校准流程,特别是当比较器的负端由内部DAC驱动时。这里我将其转化为更具体的操作步骤和代码思路:

校准前提

  • 在比较器正输入端(CMPINxP)施加一个稳定、已知的直流电压 V_target 。这可以是一个精密电源,或者通过一个电阻分压从 VDDA 得到。
  • 建议 暂时禁用迟滞 功能,因为迟滞会引入一个不确定的电压窗口,干扰对精确跳变点的判断。
  • 如果输入信号有噪声, 启用数字滤波器和输出锁存 。设置一个合理的滤波窗口(如 SAMPWIN=4, THRESH=3 ),以抑制噪声,同时不会引入过大延迟。

校准流程(递减扫描法)

  1. 初始化 :配置CMPSS,使能比较器,将负端输入源设置为内部DAC(例如DACH)。将 DACHVALS 设置为最大值0xFFF(对应DAC输出约等于 DACREF ),确保初始状态比较器输出为低(正端电压 < 负端电压)。
  2. 配置锁存 :使能输出锁存,这样比较器跳变会被捕获,便于软件查询。
  3. 扫描与判断
    uint16_t trip_code = 0;
    bool trip_detected = false;
    
    // 从最大值开始递减扫描
    for(uint16_t dac_val = 0xFFF; dac_val > 0; dac_val--)
    {
        // 1. 更新DAC影子寄存器
        CMPSS_setDACValueHigh(CMPSS1_BASE, dac_val);
        // 2. 等待DAC稳定(通常需要几个SYSCLK周期,可插入微小延时或查询稳定标志)
        DEVICE_DELAY_US(1); // 示例:延时1微秒
        // 3. 清除之前的锁存状态
        CMPSS_clearLatchHigh(CMPSS1_BASE);
        // 4. 再次等待,看是否有新的跳变被锁存
        DEVICE_DELAY_US(1);
        // 5. 检查锁存器状态
        if(CMPSS_getLatchStatusHigh(CMPSS1_BASE) == true)
        {
            trip_detected = true;
            trip_code = dac_val;
            break; // 找到跳变点,退出循环
        }
    }
    
    if(trip_detected)
    {
        // trip_code 就是使比较器翻转的DAC码值
        // 理想情况下,DAC输出 V_dac = (trip_code / 4096) * DACREF
        // 这个V_dac应该等于你施加的 V_target 加上 CMPSS的静态偏移误差(Static offset error)
        // 你可以根��此误差,在软件中设置一个补偿值,例如:
        // 你的目标跳变电压是1.5V,计算出的理论码值应为 theoretical_code。
        // 实测的 trip_code 是 actual_code。
        // 那么补偿量 compensation = theoretical_code - actual_code;
        // 后续设置阈值时,使用 (target_code - compensation) 即可。
    }
    
  4. 验证(可选) :找到 trip_code 后,可以将DAC值设为 trip_code + 1 ,确认比较器输出为低;再设为 trip_code ,确认输出为高。这可以验证跳变点的单调性。
  5. 恢复配置 :校准完成后,重新使能迟滞(如果需要),并根据应用需求调整滤波器参数。

注意事项 :这个校准过程需要在 实际工作的硬件环境和典型的温度条件 下进行。因为比较器和DAC的偏移都会随温度漂移。对于高精度应用,可能需要在不同温度点进行校准并建立查找表。此外,如果正输入端电压 V_target 未知,可以先用片内ADC去测量这个电压,再进行上述校准流程,实现闭环的阈值自整定。

4. 寄存器配置精要与Driverlib函数应用

直接操作寄存器可以带来极致的控制力和灵活性,而Driverlib库函数则提高了代码的可读性和可维护性。在实际项目中,我通常采用混合策略:用Driverlib完成初始化和常规操作,在需要极致优化或实现特殊时序时,直接访问寄存器。

4.1 关键寄存器配置速查表

下表总结了DAC和CMPSS模块中最关键、最容易出错的寄存器配置项及其含义:

模块 寄存器/字段 推荐配置值(示例) 配置说明与注意事项
DAC DACCTL.DACREFSEL 0 或 1 0 : 使用外部 VDAC 引脚电压作为参考。 1 : 使用内部ADC的 VREFHI 作为参考。 切换后必须重新评估偏移
DACCTL.LOADMODE 1 (同步加载) 设为1以使用 EPWMSYNCPER 同步加载。 致命陷阱 :务必在配置并启动对应EPWM模块 之后 才设置此位。
DACCTL.SYNCSEL 0~7 选择同步源,例如0对应 EPWM1SYNCPER 。确保与所选的EPWM实例匹配。
DACTRIM.OFFSET_TRIM 由校准决定 有符号8位数。使用 DAC_tuneOffsetTrim() 或手动校准后写入。 非2.5V参考时必须校准
DACLOCK.KEY 0xA 写锁存寄存器时必须同时写入密钥0xA,且必须16位整体写入。
CMPSS COMPDACCTL.SELREF 0 或 1 选择内部DAC的参考电压,同DAC模块的 DACREFSEL
COMPDACCTL.SWLOADSEL 1 (同步加载) 同步加载内部DAC值。 同DAC,需在EPWM启动后配置
CTRIPH/L (信号) 连接到 ePWM X-BAR 在SysConfig或代码中,需将 CTRIPH 信号映射到ePWM的跳闸输入源,例如 TZ1
CMPSSCTL.HYSTCTL 根据噪声水平设置 设置迟滞电平(如10mV, 20mV)。噪声大时用较大迟滞防抖。
数字滤波器 ( FILTERCTL ) SAMPWIN=7, THRESH=5, CLKPRESCALE=0 示例:窗口深度8,需6个相同样本才翻转,每个SYSCLK采样一次。调整 CLKPRESCALE 可改变抗脉冲宽度。
RAMPCTL.RAMPSOURCE 1 (使能斜坡) 使能斜坡发生器,DACH值由 RAMPSTS 提供。
RAMPMAXREFS 根据峰值电流设定 斜坡起始值,对应DACH的最大值。通常与电流采样放大器的最大输出对应。
RAMPDECVALA 根据下降斜率设定 每个SYSCLK周期 RAMPSTS 的递减值,决定了斜坡的下降速度。斜率 = (RAMPDECVALA / 4096) * DACREF / T_sysclk

4.2 Driverlib函数使用范例与陷阱规避

Driverlib极大简化了配置。以下是一些关键函数的使用示例和需要注意的地方:

DAC模块初始化与同步配置

#include "driverlib.h"

void DAC_InitWithSync(void)
{
    // 1. 初始化DAC模块(使能时钟等)
    DAC_initModule(DACA_BASE);

    // 2. 配置参考电压(假设使用内部ADC参考)
    DAC_setReferenceVoltage(DACA_BASE, DAC_REF_ADC_VREFHI);

    // 3. 【先】配置并启动相关的EPWM模块,例如EPWM1
    // ... EPWM1配置代码,确保TBCTR和TBPRD不为0 ...
    EPWM_enableSyncSignal(EPWM1_BASE); // 使能同步信号输出

    // 4. 【后】配置DAC为同步加载模式,并选择EPWM1的同步信号
    DAC_setLoadMode(DACA_BASE, DAC_LOAD_SYNC); // 对应 LOADMODE=1
    DAC_setPWMSyncSignal(DACA_BASE, DAC_PWMSYNC_EPWM1); // 对应 SYNCSEL=0

    // 5. 设置初始输出值(写入影子寄存器)
    DAC_setShadowValue(DACA_BASE, 2048); // 输出中间值

    // 6. 使能DAC输出
    DAC_enableOutput(DACA_BASE);

    // 7. 执行偏移校准(可选,但推荐)
    DAC_tuneOffsetTrim(DACA_BASE);
}

关键点 :步骤3和4的顺序绝对不能颠倒。如果先执行步骤4,此时EPWM1可能还未正确初始化, TBCTR TBPRD 可能为0,会导致 EPWMSYNCPER 恒高, LOADMODE=1 失效,DAC值立即加载,失去了同步意义。

CMPSS配置与斜坡发生器设置

void CMPSS_InitForPeakCurrentMode(void)
{
    // 1. 初始化CMPSS1模块
    CMPSS_initModule(CMPSS1_BASE);

    // 2. 配置内部DAC(高边比较器用)
    CMPSS_configDACHigh(CMPSS1_BASE, CMPSS_DAC_REF_VDDA, 0); // 使用VDDA参考,初始值0
    CMPSS_enableDACHigh(CMPSS1_BASE); // 使能高边DAC

    // 3. 配置比较器正输入端为外部引脚(例如CMPIN1P)
    // 注意:此配置通常在GPIO多路复用器中设置,将特定引脚功能选为CMPSS输入。
    // 假设已通过GPIO_setPinConfig(GPIO_0_CMPSS1IN1P)完成。

    // 4. 配置数字滤波器(抗噪声)
    CMPSS_configFilterHigh(CMPSS1_BASE, 7, 5, 0); // SAMPWIN=7, THRESH=5, CLKPRESCALE=0

    // 5. 配置斜坡发生器
    CMPSS_configRampHigh(CMPSS1_BASE, 4095, 10, 0); // RAMPMAXREFS=4095, RAMPDECVAL=10, RAMPDLY=0
    CMPSS_enableRampHigh(CMPSS1_BASE); // 使能斜坡发生器
    CMPSS_setDACSourceHigh(CMPSS1_BASE, CMPSS_DAC_SOURCE_RAMP); // DACH值来自斜坡

    // 6. 配置同步信号(同样,先确保EPWM已配置)
    CMPSS_setSyncLoadHigh(CMPSS1_BASE, CMPSS_SYNC_LOAD_ENABLE); // SWLOADSEL=1
    // 假设使用EPWM1的SYNCPER
    // 注意:Driverlib可能没有直接设置SYNCSEL的函数,可能需要直接写寄存器
    HWREGH(CMPSS1_BASE + CMPSS_O_COMPDACCTL) |= (0 << 4); // 设置SYNCSEL为0 (EPWM1)

    // 7. 使能比较器输出至CTRIPH,并连接到ePWM跳闸区
    CMPSS_enableOutputHigh(CMPSS1_BASE); // 使能CTRIPH输出
    // 在ePWM X-BAR配置中,将CMPSS1_CTRIPH映射到EPWM_TZ1等。
}

斜坡斜率计算 :假设系统时钟 SYSCLK = 200MHz ,周期 T_sysclk = 5ns RAMPDECVALA = 10 DACREF = VDDA = 3.3V 。则DAC每个LSB对应的电压为 3.3V / 4096 ≈ 0.806mV 。斜坡电压的下降斜率为: Slope = (0.806mV * 10) / 5ns = 1.612 V/μs 。你需要根据你的电流采样电路增益和期望的电流下降斜率来反推并设置 RAMPDECVALA 的值。

5. 常见问题排查与调试技巧实录

即使理解了所有原理,实际调试中依然会遇到各种问题。下面是我在项目中遇到的一些典型问题及解决方法。

5.1 DAC输出异常问题排查表

现象 可能原因 排查步骤与解决方法
无输出或输出为0 1. 输出未使能。
2. 参考电压错误或未连接。
3. 锁存寄存器被意外锁定。
1. 检查 DACOUTEN 寄存器是否为1。
2. 测量 VDAC VREFHI 引脚电压。检查 DACREFSEL 配置是否正确。
3. 检查 DACLOCK 寄存器是否锁定了 DACOUTEN 。尝试复位后重新配置。
输出值不准确,偏差固定 1. 偏移未校准(尤其在使用非2.5V参考时)。
2. 参考电压精度不够。
3. 负载过重,超出缓冲器驱动能力。
1. 执行偏移校准流程。
2. 使用高精度万用表测量参考电压引脚的实际值。
3. 检查DAC输出端的负载阻抗。F28004x的DAC输出缓冲器驱动能���有限(详见数据手册),驱动低阻抗负载会导致电压跌落。建议后级接高输入阻抗的运放跟随器。
输出值跳动(噪声大) 1. 电源/地噪声。
2. 数字信号串扰。
3. 测量仪器接地不良。
1. 检查模拟电源( VDDA )的滤波,确保有足够的去耦电容(如10uF钽电容+100nF陶瓷电容)。
2. 确保DAC输出走线远离高频数字信号线(如PWM、时钟)。
3. 使用示波器交流耦合观察噪声频谱,使用同轴电缆并确保示波器探头接地良好。
同步加载(LOADMODE=1)不工作 1. EPWM未正确配置, TBCTR TBPRD 为0。
2. SYNCSEL 选择错误。
3. EPWM同步信号未使能输出。
1. 最可能 :确认EPWM时基计数器已启动( TBCTR 在变化),且 TBPRD 不为0。
2. 核对 SYNCSEL 字段,确认其值与你想使用的EPWM实例号匹配(0对应EPWM1)。
3. 检查EPWM配置,确认已调用 EPWM_enableSyncSignal() 或设置了相应寄存器以输出 EPWMSYNCPER

5.2 CMPSS误触发或响应延迟问题

  • 问题 :在功率开关管动作时,CMPSS频繁误触发,但实际电流/电压并未超标。

    • 分析 :这通常是开关噪声通过寄生耦合到了比较器的输入引脚或电源。
    • 解决
      1. 硬件 :在比较器正/负输入引脚靠近芯片处添加小电容(如100pF)到模拟地,构成低通滤波器。确保电流采样电阻的走线尽可能短,并采用开尔文连接。
      2. 软件 启用并合理配置迟滞 。根据噪声幅度,设置 HYSTCTL 为10mV或20mV。 启用数字滤波器 。根据噪声脉冲的典型宽度,设置 CLKPRESCALE SAMPWIN 。例如,如果噪声脉冲宽度小于50ns,系统时钟200MHz,可以设置 CLKPRESCALE=1 (每2个时钟采样一次), SAMPWIN=3 (4个样本窗口), THRESH=3 (需3个相同样本),这样能滤除宽度小于 4 * 10ns = 40ns 的毛刺。
      3. 利用EPWMBLANK :在PWM开通后的一段短时间内(即电流上升初期,噪声最大),使用 EPWMBLANK 信号拉高 LATCHCLR ,强制滤波器输出为0,屏蔽这段时间内的任何跳变。
  • 问题 :CMPSS响应过慢,导致过流保护不及时。

    • 分析 :延迟主要来自数字滤波器和同步器。
    • 解决
      1. 权衡滤波与速度 :减小 SAMPWIN CLKPRESCALE 可以降低延迟,但抗噪能力会下降。需要在实验中找到平衡点。
      2. 使用异步路径 :CMPSS的 CTRIP 信号有 异步 (不经滤波和同步)和 同步 (经滤波)两条输出路径。对于最紧急的硬件保护(如直通短路),应将 CTRIP 的异步输出直接连接到ePWM的跳闸输入(通过X-BAR配置),实现纳秒级响应。而将同步输出用于软件中断或其它非紧急控制。
      3. 测量实际延迟 :可以通过GPIO翻转来测量。在比较器输入一个阶跃信号的同时,用一个GPIO口输出高电平,将CMPSS的 CTRIPOUT 连接到另一个GPIO口并配置为输入,在中断中检测到 CTRIPOUT 变高时再拉低第一个GPIO口,用示波器测量两个GPIO信号上升沿之间的时间差,即为CMPSS(含滤波器)的总延迟。

5.3 斜坡发生器与PWM不同步问题

  • 现象 :在峰值电流控制中,每个周期的电流峰值不一致,看起来斜坡没有在PWM周期开始时正确复位。
  • 排查
    1. 检查 EPWMSYNCPER 连接 :确认CMPSS的 SYNCSEL 配置与产生同步信号的EPWM模块一致。
    2. 验证EPWM配置 :确保该EPWM模块的时基工作在“递增-递减”计数模式时, EPWMSYNCPER 在计数器等于0(或等于周期值)时产生。这是最常见的同步点。
    3. 检查 RAMPMAXREFS 加载时机 RAMPMAXREFS 是影子寄存器,其值加载到活动寄存器 RAMPMAXREFA 发生在 DACSOURCE 的上升沿或 EPWMSYNCPER 的上升沿。确保你在 EPWMSYNCPER 事件 之前 就写好了 RAMPMAXREFS 的值。通常在一个PWM周期开始时(CTR=0的中断里)更新下一个周期的斜坡起始值。
    4. 使用示波器调试 :将 CTRIPH 信号输出到一个GPIO,同时观察PWM波形和这个GPIO。你应该看到 CTRIPH 在每个PWM周期内,在斜坡下降到低于正端电压时触发,并且触发点随时间(即随斜坡)线性变化。如果触发点随机漂移,说明同步有问题。

调试CMPSS和DAC这类混合信号模块, 示波器是必不可少的工具 。同时观察模拟输入(电流采样电压)、DAC输出的斜坡(或阈值)、数字化的 CTRIP 信号以及最终的PWM输出,可以让你清晰地看到信号链中每一步的状态,快速定位问题是出在模拟前端、DAC阈值、还是比较器逻辑上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值