目录
0 前言
本文仅以TI公司生产的MSPM0GXX单片机为例,对其内部比较器的作用,使用场景,原理进行分析和讲解,更多细节请参考数据手册 MSPM0 G 系列 80MHz 微控制器。
1 简介
1.1单片机简介
MSPM0 G 系列 MCU (MSPM0Gxx) 将 32 位
计算性能与精密模拟相结合, 可支持各种传感、接口、控制和辅助控制应用。 该器件架构通过一个灵活且易于配置的电源管理和时钟系统支持高性能应用和低功耗应用。
MSPM0 G 系列器件还通过受 ECC 保护的闪存、奇偶校验保护的 SRAM
、可用的双窗口看门狗计时器提供增强的稳健性, 并支持 125°C 环境温度和 AEC-Q100 1级认证。
1.2 比较器简介
比较器模块 (COMP
) 是具有通用比较器功能的模拟电压比较器。
比较器模块可用于电源电压监控和外部模拟信号监控。
比较器的特性包括:
• 快速和超低功耗工作模式
• 反向和非反向引脚输入复用器
• 反相和同相端子短路和交换功能
• 用于比较器输出并可通过软件选择的模拟滤波器
• 可编程迟滞
• 来自内部电压基准 VDD 或来自外部基准引脚的基准电压
• 可配置基准电压发生器, 来自具有两个输入代码的集成式 8 位 DAC
• 输出连接到事件系统
• 窗口比较器模式
• 支持低功耗运行的中断驱动测量系统
下面是比较器的块图
稍微懂点模电或者数电知识,这个图应该不难看懂。简单来说,就是一个可通过软件来配置的比较器电路,需要比较的两个电压信号(通常为模拟信号)都是可以通过两个多路选择器进行选择的,比较器的输出会触发中断,或者直接输出。
2 比较器运行原理
2.1 比较器配置
可以使用 COMPx.CTL1
寄存器中的 MODE
位将比较器配置为快速或超低功耗模式。 MODE
位的默认值为 0
, 可将比较器配置为快速模式。当 MODE
位设置为 1
时, 比较器配置为超低功耗模式。在快速模式下, 比较器消耗的电流较高, 但响应时间较短。在超低功耗模式下, 比较器消耗非常低的电流, 但响应时间较慢。
比较器的时钟控制由系统控制器 (SYSCTL) 管理, SYSCTL 知道比较器模块是否被启用,还知道它是处于超低功耗模式还是快速模式。用户需要确保为不同的比较器工作模式选择正确的总线时钟:
• 对于超低功耗模式比较器, 总线时钟可以是 LFCLK
或任何高速时钟
。
• 对于快速模式比较器, 总线时钟不能是 LFCLK, 如果在快速模式下使能比较器并且总线时钟是 LFCLK, 系统
将在 SYSCTL 中产生时钟错误中断。
补充:LFCLK是单片机内部的一种慢速时钟,该系列单片机的系统时钟分成以下几种:
MCLK: PD1 外设和 PD1 总线的主系统时钟
CPUCLK: CPU 时钟, 源自 MCLK
ULPCLK: PD0 外设和 PD0 总线的主系统时钟, 源自 MCLK
MFCLK: 固定 4MHz 时钟, 与 MCLK/ULPCLK 同步
MFPCLK: 4MHz 固定时钟
LFCLK: 固定 32kHz 时钟, 与 MCLK/ULPCLK 同步
HFCLK: 高频外部时钟
HSCLK: 供 MCLK 使用的高速可配置时钟, 来自 SYSPLL 或 HFCLK
2.2 比较器通道选择
相对而言,该系列的比较器可供选择的通道还是非常丰富的。
上图是内部比较器整体块图的局部,可以看到,比较器的输入选择还是丰富多样的,包括:
- 外部输出通道(最常用)
- 内部独立DAC
- 内部运算放大器
- 单片机内部的其他比较器(可以通过这种方式将两个比较器组合,构成窗口比较器)
- 模块专用的DAC(常用,后面会专门介绍)
相对来说,窗口比较器是稍微复杂的,下文会有专门的章节进行介绍。
2.3 比较器输出
从上图可以看出,比较器的输出共有3个去向:
- 输出到事件Fabric(这个不好翻译😆),可以触发相应的中断
- 到采样输出(后面会有专门章节进行介绍)
- 到外部引脚
- 到其他比较器的输入(图中的3号输出)
2.4 输出滤波器
输出滤波器应该在这个地方:
这个也很容易看懂,可以通过软件配置FLTEN
,来选择用或者不用滤波器。可以使用 COMPx.CTL1
寄存器中的 FLTDLY
位通过四个不同的数值调整滤波器的延迟。如下表所示:
当然,具体采用什么滤波器不好说,有可能是简单的RC滤波器,也有可能是其他类型的滤波器。
另外,输出滤波只能在比较器处于快速模式时采用。
如果输入端子上的电压差很小, 则比较器输出会振荡( 请参阅下图) 。内部和外部的寄生效应以及信号线、电源线和系统其他器件之上及之间产生的交叉耦合会导致这种行为。比较器输出振荡会降低比较结果的精度和分辨率。选择输出滤波器可以减少与比较器振荡相关的误差。
2.5 采样输出模式
采样模式是比较器的一种操作方法, 它比较离散时间间隔或样本的输入信号, 生成仅在采样点处变化的输出信
号。 CTL2
寄存器中的 SAMPMODE
位启用或禁用采样模式。
为了定义采样窗口, 计时器会生成 EVT0 和 EVT1 两个事件。通过使用这些事件, 采样窗口可以与噪声较小的相
位对齐。 EVT0 设置采样窗口, 而 EVT1 将其清除。
在采样模式下, 比较器的输出仅在采样窗口为高电平时被捕获, 其他时间不捕获输出。捕获的输出用于中断和事件生成。
通过使用采样模式, 比较器可以降低输入信号中噪声的影响, 从而实现更加准确可靠的比较。使用 EVT0 和 EVT1定义采样窗口可以更灵活地将窗口与输入信号噪声最小的相位对齐, 从而进一步提高比较的准确性。
2.6 消隐模式
由于噪声或其他干扰, 输入信号可能会在阈值电压附近波动, 从而导致输出快速且不稳定地切换。这可能导致误触发。比较器消隐模式在输入信号超过阈值电压的时间和输出改变状态的时间之间引入了短暂的延迟。寄存器 CTL2
中的控制位 BLANKSRC
可用于配置禁用或者哪个源应该在消隐模式下工作。可参阅器件的数据表, 了解支持的特定消隐源。
在参考的技术手册中并未查到具体的消隐源,应该可以在其他文档中查到。
个人以为,消隐模式也是为了减小抖动,或许输出滤波器也可以达到同样目的。
2.7 基准电压发生器
比较器基准电压发生器包含一个 8 位 DAC 以及一些配置选项。COMPx.CTL2 寄存器中的 REFSRC 位用于选择比较器的基准源。
• 当 REFSRC = 0 时,将禁用基准电压发生器,不能将基准电压发生器用于运行比较器。
• 当 REFSRC = 1 时,将选择模拟电源 VDDA 作为 DAC 的基准输入,而 DAC 输出将用作比较器的基准电压。
• 当 REFSRC = 2 时,将选择内部基准模块输出的 VREF 作为 DAC 的基准输入, 而 DAC 输出将用作比较器的基准电压。
• 当 REFSRC = 3 时,内部基准模块输出的 VREF 将直接用作比较器的基准电压, 并且 DAC 关闭。
这个设计还是比较有意思的,我们举个例子,看一下信号的基本通路。就看一下 REFSRC = 3
时候的情况,这个时候,DAC就没有效果了,直接将Vref送到了比较器的输入端。如下图所示:
既然是DAC,那我们如何给DAC输入数字量呢?
从图中也可以看出,有两个数字量的输入通道,DACCODE0
和DACCODE1
,或者说,这两个寄存器的值就是输入的数字量,在代码中进行配置即可。
这两个通道的选择也比较方便,先给DACCTL
置1
,这个时候就可以通过给DACSW
赋值来选择具体的通道。
还有个小玩意没讲,就是REFMODE
,COMPx.CTL2 寄存器中的 REFMODE 位决定了比较器请求在快速模式还是超低功耗模式下运行内部VREF,并确定 8 位 DAC 的工作模式。
- 如果 REFMODE 位为 0, 则会请求内部
VREF
在快速模式下运行, 并且比较器中的 8 位 DAC 也会配置为快速模式。 - 如果 REFMODE 位为 1, 则会请求内部
VREF
在超低功耗模式下运行,并且比较器中的 8 位 DAC 也配置为超低功耗模式。
最最重要的,是DACCODEX
的数值与DAC输出电压的具体关系(这个很基础):
输出电压Vout=基准电压Vref x DACCODEX / 256
(根据手册:DACCODEX为0的时候,当1来计算)
2.8 窗口比较器模式
窗口比较器,顾名思义,就是在一个“窗口”范围内才会触发比较器的输出,窗口比较器同时配置了触发的上下限两个阈值。
单片机中的这个窗口比较器和我们学过的不太一样,先看看我们上学时候的窗口比较器。
稍做分析,就可以得出UI
与UO
之间的关系,如上图所示。我们可以分成三种情况讨论,分别是:
- UA < UI 此时输出电压信号UO为高电平
- UB < UI < UA 此时输出电压信号UO为低电平
- UI < UB 此时输出电压信号UO为高电平
而单片机中的这个窗口比较器就比较别致😏。将单片机中了两个比较器进行组合,可以构成一个窗口比较器(每个单片机中的比较器数量要根据具体型号而定)。
手册中还非常贴心地给了我们配置方法:
可以通过设置 COMPx.CTL1
寄存器中的 WINCOMPEN
位来启用窗口比较器模式。
• 将 COMP0.CTL0
寄存器中的 IPSEL 位配置为相应的输入信号引脚。
• 将 COMP0.CTL1
寄存器中的 WINCOMPEN
位设置为1
。
• 清除 COMP1.CTL1
寄存器中的 WINCOMPEN
位。
• 将 COMP1.CTL0
寄存器中的 IPSEL
位配置为 0x07
, 选择 COMP0
正极端子作为输入。
不仅如此,还顺便给了我们信号的通路示意图:
我们可以据此推断出输入信号与输出信号的关系:
可以发现,我们的输入输出关系正好与我们以前熟悉的窗口比较器相反😆( Uout为高电平时的具体电压值与实际电路设计有关,不一定是UDD)。
2.9 比较器滞后
该比较器支持针对快速和超低功耗模式的可编程迟滞电压, 以避免在输入信号出现噪声时发生杂散输出转换。当Compx.CTL1
寄存器中的 HYST
位为 0 时, 比较器不会产生迟滞。为 1
、 2
和 3
分别生成10mV
、 20mV
和 30mV
典型迟滞电压。
关于迟滞电压构成的迟滞比较器,也是数字电子中的基础支持。我们简单举个例子。
假设我们配置了一个这样的迟滞比较器(如下图所示):
我们用比较器模块内部的DAC配置了1.65V的输出电压,比较器的另一个输入比较输入来自外部引脚。然后将迟滞电压设置为10mV,这个时候,我们的引脚输入电压和输出电压是什么样的关系呢?
经过简单分析,我们可以画出下面的图:
- 当需要触发Uout上升沿的时候,因为滞回特性,需要的的输入电压为1.65+0.01=1.66V电压。
- 当需要触发Uout下降沿的时候,因为滞回特性,需要的的输入电压为1.65-0.01=1.64V电压。
手册中还补充了以下内容:
还可以使用内部 8 位 DAC 来实现迟滞。参考信号发生器 8 位 DAC 的输入可以通过 COMPx.CTL3 寄存器中的DACCODE0和 DACCODE1 两个值来提供。用户可以将 COMPx.CTL2 寄存器中的 DACCTL 位配置为 1, 比较器输出值将在DACCODE0 和 DACCODE1 值之间选择 DAC 输入。借助这种配置, 无需使用外部元件即可为比较器生成所需的迟滞电平。
其实这部分内容我觉得有点不合乎逻辑哈,这个所谓的迟滞,应该只是单向的迟滞,并非双向迟滞。
3 比较器的优势
有人可能会说,何必这么复杂,我用ADC采集模拟电压,然后用个定时器中断判断转换后的AD值,然后再处理相关任务,也可以达到相同的目的。
事实果真如此吗?
非也,开始我也是这么想的,直到工作中遇到了必须使用比较器的场景,那就是快速响应。一般情况下,使用内部比较器的时候,只需要几十微妙,就可以对外界的电压信号快速响应。而采用普通ADC,自己设定阈值的这种方法,往往是毫秒级的。
所以在实际的工程开发中,需要根据不同的需求,分配和调度单片机的内部资源,优雅地完成每次开发工作,毕竟,优雅,永不过时!