当前位置: 首页 > news >正文

MSPM0GXX单片机内部比较器深度解析

目录

  • 0 前言
  • 1 简介
    • 1.1单片机简介
    • 1.2 比较器简介
  • 2 比较器运行原理
    • 2.1 比较器配置
    • 2.2 比较器通道选择
    • 2.3 比较器输出
    • 2.4 输出滤波器
    • 2.5 采样输出模式
    • 2.6 消隐模式
    • 2.7 基准电压发生器
    • 2.8 窗口比较器模式
    • 2.9 比较器滞后
  • 3 比较器的优势

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 比较器通道选择

相对而言,该系列的比较器可供选择的通道还是非常丰富的。
在这里插入图片描述
上图是内部比较器整体块图的局部,可以看到,比较器的输入选择还是丰富多样的,包括:

  1. 外部输出通道(最常用)
  2. 内部独立DAC
  3. 内部运算放大器
  4. 单片机内部的其他比较器(可以通过这种方式将两个比较器组合,构成窗口比较器)
  5. 模块专用的DAC(常用,后面会专门介绍)

相对来说,窗口比较器是稍微复杂的,下文会有专门的章节进行介绍。

2.3 比较器输出

在这里插入图片描述

从上图可以看出,比较器的输出共有3个去向:

  1. 输出到事件Fabric(这个不好翻译😆),可以触发相应的中断
  2. 到采样输出(后面会有专门章节进行介绍)
  3. 到外部引脚
  4. 到其他比较器的输入(图中的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输入数字量呢?
从图中也可以看出,有两个数字量的输入通道,DACCODE0DACCODE1,或者说,这两个寄存器的值就是输入的数字量,在代码中进行配置即可。

这两个通道的选择也比较方便,先给DACCTL1,这个时候就可以通过给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 窗口比较器模式

窗口比较器,顾名思义,就是在一个“窗口”范围内才会触发比较器的输出,窗口比较器同时配置了触发的上下限两个阈值。

单片机中的这个窗口比较器和我们学过的不太一样,先看看我们上学时候的窗口比较器。
在这里插入图片描述
稍做分析,就可以得出UIUO之间的关系,如上图所示。我们可以分成三种情况讨论,分别是:

  1. UA < UI 此时输出电压信号UO为高电平
  2. UB < UI < UA 此时输出电压信号UO为低电平
  3. 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 时, 比较器不会产生迟滞。为 123 分别生成10mV20mV30mV 典型迟滞电压。

关于迟滞电压构成的迟滞比较器,也是数字电子中的基础支持。我们简单举个例子。
假设我们配置了一个这样的迟滞比较器(如下图所示):
我们用比较器模块内部的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,自己设定阈值的这种方法,往往是毫秒级的。

所以在实际的工程开发中,需要根据不同的需求,分配和调度单片机的内部资源,优雅地完成每次开发工作,毕竟,优雅,永不过时!

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【word转pdf】【最新版本jar】Java使用aspose-words实现word文档转pdf
  • pytest实战技巧之参数化应用
  • 在Ubuntu 14.04上安装和使用Memcache的方法
  • 奇怪的Excel单元格字体颜色格式
  • 获取后端返回的图形验证码
  • 线上语音交友平台成熟案例源码出售本地找搭子交友app软件线下陪玩系统开发服务
  • WebStorm中在Terminal终端运行脚本时报错无法加载文件进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅
  • el-image预览图片点击遮盖处关闭预览
  • C++版OpenCV_03_图像增强
  • 筑牢数字防线:从微软蓝屏事件看网络安全与系统韧性建设
  • linux自动化构建工具--make/makefile
  • 学生成绩管理系统(C语言)
  • 关于使用宝兰德bes中间件进行windows部署遇到的问题——license不存在
  • Git仓库拆分和Merge
  • 计算机网络基础:4.HTTP与HTTPS
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 0基础学习移动端适配
  • 2019.2.20 c++ 知识梳理
  • 78. Subsets
  • docker容器内的网络抓包
  • es的写入过程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Kibana配置logstash,报表一体化
  • Mysql5.6主从复制
  • storm drpc实例
  • 记录一下第一次使用npm
  • 学习Vue.js的五个小例子
  • 用mpvue开发微信小程序
  • 原生js练习题---第五课
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​flutter 代码混淆
  • #Java第九次作业--输入输出流和文件操作
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • %check_box% in rails :coditions={:has_many , :through}
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十)c52学习之旅-定时器实验
  • (数据结构)顺序表的定义
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)LINQ之路
  • (转)linux 命令大全
  • .chm格式文件如何阅读
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)