4. C2000模拟比较器与DAC配置

各位好,欢迎来到第四章。这一章我们聊聊 CMPSS——模拟比较器子系统。说实话,过流保护能不能做到又快又准,CMPSS 的配置占了七成功力。我见过不少工程师,PID 调得飞起,结果 CMPSS 的滤波参数没设对,一上电就误触发,折腾了两天才找到原因。

所以这一章,咱们把 CMPSS 从里到外拆开看。你搞懂了它的内部结构,后面做参数设定才能心里有数。

4.1 CMPSS 内部结构概览

CMPSS 全称 Comparator Subsystem。每个模块包含两个比较器:一个高速比较器(CTRIPH),一个低速比较器(CTRIPL)。我习惯把高速的用于硬件级过流封锁,低速的用于软件告警。

核心要点:CMPSS 的响应延迟通常在 30-50ns 级别。这意味着从故障发生到触发 PWM 跳变,只需要几十纳秒。这是软件中断完全做不到的速度。

下面这张图是我自己整理的 CMPSS 内部数据流,你一看就明白信号是怎么走的。

CMPSS 内部结构框图 正输入端 (INP) 负输入端 (INN) DAC 参考电压 比较器 CTRIPH / CTRIPL 数字滤波 消抖 / 锁存 PWM 跳变 / 中断 说明: 每个 CMPSS 模块包含两个比较器:CTRIPH(高速,用于硬件级保护)和 CTRIPL(低速,用于软件告警)。 正输入端可接外部引脚或内部信号,负输入端可接外部引脚或内部 DAC 参考。

4.2 比较器正负输入端配置

正输入端(INP)和负输入端(INN)怎么接?这是第一个要搞清楚的。

正输入端通常接被检测信号。比如你要检测母线电流,就把电流采样信号送到 INP。负输入端接参考阈值,可以是外部引脚电压,也可以是内部 DAC 的输出。

我的习惯:只要条件允许,我尽量用内部 DAC 做参考。原因很简单——外部电阻分压会受温度影响,而且 PCB 布局稍微差一点就容易引入噪声。内部 DAC 的精度足够,还省了两个引脚。

输入端配置通过寄存器 CMPHXSEL 和 CMPLXSEL 控制。具体选项如下:

输入通道 可选信号源 典型用途
INP (正端) 外部引脚 / 内部信号 电流采样、电压采样
INN (负端) 外部引脚 / DAC 输出 阈值参考

嗯,这里要注意:如果你把 INN 接到外部引脚,那个引脚就不能再做 GPIO 了。我刚开始用 C2000 时就踩过这个坑——明明配置了比较器,结果死活不触发,查了半天发现引脚被复用了。

4.3 DAC 参考电压生成

内部 DAC 是 12 位的,输出范围可以配置。我个人习惯把 DAC 参考电压设为 3.3V,这样 12 位分辨率对应大约 0.8mV 每步。对于大多数过流保护场景,这个精度足够了。

DAC 的配置代码很简单,但参数要算对:

// DAC 参考电压配置示例
// 目标阈值:1.65V(对应 50% 量程)
// DAC 参考电压:3.3V
// DAC 值 = 1.65 / 3.3 * 4096 = 2048

CMPSS_setDACValue(myCmpss, CMPSS_DAC_SRC_CTRIPH, 2048);
CMPSS_configDAC(myCmpss, CMPSS_DAC_SRC_CTRIPH, 
                CMPSS_DAC_REF_VDDA,    // 参考源选择 VDDA
                CMPSS_DAC_SRC_CTRIPH); // 输出到比较器

注意:DAC 参考源可以选择 VDDA 或 VREFLO。如果你用 VDDA,要确保 VDDA 稳定。我曾经在一个项目里发现 VDDA 上有 50mV 的纹波,导致比较器阈值抖动,最后加了 LC 滤波才解决。

4.4 数字滤波与消抖设置

这是 CMPSS 配置里最容易出问题的地方。说白了,数字滤波就是为了防止噪声导致误触发。

C2000 的 CMPSS 提供了两种滤波模式:

  • 异步模式:比较器输出直接送到 PWM 模块,延迟最小,但抗噪能力差。
  • 同步滤波模式:输出经过可配置的采样窗口,只有连续 N 个采样点都有效才输出触发信号。

我一般这么选:硬件级过流保护用异步模式,因为要快;软件告警用同步滤波模式,因为可以容忍一点延迟,但必须可靠。

滤波参数通过 CMPSS_setFilterConfig 配置:

// 数字滤波配置示例
// 采样时钟:SYSCLK / 4
// 采样次数:8 次连续有效才触发
// 这样大约能滤掉 200ns 以下的毛刺

CMPSS_setFilterConfig(myCmpss, CMPSS_FILTER_CTRIPH,
    CMPSS_FILTER_SAMPLE_CLK_DIV4,   // 采样时钟分频
    CMPSS_FILTER_SAMPLE_COUNT_8);   // 连续采样次数

避坑指南:我曾经在一个电机驱动项目里,把滤波采样次数设成了 32 次。结果电机启动瞬间的浪涌电流被滤掉了,保护没触发,MOSFET 直接炸了。后来我改成 4 次,既滤掉了高频噪声,又能响应真正的过流。记住:滤波不是越强越好,够用就行。

还有一个容易被忽略的参数——消抖锁存。你可以配置比较器输出被锁存,直到软件手动清除。这在故障保护里很有用:一旦触发,系统就保持在安全状态,不会因为故障消失就自动恢复。

配置锁存模式的代码:

// 使能锁存模式
CMPSS_enableLatch(myCmpss, CMPSS_LATCH_CTRIPH);

// 清除锁存(在故障处理完成后调用)
CMPSS_clearLatch(myCmpss, CMPSS_LATCH_CTRIPH);