TMS320F28003x DAC与CMPSS模块实战:从寄存器配置到电机驱动应用

1. 项目概述与核心价值

在电机驱动、数字电源或者任何需要精密模拟信号交互的实时控制系统中,我们常常面临一个核心挑战:如何让那颗“数字大脑”(MCU)与“模拟世界”进行高效、可靠的对话。这个对话的桥梁,就是数据转换器。TMS320F28003x作为TI C2000系列中的明星产品,其内置的缓冲型数模转换器(Buffered DAC)和比较器子系统(CMPSS)正是为此而生。它们不是简单的片上外设,而是经过精心设计、深度集成到实时控制架构中的高性能模拟前端。

很多工程师初次接触这些模块时,可能会被手册里密密麻麻的寄存器位域和长长的函数列表吓退,感觉像是在操作一个复杂的“黑盒”。实际上,一旦你理解了其设计哲学和配置逻辑,它们就会变成你手中最得力的工具。DAC模块让你能够以12位的分辨率,稳定地输出一个可编程的直流电压或复杂的波形(如正弦波、三角波),为系统提供一个精准的参考基准或激励信号。而CMPSS模块,则像一位不知疲倦的哨兵,时刻比较着外部输入电压与你设定的阈值(由内部的参考DAC提供),一旦越界,立即通过数字滤波后触发动作,直接联动ePWM模块进行保护,这对于实现峰值电流控制、过压/欠压保护等关键功能至关重要。

本文将从一线开发者的视角,彻底拆解TMS320F28003x的DAC与CMPSS模块。我不会仅仅罗列寄存器手册的内容,而是结合我多年在伺服驱动和光伏逆变器项目中的实战经验,带你从模块的工作原理、寄存器配置的底层逻辑,一直走到Driverlib函数库的高效应用。你会明白每一个配置位为什么要这么设,在哪些场景下会出问题,以及如何利用TI提供的软件抽象层来既保证效率又提升代码的可维护性。我们的目标很明确:让你不仅能“配通”这些模块,更能“用好”、“用精”,在下一个实时控制项目中,让这些模拟接口成为你系统稳定性和性能的坚实保障。

2. DAC模块深度解析:从原理到实战配置

DAC模块,顾名思义,负责将数字代码转换成模拟电压。TMS320F28003x的缓冲型DAC(Buffered DAC)之所以称为“缓冲型”,是因为它在核心的12位DAC之后,集成了一级输出缓冲放大器。这级缓冲器至关重要,它极大地增强了DAC的带负载能力,允许其直接驱动一定的外部负载(例如,后续运放电路、作为比较器参考等),而无需额外添加运放,既节省了PCB空间和BOM成本,又简化了设计。

2.1 DAC核心工作原理与关键寄存器映射

要驾驭DAC,必须理解其数据流和控制流。核心寄存器只有几个,但每个都承载着特定功能:

  1. DACCTL (控制寄存器):这是DAC的“大脑”。它决定了DAC的参考电压源(DACREFSEL)、增益模式(MODE)、加载模式(LOADMODE)以及同步信号选择(SYNCSEL)。参考电压的选择直接决定了DAC的输出范围,是配置的第一步。
  2. DACVALS (影子寄存器)DACVALA (活动寄存器):这是TI外设设计中常见的“影子-活动”寄存器机制。DACVALS是你可以随时写入的目标值寄存器,而DACVALA是真正驱动DAC核心的当前值寄存器。通过LOADMODE位,你可以选择让DACVALS的值立即加载到DACVALA(下一个SYSCLK周期),或者等待指定的EPWMSYNCPER同步脉冲到来时才加载。后者对于需要与PWM开关频率严格同步的应用(如生成与PWM同频的调制波)是必不可少的。
  3. DACOUTEN (输出使能寄存器):顾名思义,控制DAC模拟电压的实际输出。务必注意:在使能输出前,必须确保DAC模块的时钟已开启,并且最好等待一段手册指定的上电稳定时间(Power-up Time),否则初始输出可能不稳定。
  4. DACLOCK (锁寄存器):这是一个安全特性。在关键系统(如电机控制)中,防止软件跑飞或意外写入导致DAC输出突变,从而引发系统故障。通过对DACLOCK寄存器写入特定密钥(0xA),可以永久锁定DACCTLDACVALSDACOUTEN寄存器,直到下一次系统复位。这是一个“一次性”操作,使用时需极其谨慎。
  5. DACTRIM (偏移调整寄存器):用于微调DAC的零点偏移误差。出厂时,TI会通过Device_cal()函数在2.5V参考电压下进行校准。如果你使用其他参考电压(如1.65V内部参考或外部VDAC),可能需要调用DAC_tuneOffsetTrim()函数重新调整,以确保在中间码(2048)时输出准确的VREF/2电压。

