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()
函数来辅助校准。但函数本身只是个工具,理解其背后的操作流程和硬件设置才是关键。下面是一个可操作的校准步骤:
-
硬件准备 :
-
将DAC输出引脚(如
DACOUTA)连接至一个高精度数字万用表(建议6位半)或高精度ADC的输入通道,用于测量实际电压。 -
确定并固定你的DAC参考电压(
VDAC或内部VREFHI)。这是校准的基准,校准时和后续应用时必须一致。 -
确保模拟地(
VSSA)和数字地(VSS)之间连接良好,减少噪声干扰。
-
将DAC输出引脚(如
-
软件初始化 :
- 配置DAC模块时钟并使能。
-
配置
DACCTL寄存器, 锁定你的参考电压选择 (DACREFSEL)。 -
将
DACOUTEN置1,使能输出缓冲器。 -
将
DACVALS设置为中间码2048,并确保LOADMODE=0(立即加载),让DAC输出目标电压。
-
执行校准函数 :
// 假设使用DAC-A DAC_tuneOffsetTrim(DACA_BASE);这个函数内部会做一系列操作:它可能尝试写入不同的
OFFSET_TRIM值,同时通过某种方式(通常需要配合ADC读取反馈,但函数本身是黑盒)评估输出,最终计算并写入一个优化的修调值。 重要提示 :调用此函数前,必须确保DAC已经按照上述步骤正确初始化并输出。同时,要查阅对应C2000Ware版本和芯片型号的文档或函数注释,确认其支持的参考电压模式。 -
验证与手动微调(可选但推荐) :
- 函数执行后,再次测量DAC在码字2048时的输出电压。
-
如果误差仍超出你的应用允许范围(例如,数据手册标称的偏移误差范围),你可能需要手动微调。你可以读取当前
OFFSET_TRIM值(使用DAC_getOffsetTrim),然后根据实测误差的方向和大���,手动增减该值,再次测量验证。 -
手动调整的量化关系:
OFFSET_TRIM寄存器每个LSB对应的电压调整量,需要查阅芯片的 数据手册(Datasheet) 中的“DAC Offset Trim Step Size”参数,而不是技术参考手册(TRM)。这是一个关键区别,TRM讲功能,Datasheet给精度。
-
锁定寄存器 : 校准完成后,为了防止软件跑飞意外修改配置,建议使用
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),以抑制噪声,同时不会引入过大延迟。
校准流程(递减扫描法) :
-
初始化
:配置CMPSS,使能比较器,将负端输入源设置为内部DAC(例如DACH)。将
DACHVALS设置为最大值0xFFF(对应DAC输出约等于DACREF),确保初始状态比较器输出为低(正端电压 < 负端电压)。 - 配置锁存 :使能输出锁存,这样比较器跳变会被捕获,便于软件查询。
-
扫描与判断
:
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) 即可。 } -
验证(可选)
:找到
trip_code后,可以将DAC值设为trip_code + 1,确认比较器输出为低;再设为trip_code,确认输出为高。这可以验证跳变点的单调性。 - 恢复配置 :校准完成后,重新使能迟滞(如果需要),并根据应用需求调整滤波器参数。
注意事项 :这个校准过程需要在 实际工作的硬件环境和典型的温度条件 下进行。因为比较器和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频繁误触发,但实际电流/电压并未超标。
- 分析 :这通常是开关噪声通过寄生耦合到了比较器的输入引脚或电源。
-
解决
:
- 硬件 :在比较器正/负输入引脚靠近芯片处添加小电容(如100pF)到模拟地,构成低通滤波器。确保电流采样电阻的走线尽可能短,并采用开尔文连接。
-
软件
:
启用并合理配置迟滞
。根据噪声幅度,设置
HYSTCTL为10mV或20mV。 启用数字滤波器 。根据噪声脉冲的典型宽度,设置CLKPRESCALE和SAMPWIN。例如,如果噪声脉冲宽度小于50ns,系统时钟200MHz,可以设置CLKPRESCALE=1(每2个时钟采样一次),SAMPWIN=3(4个样本窗口),THRESH=3(需3个相同样本),这样能滤除宽度小于4 * 10ns = 40ns的毛刺。 -
利用EPWMBLANK
:在PWM开通后的一段短时间内(即电流上升初期,噪声最大),使用
EPWMBLANK信号拉高LATCHCLR,强制滤波器输出为0,屏蔽这段时间内的任何跳变。
-
问题 :CMPSS响应过慢,导致过流保护不及时。
- 分析 :延迟主要来自数字滤波器和同步器。
-
解决
:
-
权衡滤波与速度
:减小
SAMPWIN和CLKPRESCALE可以降低延迟,但抗噪能力会下降。需要在实验中找到平衡点。 -
使用异步路径
:CMPSS的
CTRIP信号有 异步 (不经滤波和同步)和 同步 (经滤波)两条输出路径。对于最紧急的硬件保护(如直通短路),应将CTRIP的异步输出直接连接到ePWM的跳闸输入(通过X-BAR配置),实现纳秒级响应。而将同步输出用于软件中断或其它非紧急控制。 -
测量实际延迟
:可以通过GPIO翻转来测量。在比较器输入一个阶跃信号的同时,用一个GPIO口输出高电平,将CMPSS的
CTRIPOUT连接到另一个GPIO口并配置为输入,在中断中检测到CTRIPOUT变高时再拉低第一个GPIO口,用示波器测量两个GPIO信号上升沿之间的时间差,即为CMPSS(含滤波器)的总延迟。
-
权衡滤波与速度
:减小
5.3 斜坡发生器与PWM不同步问题
- 现象 :在峰值电流控制中,每个周期的电流峰值不一致,看起来斜坡没有在PWM周期开始时正确复位。
-
排查
:
-
检查
EPWMSYNCPER连接 :确认CMPSS的SYNCSEL配置与产生同步信号的EPWM模块一致。 -
验证EPWM配置
:确保该EPWM模块的时基工作在“递增-递减”计数模式时,
EPWMSYNCPER在计数器等于0(或等于周期值)时产生。这是最常见的同步点。 -
检查
RAMPMAXREFS加载时机 :RAMPMAXREFS是影子寄存器,其值加载到活动寄存器RAMPMAXREFA发生在DACSOURCE的上升沿或EPWMSYNCPER的上升沿。确保你在EPWMSYNCPER事件 之前 就写好了RAMPMAXREFS的值。通常在一个PWM周期开始时(CTR=0的中断里)更新下一个周期的斜坡起始值。 -
使用示波器调试
:将
CTRIPH信号输出到一个GPIO,同时观察PWM波形和这个GPIO。你应该看到CTRIPH在每个PWM周期内,在斜坡下降到低于正端电压时触发,并且触发点随时间(即随斜坡)线性变化。如果触发点随机漂移,说明同步有问题。
-
检查
调试CMPSS和DAC这类混合信号模块,
示波器是必不可少的工具
。同时观察模拟输入(电流采样电压)、DAC输出的斜坡(或阈值)、数字化的
CTRIP
信号以及最终的PWM输出,可以让你清晰地看到信号链中每一步的状态,快速定位问题是出在模拟前端、DAC阈值、还是比较器逻辑上。



412

被折叠的 条评论
为什么被折叠?



