4. CMPSS 比较器子系统:内部结构、DAC 参考电压与数字滤波

好,咱们进入第四章。CMPSS,全称是 Comparator Subsystem,也就是比较器子系统。这东西在过流保护里有多重要?我这么说吧,没有 CMPSS,你后面整定的那些阈值全是空谈。它就像硬件层面的“哨兵”,眼睛一刻不停地盯着电流信号。

这一章,我会把 CMPSS 的里里外外拆开来讲。从内部结构,到 DAC 怎么产生参考电压,再到数字滤波怎么消抖。你把这些搞懂了,后面写代码心里才有底。

4.1 CMPSS 内部结构:两个比较器,各司其职

先看一张图,这是 CMPSS 模块的简化框图。我当年第一次看手册时,觉得这东西挺复杂。后来发现,其实核心就两个比较器,加上一些辅助逻辑。

核心要点:每个 CMPSS 模块包含两个独立的比较器——COMPH(高电平比较器)和 COMPL(低电平比较器)。它们共享同一个 DAC 参考电压,但输出路径和滤波逻辑是独立的。

CMPSS 内部结构框图 模拟输入 分压网络 COMPH 高电平比较器 COMPL 低电平比较器 12-bit DAC 参考电压 数字滤波 消抖逻辑 数字滤波 消抖逻辑 输出 ePWM/GPIO 输出 ePWM/GPIO 说明:COMPH 和 COMPL 共享同一个 DAC 参考电压,但输出路径完全独立。 COMPH 通常用于过流保护上限,COMPL 用于下限或零电流检测。

你看,模拟输入进来后,先经过一个可编程的分压网络。这个分压网络可以衰减输入信号,让信号范围匹配 DAC 的参考范围。我习惯把分压系数设为 1,除非输入电压特别高。

然后信号分两路,一路进 COMPH,一路进 COMPL。这两个比较器各自与 DAC 产生的参考电压做比较。COMPH 的输出经过数字滤波后,可以触发 ePWM 的故障保护,或者直接输出到 GPIO 引脚。

个人经验:我一般把 COMPH 用于过流保护的上限阈值,COMPL 用于下限阈值或零电流检测。比如在电机控制里,COMPH 检测相电流是否超过峰值,COMPL 检测电流是否过零。两个比较器配合使用,能实现完整的电流保护策略。

4.2 DAC 参考电压生成:12 位精度,你说了算

DAC 是 CMPSS 的“大脑”。它决定了比较器翻转的电压点。CMPSS 内部集成了一个 12 位的 DAC,参考电压可以来自外部 VREF 引脚,也可以来自内部的 VDAC 或 VREFHI。

DAC 的输出电压计算公式很简单:

V_DAC = (DACVAL / 4096) × VREF

其中 DACVAL 是 12 位的寄存器值,范围 0~4095。VREF 是参考电压,通常为 3.3V 或 2.5V。

举个例子,假设 VREF = 3.3V,你想设置 1.65V 的阈值:

DACVAL = (1.65 / 3.3) × 4096 = 2048

嗯,就是这么简单。但实际项目中,你还要考虑分压网络的影响。如果输入信号经过了 2:1 的分压,那么实际对应的电流阈值要乘以 2。

参考电压源 典型值 适用场景
VDAC(内部) 3.3V 通用场景,精度要求不高
VREFHI(外部) 2.5V / 3.0V 高精度场景,需要外部基准
VREFLO(外部) 0V 接地参考,通常不用

注意:DAC 的参考电压源选择会影响整个系统的精度。如果你用内部 VDAC,它的精度受温度和电源波动影响较大。我曾在一次项目中因为用了内部 VDAC,导致过流保护阈值随温度漂移了 5%。后来换成外部 VREFHI,问题就解决了。

4.3 数字滤波与消抖:别让噪声骗了你的比较器

比较器的输出是纯硬件的,响应速度极快。但快也有快的烦恼——噪声。你想想看,电机启动时的电流尖峰、PWM 开关带来的耦合噪声,都可能让比较器误翻转。

这时候就需要数字滤波了。CMPSS 的数字滤波模块,说白了就是一个可编程的“防抖”逻辑。它有两种工作模式:

  • 采样模式:以固定频率采样比较器输出,连续 N 次采样结果一致,才认为输出有效。
  • 窗口模式:在设定的时间窗口内,如果比较器输出保持稳定,才输出有效信号。

我个人更常用采样模式。因为它实现简单,而且参数调整直观。你只需要设置两个参数:采样时钟分频系数和采样次数。

// 配置数字滤波为采样模式
// 采样时钟 = SYSCLK / 64
// 连续 4 次采样一致才输出
CMPSS[0].CTRL2.bit.FILTERCLK_DIV = 3;  // 分频系数 64
CMPSS[0].CTRL2.bit.FILTER_SAMP = 3;    // 采样次数 4

这段代码的意思是:以 SYSCLK/64 的频率采样比较器输出,连续 4 次结果相同,才认为输出有效。这样能滤掉大部分窄脉冲噪声。

避坑指南:我曾经在一个项目中,把采样次数设成了 16。结果过流保护响应太慢,IGBT 都烧了保护才动作。后来我总结了一个经验:滤波参数要根据系统噪声频率和保护响应时间要求来折中。对于过流保护,我一般设 4~8 次采样,既能滤除噪声,又能保证微秒级的响应。

4.4 输出路径:ePWM 触发与 GPIO 输出

滤波后的比较器输出,可以连接到两个地方:ePWM 模块的故障输入,或者 GPIO 引脚。

连接到 ePWM 是最常用的方式。当比较器检测到过流时,直接触发 ePWM 的故障保护,硬件自动将 PWM 输出置为高阻或低电平,无需软件干预。这才是真正的“硬件级保护”。

连接到 GPIO 则用于状态指示或软件轮询。比如你可以把 COMPH 的输出接到一个 LED,过流时灯亮,方便调试。

输出目标 响应速度 典型用途
ePWM 故障输入 纳秒级 硬件过流保护,自动关断 PWM
GPIO 输出 微秒级 状态指示、软件轮询、调试
内部中断 微秒级 触发 ADC 采样或软件处理

建议:对于过流保护,一定要用 ePWM 触发路径。软件轮询太慢了,等你读到 GPIO 电平再关 PWM,IGBT 可能已经挂了。我见过太多工程师因为偷懒用软件轮询,结果炸了管子才后悔。