2.2 参考电压与增益模式:配置的艺术与陷阱

参考电压和增益模式的组合决定了DAC输出的最大范围,配置不当轻则输出范围受限,重则可能损坏外部电路或导致功能异常。根据手册中的增益模式组合表,我们可以总结出安全可用的配置:

DACREFSEL参考源MODE (增益)最大输出 (Vref=2.5V, VDDA=3.3V)适用场景与注意事项
0外部 VDAC0 (x1)2.5V最常用模式。需从外部引脚VDAC提供稳定、低噪声的参考电压(通常接2.5V或3.0V基准源)。
1内部 1.65V1 (x2)3.3V利用内部参考,增益后可达VDDA。需先配置ANAREF模块选择1.65V内部参考。
1内部 2.5V0 (x1)2.5V使用内部2.5V参考,无需外部基准。需配置ANAREF模块选择2.5V内部参考。
1外部 VREFHI0 (x1)2.5V使用ADC模块的高精度参考电压VREFHI(通常也为2.5V或3.0V)。

重要提示:表格中“不支持”的组合(如外部VDAC下使用x2增益)在硬件上可能无法正常工作或输出异常,务必避免。另外,无论何种配置,DAC的绝对输出电压绝不能超过VDDA和低于VSSA。输出缓冲器在接近电源轨(VDDA/VSSA)时会出现非线性,具体线性输出范围需查阅芯片数据手册的“Buffered DAC Linear Output Range”部分。

2.3 实战配置流程与Driverlib函数应用

理解了原理,我们来看如何用代码实现。TI的Driverlib库将寄存器操作封装成了直观的函数,大大提高了开发效率。下面是一个完整的DAC初始化与输出示例,我以最常用的“外部VDAC参考,同步于EPWM1”为例:

#include "driverlib.h" #include "device.h" void DAC_Example_Init(void) { // 步骤1:启用DAC模块时钟(通常在系统初始化时已统一开启,此处确认) SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DAC); // 步骤2:配置控制寄存器 - 使用Driverlib函数 // 设置参考电压为外部VDAC DAC_setReferenceVoltage(DACA_BASE, DAC_REF_VDAC); // 设置增益模式为x1(使用外部VDAC时,MODE必须为0) DAC_setGainMode(DACA_BASE, DAC_GAIN_1X); // 设置同步加载模式,并选择EPWM1的SYNCPER信号作为同步源 DAC_setLoadMode(DACA_BASE, DAC_LOAD_SYNC); DAC_setPWMSyncSignal(DACA_BASE, DAC_PWMSYNC_EPWM1); // 步骤3:写入初始值到影子寄存器 (例如,输出中间电压 1.25V,假设Vref=2.5V) // 计算数字码值: DACVAL = (Vout / Vref) * 4096 // 1.25V / 2.5V * 4096 = 2048 DAC_setShadowValue(DACA_BASE, 2048); // 步骤4:使能DAC输出 DAC_enableOutput(DACA_BASE); // 步骤5:(可选但推荐)等待DAC上电稳定时间,通常几个微秒 // 这里使用简单的循环延时,实际项目建议用定时器或检查状态位 DEVICE_DELAY_US(10); // 此时,DAC不会立即输出,因为LOADMODE设为同步模式。 // 需要等待EPWM1产生第一个SYNCPER脉冲后,DACVALA才会从DACVALS加载,输出生效。 } // 在需要更新DAC输出的地方,例如在EPWM的周期中断服务函数中: __interrupt void epwm1ISR(void) { // 计算新的DAC值(例如根据控制算法) uint16_t newDacValue = CalculateNewDACValue(); // 更新影子寄存器。由于配置为同步加载,此写入不会立即影响输出。 // 当下一个EPWM1 SYNCPER脉冲到来时,此值会自动加载到DACVALA并输出。 DAC_setShadowValue(DACA_BASE, newDacValue); // ... 其他中断处理代码 // 清除中断标志 EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE); }

