4. CMPSS 比较器子系统:内部结构、DAC 参考电压与数字滤波
好,咱们进入第四章。CMPSS,全称是 Comparator Subsystem,也就是比较器子系统。这东西在过流保护里有多重要?我这么说吧,没有 CMPSS,你后面整定的那些阈值全是空谈。它就像硬件层面的“哨兵”,眼睛一刻不停地盯着电流信号。
这一章,我会把 CMPSS 的里里外外拆开来讲。从内部结构,到 DAC 怎么产生参考电压,再到数字滤波怎么消抖。你把这些搞懂了,后面写代码心里才有底。
4.1 CMPSS 内部结构:两个比较器,各司其职
先看一张图,这是 CMPSS 模块的简化框图。我当年第一次看手册时,觉得这东西挺复杂。后来发现,其实核心就两个比较器,加上一些辅助逻辑。
核心要点:每个 CMPSS 模块包含两个独立的比较器——COMPH(高电平比较器)和 COMPL(低电平比较器)。它们共享同一个 DAC 参考电压,但输出路径和滤波逻辑是独立的。
你看,模拟输入进来后,先经过一个可编程的分压网络。这个分压网络可以衰减输入信号,让信号范围匹配 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 可能已经挂了。我见过太多工程师因为偷懒用软件轮询,结果炸了管子才后悔。