4. C2000 CMPSS 模块详解
各位好,欢迎来到第四章。这一章我们聊聊 CMPSS——模拟比较器子系统。说实话,过流保护能不能做到又快又准,CMPSS 的配置占了七成功力。我见过不少工程师,PID 调得飞起,结果 CMPSS 的滤波参数没设对,一上电就误触发,折腾了两天才找到原因。
所以这一章,咱们把 CMPSS 从里到外拆开看。你搞懂了它的内部结构,后面做参数设定才能心里有数。
4.1 CMPSS 内部结构概览
CMPSS 全称 Comparator Subsystem。每个模块包含两个比较器:一个高速比较器(CTRIPH),一个低速比较器(CTRIPL)。我习惯把高速的用于硬件级过流封锁,低速的用于软件告警。
核心要点:CMPSS 的响应延迟通常在 30-50ns 级别。这意味着从故障发生到触发 PWM 跳变,只需要几十纳秒。这是软件中断完全做不到的速度。
下面这张图是我自己整理的 CMPSS 内部数据流,你一看就明白信号是怎么走的。
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);