关键点解析与避坑指南:

  • 同步与异步加载的选择LOADMODE的选择至关重要。在实时控制中,为了消除输出毛刺和确保时序一致性,强烈推荐使用同步模式(DAC_LOAD_SYNC。这样,DAC输出的所有变化都与PWM的开关周期严格对齐,避免了在PWM周期中间点切换电压可能引起的次谐波振荡或噪声。
  • EPWM同步信号的陷阱:手册中明确警告,如果EPWM模块的TBCTRTBPRD都设置为0,EPWMSYNCPER信号会保持高电平。这会导致DAC的同步逻辑失效,影子寄存器的值会立即加载到活动寄存器,无论LOADMODE如何设置。因此,务必先正确配置并启动EPWM模块(设置非零的周期值),再使能DAC的同步加载模式。
  • Driverlib的便利性:对比直接操作寄存器,DAC_setShadowValue()这样的函数不仅可读性更好,而且隐藏了寄存器位域操作的细节。例如,它会自动处理DACVALS寄存器中只有低12位有效的细节,防止你误写入高4位保留域。

3. CMPSS模块深度解析:系统的守护者

如果说DAC是“发声者”,那么CMPSS就是“监听者”和“裁判”。它在电源和电机控制系统中扮演着第一道硬件保护防线的角色,响应速度远超软件中断。一个CMPSS子系统包含两个独立的比较器(高比较器COMPH和低比较器COMPL)、两个12位参考DAC、两个数字滤波器和一路递减斜坡发生器。

3.1 比较器与参考DAC:设定动态阈值

每个比较器的正端(CMPINxP)通常连接需要监控的外部模拟信号(如电流采样电阻的电压、直流母线电压分压),负端则可以选择连接外部引脚或内部参考DAC的输出。参考DAC的工作原理与前文所述的缓冲DAC类似,但其输出仅供内部使用,用于设定一个精确的、可编程的跳变阈值。

这里有一个极其重要的硬件特性,手册用警告框突出,但很多工程师第一次会忽略:当DACH和DACL同时驱动两个比较器时,一个比较器的跳变(Trip)会暂时扰动另一个DAC的输出电压(DAC output disturbance)。扰动幅度和时间在数据手册中有明确参数。这意味着,如果你为过流保护和欠流保护分别设置了DACH和DACL,当电流超过高阈值触发COMPH时,DACL的输出会有一个短暂的波动。如果此时电流信号恰好在这个波动范围内,可能会引发COMPL的误触发。

设计守则

  1. 非对称使用:如果只使用一个比较器(比如只用COMPH做过流保护),请务必将另一个参考DAC的值设置为安全边界。不使用DACL时,设置DACLVALS = 0;不使用DACH时,设置DACHVALS = 4095(最大值)。这可以避免未使用的比较器因输入噪声而误触发,进而影响正在使用的DAC。
  2. 阈值间距:如果必须同时使用高低比较器,确保两个阈值之间的电压差大于数据手册中规定的“DAC输出扰动”幅度,并且在触发后的“DAC扰动时间”内,输入信号不会穿越因扰动而变化的另一个阈值区域。

3.2 数字滤波器:消除噪声误触发

比较器的输出是高速数字信号,直接连接到ePWM的Trip Zone或输出X-BAR。但实际硬件环境中,输入信号上难免有开关噪声毛刺。如果不经处理,一个短暂的毛刺就可能错误地关断PWM,导致系统工作异常。CMPSS的数字滤波器就是为了解决这个问题。

滤波器的工作原理基于一个可配置的采样窗口。你可以设置一个滤波时钟分频(CTRIPxDLY)和采样次数(CTRIPx)。只有当比较器输出在连续多个滤波时钟周期内都保持为有效状态(高或低),滤波后的输出(CTRIPOUT)才会改变。这能有效滤除窄于设定时间的干扰脉冲。

配置心得

  • 滤波时间的权衡:滤波时间越长,抗噪能力越强,但系统保护的响应速度会变慢。你需要根据系统中噪声的典型宽度和系统允许的保护延迟来折衷。例如,在100MHz的SYSCLK下,将滤波时钟设为系统时钟的32分频(FILTCLK = SYSCLK / 32),并设置采样次数为3,那么有效的滤波时间就是3 * (32 / 100e6) = 0.96us。这意味着宽度小于0.96us的毛刺会被滤掉。
  • 同步采样:为了与PWM开关同步,避免在开关时刻采样到不确定状态,可以启用滤波器的同步功能(FILTSYNCSEL),使其采样窗口与EPWMSYNCPER同步。

3.3 斜坡发生器:实现峰值电流控制的利器

这是CMPSS模块中最精妙的部分,专为峰值电流模式控制等应用优化。斜坡发生器能产生一个递减的斜坡信号,直接作为高比较器参考DAC(DACH)的输入。

工作流程

  1. 装载:当使能斜坡发生器(DACSOURCE=1)后,在选定的EPWMSYNCPER信号上升沿,RAMPSTS计数器会从影子寄存器RAMPMAXREFS中装载初始值。
  2. 延迟:随后,RAMPDLYA计数器开始递减(每个SYSCLK减1),在此期间斜坡保持初始值不变。这个延迟为你提供了在PWM周期开始后、斜坡开始下降前的一个“死区”时间。
  3. 递减:当RAMPDLYA减到0后,RAMPSTS开始每个SYSCLK周期减去RAMPDECVALA的值。
  4. 停止与重置:当高比较器触发(COMPHSTS上升沿)或RAMPSTS减到0时,递减停止。下一个EPWMSYNCPER信号会重置整个过程。

在峰值电流控制中的应用:在反激、Boost等变换器中,将电感电流采样信号接在CMPINxP,斜坡发生器的输出作为DACH的值。每个PWM周期开始(EPWMSYNCPER),斜坡从最大值开始下降。当电感电流上升,其采样电压超过下降的斜坡电压时,比较器翻转,触发ePWM的Trip,立即关闭当前周期的开关管,从而实现恒定峰值电流控制。通过调整RAMPMAXREFS(初始值)和RAMPDECVALA(下降斜率),可以精确控制峰值电流的大小和斜率补偿。

3.4 CMPSS完整配置示例与Driverlib应用

下面是一个配置CMPSS1,使用内部DACH作为参考,并启用数字滤波的示例。我们将其配置为过压保护功能:监控一个分压后的直流母线电压,当超过65V时(对应比较器正端输入2.5V),触发ePWM的Trip,强制关闭PWM。

#include "driverlib.h" #include "device.h" #define VREF_DAC 2.5f // DAC参考电压2.5V #define OVP_THRESHOLD 2.5f // 比较器负端阈值电压 (即DACH输出) #define SYS_VOLTAGE_DIVIDER_RATIO 26.0f // 母线电压分压比,例如65V->2.5V void CMPSS1_OVP_Init(void) { // 步骤1:启用CMPSS1模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1); // 步骤2:配置高比较器COMPH的参考DAC (DACH) // 选择DAC参考电压源为VDDA(内部,通常为3.3V) CMPSS_configDAC(CMPSS1_BASE, CMPSS_DAC_HIGH, CMPSS_DAC_REF_VDDA); // 计算DAC数字码值:DACVAL = (Vthreshold / VREF_DAC) * 4096 // 注意:这里Vthreshold是DAC的输出电压,我们设为2.5V。 // 但DAC的参考源是VDDA(3.3V),所以实际计算是 (2.5V / 3.3V) * 4096 ≈ 3103 uint16_t dacHighValue = (uint16_t)((OVP_THRESHOLD / 3.3f) * 4096.0f); CMPSS_setDACValueHigh(CMPSS1_BASE, dacHighValue); // 设置DAC值立即加载(非斜坡模式) CMPSS_setDACShadowLoadMode(CMPSS1_BASE, CMPSS_DAC_HIGH, CMPSS_LOAD_ON_NEXT_SYSCLK); // 步骤3:配置低比较器COMPL的参考DAC (DACL) - 本例未使用,设为0 CMPSS_setDACValueLow(CMPSS1_BASE, 0); // 步骤4:配置数字滤波器(针对COMPH输出) // 设置滤波时钟预分频,例如SYSCLK/16 CMPSS_setFilterClockPrescaler(CMPSS1_BASE, CMPSS_FILTER_CLK_HIGH, 15); // 分频值=15, 即16分频 // 设置滤波采样次数,例如连续6个滤波时钟周期高电平才认为有效触发 CMPSS_setFilterNumberOfSamples(CMPSS1_BASE, CMPSS_FILTER_HIGH, 5); // 采样值=5, 即6次 // 使能高比较器输出的滤波器 CMPSS_enableFilter(CMPSS1_BASE, CMPSS_FILTER_HIGH); // 步骤5:配置比较器输出极性(默认正输入>负输入输出高,符合过压触发逻辑,无需反转) // CMPSS_invertComparatorOutput(CMPSS1_BASE, CMPSS_COMP_HIGH); // 如果需要低电平触发则调用 // 步骤6:将滤波后的比较器输出(CTRIPH)连接到ePWM的Trip Zone输入 // 这通常需要通过配置Input X-BAR来实现。假设映射到ePWM1的Trip1输入。 // 注意:这是芯片级互联配置,通常使用GPIO_setTripZoneInput()或直接配置X-BAR寄存器。 // 以下为概念性代码,具体函数请参考最新Driverlib和手册。 // GPIO_setTripZoneInput(GPIO_TRIP1, GPIO_XBAR_INPUT_CMPSS1_CTRIPH); // 步骤7:使能CMPSS1模块 CMPSS_enableModule(CMPSS1_BASE); // 步骤8:(在ePWM模块中配置)配置ePWM1的Trip Zone,当CMPSS1触发时采取动作,如强制PWM输出低。 } // 在中断或主循环中,可以读取比较器状态 void CheckProtectionStatus(void) { // 读取高比较器原始输出状态(滤波前) bool rawTripH = CMPSS_getRawComparatorOutput(CMPSS1_BASE, CMPSS_COMP_HIGH); // 读取滤波后的输出状态(连接至ePWM Trip的信号) bool filteredTripH = CMPSS_getFilterOutput(CMPSS1_BASE, CMPSS_FILTER_HIGH); if(filteredTripH) { // 过压保护已触发 System_LogFault(FAULT_OVP); // ... 执行其他保护性操作 } }

配置要点与陷阱规避:

  • DAC参考源一致性:计算DACVAL时,必须使用你为DAC选择的实际参考电压(VDDAVDAC),而不是你想输出的目标电压。这是最常见的计算错误。
  • 滤波器配置顺序:建议先配置分频和采样次数,最后再使能滤波器。避免在配置过程中产生意外的滤波输出。
  • X-BAR配置:CMPSS的输出需要经过芯片内部的X-BAR(交叉开关)路由到ePWM或GPIO。这部分配置相对独立且关键,务必参考《TMS320F28003x Technical Reference Manual》中GPIO和ePWM章节关于X-BAR的详细说明,确保信号路径正确连通。
  • 斜坡发生器的使能:如果使用斜坡发生器,需要通过CMPSS_configRamp()函数进行详细配置,并设置DACSOURCE=1。此时,DACHVALS的值将由斜坡发生器提供,手动写入的DACHVALS将不起作用。

4. 寄存器直操作与Driverlib函数对照精讲

虽然Driverlib极大提升了开发效率,但理解其背后的寄存器操作对于调试和深入优化至关重要。当遇到Driverlib未覆盖的细微功能,或需要进行位级精确控制时,直接操作寄存器是必备技能。

4.1 DAC模块寄存器与函数映射详解

我们以DAC控制寄存器DACCTL为例,进行逐位解析:

位域功能描述Driverlib函数直接寄存器操作示例(假设使用DACA)
DACREFSEL参考电压选择 (0:VDAC, 1:VREFHI)DAC_setReferenceVoltage()DacaRegs.DACCTL.bit.DACREFSEL = 0;
MODE增益模式 (0:x1, 1:x2)DAC_setGainMode()DacaRegs.DACCTL.bit.MODE = 0;
LOADMODE加载模式 (0:立即, 1:同步)DAC_setLoadMode()DacaRegs.DACCTL.bit.LOADMODE = 1;
SYNCSEL同步信号选择 (0-15对应EPWM1-16)DAC_setPWMSyncSignal()DacaRegs.DACCTL.bit.SYNCSEL = 0;// 选择EPWM1
DACOUTEN输出使能DAC_enableOutput()/disableOutput()DacaRegs.DACOUTEN.bit.DACOUTEN = 1;
DACVALS影子值寄存器DAC_setShadowValue()DacaRegs.DACVALS.all = 2048;// 写入12位值,高4位保留

直接操作寄存器的注意事项

  • EALLOW保护DACCTLDACOUTENDACLOCKDACTRIM这些寄存器受EALLOW(仿真允许)保护。直接写入前必须用EALLOW;指令解锁,写入后用EDIS;指令重新锁定。Driverlib函数内部已经处理了这些。
    EALLOW; DacaRegs.DACCTL.bit.LOADMODE = 1; DacaRegs.DACCTL.bit.SYNCSEL = 0; EDIS;
  • 影子寄存器机制:写入DACVALS后,根据LOADMODE,值可能不会立即生效。读取DACVALA可以获取当前实际输出的数字码。
  • 锁寄存器(DACLOCK):直接操作时需一次性写入16位,且高4位KEY字段必须为0xA才能生效。一旦锁定,只有系统复位才能解除。除非在最终产品代码的初始化阶段出于安全考虑进行锁定,否则在开发调试阶段应避免使用。

4.2 CMPSS模块关键寄存器精析

CMPSS寄存器较多,我们聚焦最核心的配置:

  • COMPDACCTL (比较器DAC控制寄存器):主要控制参考DAC的电压源(SELREF)。
  • DACxVALA/VALS (x为H或L):与缓冲DAC类似,分别是活动值和影子值寄存器。Driverlib函数为CMPSS_setDACValueHigh()CMPSS_setDACValueLow()
  • CTRIPHFILCTL/CTRIPLFILCTL (高低比较器滤波控制寄存器):配置滤波时钟分频(CTRIPxDLY)和采样次数(CTRIPx)。对应的Driverlib函数是CMPSS_setFilterClockPrescaler()CMPSS_setFilterNumberOfSamples()
  • COMPCTL (比较器控制寄存器):控制比较器使能、滞后、输出极性等。Driverlib提供了CMPSS_enableModule(),CMPSS_disableHysteresis(),CMPSS_invertComparatorOutput()等函数。
  • RAMPCTL/RAMPMAXREFS/RAMPDECVALA等 (斜坡发生器寄存器):这是一个寄存器组。Driverlib提供了CMPSS_configRamp()这个高级函数来一次性配置多个参数,但理解其底层寄存器对调试有帮助:
    • RAMPMAXREFS:斜坡起始值(影子寄存器)。
    • RAMPDECVALA:每个SYSCLK周期递减的值,决定斜坡斜率。
    • RAMPDLYA:接收到EPWMSYNCPER后,延迟多少个SYSCLK才开始递减。
    • RAMPCTL:包含使能位DACSOURCE、加载选择位RAMPLOADSEL等。

寄存器操作与函数调用的选择策略

  • 初始化阶段:强烈建议使用Driverlib函数。它们代码更清晰,可读性强,且避免了直接操作寄存器可能带来的顺序错误或保护位遗漏。
  • 实时性要求极高的中断服务程序(ISR):如果只是更新一个DAC值或检查状态,直接操作寄存器可能比调用函数更快,因为省去了函数调用和返回的开销。例如,在高速��流环中断中,DacaRegs.DACVALS.all = newValue;这样一条指令就完成了更新。
  • 调试和探查:当遇到异常,需要查看某个特定状态位时,直接读取寄存器(如if(DacaRegs.DACVALA.bit.DACVALA != expectedVal))是最直接的方式。

5. 高级应用场景与实战经验分享

掌握了基础配置后,我们可以探索一些更高级的应用模式,这些模式在复杂的电力电子项目中非常常见。

5.1 双DAC协同工作:生成差分或特定范围电压

TMS320F28003x通常包含多个DAC模块(如DACA和DACB)。你可以独立控制它们,也可以让它们协同工作。

  • 差分输出:将DACA和DACB配置为相同的参考电压,然后编程输出一对数值,其电压差代表你需要的信息。虽然不如真正的差分DAC性能好,但在要求不高的场景下可以节省成本。
  • 扩展输出范围:假设你需要一个0-5V的输出,但DAC最大输出只有3.3V(VDDA)。你可以使用一个DAC输出0-3.3V,然后通过外部运放电路进行放大。更巧妙的方法是,如果你有外部精准的2.5V参考源给VDAC,并将DAC增益设为x2模式(需使用内部VREFHI且配置正确),理论上可以达到5V输出,但需注意绝对电压不能超过VDDA,且输出缓冲在高压下可能非线性加剧。

5.2 CMPSS在峰值电流模式控制中的完整实现

这是一个经典且重要的应用。以Boost PFC电路为例:

  1. 信号连接:电感电流通过采样电阻转换为电压信号,接入CMPSS的正输入引脚(CMPINxP)。
  2. 斜坡配置:使能CMPSS的斜坡发生器。将RAMPMAXREFS设置为对应最大峰值电流的DAC值。RAMPDECVALA根据你想要的斜率补偿量来设置。RAMPDLYA可以设置为一个很小的值或0。
  3. ePWM配置:配置一个ePWM模块(如EPWM1)产生固定的开关频率。将其SYNCPER输出连接到CMPSS作为斜坡启动信号。
  4. 联动配置:将CMPSS的滤波后输出CTRIPH通过X-BAR连接到该ePWM模块的Trip Zone输入(如TZ1)。
  5. 工作流程:每个PWM周期开始,ePWM的SYNCPER信号触发CMPSS斜坡从最大值开始下降。ePWM置高开关管。电感电流上升,其采样电压也上升。当采样电压超过下降的斜坡电压时,CMPSS触发,ePWM的Trip Zone立即动作,将开关管关闭。这样,每个周期的峰值电流都被限制在由斜坡初始值和斜率共同决定的动态阈值上。
  6. 软件干预:CPU可以在每个周期或每隔多个周期,根据电压环的输出(即电流指令),更新RAMPMAXREFS的影子寄存器,从而动态调整峰值电流限值。

5.3 利用同步机制消除开关噪声影响

在开关电源中,PWM开关时刻会产生巨大的电压/电流噪声,容易导致比较器误触发。CMPSS的滤波器和同步功能是应对此问题的第一道防线。此外,还可以利用ePWM的EPWMBLANK信号。

  • 消隐区(Blanketing):在PWM开关动作前后的一段短时间内,噪声是不可避免的。你可以配置ePWM产生一个EPWMBLANK信号,并将其连接到CMPSS。在EPWMBLANK有效期间,强制拉低CMPSS的输出(或忽略其输出),从而安全地屏蔽掉这段危险区的噪声干扰。这比单纯依赖数字滤波更可靠,因为它是模拟层面的抑制。

5.4 调试技巧与常见问题排查

  1. DAC无输出或输出不准

    • 检查时钟:首先确认SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DAC)已被调用。
    • 检查使能:确认DACOUTEN位已置1。
    • 测量参考电压:用万用表测量VDACVREFHI引脚电压,确保其准确稳定。
    • 计算验证:复核DACVAL的计算公式。输出电压 = (DACVAL / 4096) * 参考电压。如果使用x2增益,公式为输出电压 = (DACVAL / 4096) * 参考电压 * 2
    • 同步模式确认:如果使用同步模式,检查EPWM是否已正确运行并产生SYNCPER信号。可以暂时改为异步模式(LOADMODE=0)测试。
  2. CMPSS不触发或误触发

    • 信号路径检查:使用示波器同时观察CMPSS正输入引脚电压和内部DAC的预期输出电压(可通过另一个DAC模块复现该电压输出到测试点进行对比)。
    • 滤波器配置:检查滤波时钟分频和采样次数是否合理。尝试暂时禁用滤波器(CMPSS_disableFilter),看原始比较器输出是否正常。如果原始输出正常但滤波后不正常,问题就在滤波器配置上。
    • 滞后功能:如果输入信号在阈值附近有缓慢波动或噪声,可以启用比较器的滞回功能(CMPSS_enableHysteresis),提供一个小的正反馈,防止输出在阈值点频繁振荡。
    • X-BAR连接:这是最容易出错的一步。使用调试器读取Input X-BAR和ePWM Trip Zone相关的配置寄存器,确认CTRIPH/L信号是否已正确路由到目标ePWM的Trip输入。TI的SysConfig图形化工具可以极大地帮助可视化和配置这些复杂的芯片内部互联。
  3. 斜坡发生器工作异常

    • 状态机检查:仔细阅读手册中关于DACSOURCEEPWMSYNCPERCOMPHSTSRAMPLOADSEL相互作用的状态图(即本文前面提到的几个Corner Cases)。使用调试器在关键点(如SYNCPER边沿)读取RAMPSTS寄存器的值,看其是否按预期装载和递减。
    • 延迟与斜率:确认RAMPDLYARAMPDECVALA的值设置合理。RAMPDECVALA过大可能导致斜坡下降过快,在一个PWM周期内就减到0。

通过将寄存器手册的冰冷规格与Driverlib的便捷抽象相结合,再融入这些实战中提炼出的场景和技巧,你就能真正将TMS320F28003x的DAC和CMPSS模块转化为解决实际工程问题的得力工具。记住,所有复杂的配置,最终都是为了实现一个目标:让数字控制环路更快速、更精确、更可靠地响应模拟世界的信号。