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

【复旦微FM33 MCU 开发指南】ADC

前言

本系列基于复旦微FM33LC0系列单片机的DataSheet编写,旨在提供手册解析和开发指南。
本文章及本系列其他文章将持续更新,本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇

本文章最后更新日期:2024/11/09
全文字数:≈7000;阅读时间≈5min

如有问题、或有想看的其他内容,可以在评论区提出,看到会回复、优先编写想看的内容。

文章目录

  • 前言
  • 1 概述
  • 2 输入通道
    • 2.1 外部通道
    • 2.2 内部通道
      • 2.2.1 PTAT(芯片温度测量)
      • 2.2.2 VREFINT(内部基准源测量)
      • 2.2.3 OPA(运算放大器)
    • 2.3 采样通道的寄存器配置
  • 3 转换模式及数据读取
    • 3.1 转换模式
      • 3.1.1 单次转换
      • 3.1.2 连续转换
      • 3.1.3 外部信号触发
    • 3.2 数据读取
      • 3.2.1 通过寄存器直接读取
      • 3.2.2 通过DMA搬运数据
  • 4 转换时间
    • 4.1 采样保持时间
      • 4.1.1 ADC采样原理
      • 4.1.2 什么是采样保持时间
      • 4.1.3 怎么确定采样保持时间
      • 4.1.4 采样保持时间计算示例
      • 4.1.5 采样保持时间寄存器配置
    • 3.2 ADC转换时间
    • 3.3 通道切换时间
    • 3.4 DMA搬运时间
  • 5 采样率
    • 5.1 计算方法
    • 5.2 过采样
  • 6 采样值和真实值的转换

1 概述

SAR ADC

VREF引脚接入的电源

2 输入通道

FM33LC0支持16个采样通道,其中12个外部通道和4个内部通道。

2.1 外部通道

在这里插入图片描述
12个外部通道分8个快速通道和4个慢速通道,测量外部引脚输入的模拟信号。
快速通道和慢速通道在使用上没有区别,但慢速通道会更影响采样率的计算,具体在下一节讲解。

2.2 内部通道

在这里插入图片描述
4个内部通道不需要占用引脚,而且都为慢速通道。

2.2.1 PTAT(芯片温度测量)

用于测量芯片温度。内部温度传感器实测精度并不太高,可能有5℃的偏差。

众所周知,模拟器件的特性基本都是温度的曲线,因此内部温度传感器一般用于对一些模拟器件进行温度补偿,在该应用场景下对温度传感器的精度要求并不高。像RTC的温补,时钟源RCHF和RCMF的温补都可以用内部温度传感器完成。

有关温度传感器的进一步说明可以在芯片手册32.4.2 温度传感器章节中进一步了解。

下图列出了温度传感器出厂定标值的Flash地址、模拟参数。
使用内部通道采集PTAT时得到的是个电压值,用这个电压值和出厂时的定标值进行比较和换算,就可以转换为芯片温度。

在这里插入图片描述

在这里插入图片描述

2.2.2 VREFINT(内部基准源测量)

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/158d0afb51254482a7ee83ff23af97aa.png
在这里插入图片描述
内部基准源的ADC采集主要用于采样值和真实电压值的转换,进一步说明请见本文第四章。

2.2.3 OPA(运算放大器)

FM33LC0内置两个运算放大器,ADC可以通过内部通道采集运算放大器的输出。

2.3 采样通道的寄存器配置

通过配置ADC->CHER寄存器,可以使能需要的ADC通道。
在这里插入图片描述在这里插入图片描述

3 转换模式及数据读取

3.1 转换模式

3.1.1 单次转换

在这里插入图片描述
全自动触发模式:
触发一次采集所有通道,每采集完一个通道会产生一个EOC中断;等所有通道都采集完成会产生一个EOS中断。
半自动触发模式:
触发一次只采集一个通道,采集完成后产生一个EOC中断;当所有通道都被采集完成后,产生EOS中断。

可通过ADC->CR寄存器开始单次转换。
在这里插入图片描述

3.1.2 连续转换

在这里插入图片描述

采样顺序可以在ADC->CFGR寄存器选择。
在这里插入图片描述

3.1.3 外部信号触发

FM33LC0支持使用外部信号触发连续采样,不支持外部信号触发单次采样
(也就是说,一旦触发就无法停止,除非手动关闭ADC)

触发源可以在ADC->CFGR寄存器选择。
在这里插入图片描述

3.2 数据读取

3.2.1 通过寄存器直接读取

可以直接通过ADC->DR寄存器读取转换数据。
在这里插入图片描述

3.2.2 通过DMA搬运数据

在这里插入图片描述
在ADC使用DMA时,通过ADC->CFGR寄存器配置开启DMA。
在这里插入图片描述
在ADC使用DMA时,必须开启等待模式,即在ADC->CFGR寄存器中配置WAIT=1。
在这里插入图片描述
在ADC使用DMA时,在打开ADC后,应该写ADC->CR寄存器的START位开始第一次触发。

4 转换时间

这里的转换时间指的是:ADC外设的一个通道,从其开始采样,到得到ADC数据的时间。

如果使用时钟数来表示转换时间:
单通道ADC转换时钟数 = 采样保持时钟数 + ADC转换时钟数+通道切换时钟数 + DMA搬运时钟数
可以将时钟数换算为时间(us):
单通道ADC转换时间(us)= 单通道ADC转换时钟数 / ADC工作时钟(MHz)

可以由用户决定的只有采样保持时间,因此对该部分展开讲解。

4.1 采样保持时间

4.1.1 ADC采样原理

在继续下面的内容前,需要大概了解一下ADC采样原理。
(我硬件不是很专业,可能表述有误,主要是为了理解概念)
在这里插入图片描述
**这张图只了解以下三个部分就可以了:**左边红框是信号源,即ADC要采集的信号;右边绿色是ADC内部的采样电容;蓝色是一个开关(在ADC内部,为了理解我自己画上去的)

首先要知道,我们要采集的信号是一个连续的模拟信号,但ADC的转换结果是一个采样的过程,即在时间上是不连续的。

对一个通道的一次转换过程可以简化为以下步骤:

  1. 蓝色开关闭合,外面的信号为采样电容充电。
  2. 充电会持续由软件设定的采样保持时间的时长。
  3. 蓝色开关断开,由ADC采集采样电容的电压,并得到转换结果。

每经过上面三个步骤,ADC就会得到一个转换值。
重复这个过程,就能得到若干个采样值,从而还原信号源真实波形(如果采样率足够的话)

4.1.2 什么是采样保持时间

采样保持时间其实就是给ADC内部电容充电的时间。既然是充电,那么其电压值就是由小变大的。
如果采样保持时间足够长:采样电容充满电(即其电压和外部信号此刻的电压相同)后断开蓝色开关,并开始ADC转换,其转换得到的数据就是相对准确的。
如果采样保持时间不够:采样电容还没有充满电(即其电压低于和外部信号此刻的电压)就断开蓝色开关,并开始ADC转换,其转换得到的数据是偏低的。

4.1.3 怎么确定采样保持时间

DataSheet上写明:ADC输入信号采样时间最小值由被采样的模拟信号源内阻、信号输入通道阻抗、引脚寄生电容、采样电容共同决定。(其实变量只有被采样的模拟信号源内阻,就是上图的 R A I N R_{AIN} RAIN

模拟信号源内阻我觉得可以理解为信号源的驱动能力:信号源的驱动能力强,可以在特别短的时间就将电容充满电(和此刻信号的电压值相同),因此需要的采样保持时间就短。反之,信号源驱动能力弱,需要更长的时间将电容充到希望的电压值,就需要更长的采样保持时间。

采样信号的保持时间DataSheet给出了计算公式:
在这里插入图片描述

变量名名称
n n n有效位数 n = 12 n=12 n=12
S A SA SA表示采样电容上的电压建立到被采样信号电平的误差(LSB) S A = 0.25 SA=0.25 SA=0.25
R A I N R_{AIN} RAIN被采样信号源内阻(kΩ)非常量
R A D C R_{ADC} RADCADC输入通道阻抗(kΩ)查表
R I O R_{IO} RIO引脚输入阻抗(kΩ) R I O = 0.1 R_{IO}=0.1 RIO=0.1
C A D C C_{ADC} CADCADC采样电容容值(pF) C A D C = 12.8 C_{ADC}=12.8 CADC=12.8

其中, R A D C R_{ADC} RADC的值可以通过下表查得:
在这里插入图片描述

4.1.4 采样保持时间计算示例

DataSheet上有采样保持时间的计算示例:
在这里插入图片描述
虽然他写了,但第一次算的话也不知道他用哪个数据算的,因此我用第一个例子算一下:

  1. 首先要确定 R A D C R_{ADC} RADC,提到25℃、3.3V的VDDA、使用的快速通道,对应上面的表,其实是下图红框里这俩阻值,要得到他的结果,要用右边的值(即最大值),转换单位为kΩ, R A D C = 0.72 k Ω R_{ADC}=0.72kΩ RADC=0.72kΩ
    2. 在这里插入图片描述
  2. 信号源内阻 R A I N R_{AIN} RAIN已给出, R A I N = 1 k Ω R_{AIN}=1kΩ RAIN=1kΩ
  3. 代入公式 T s a m p = l n ( 2 12 / 0.25 ) ∗ ( 1 + 0.72 + 0.1 ) ∗ 12.8 = 226.065 n s T_{samp} = ln(2^{12}/0.25)*(1+0.72+0.1)*12.8=226.065ns Tsamp=ln(212/0.25)(1+0.72+0.1)12.8=226.065ns
  4. 如果ADC的工作时钟是16Mhz,那1个时钟对应62.5ns。因此,将采样保持时间设置为4个时钟,实际为241ns,超过226.065ns,是满足要求的。

4.1.5 采样保持时间寄存器配置

通过ADC->SMCR寄存器配置SMTS1SMTS2
在这里插入图片描述在这里插入图片描述

3.2 ADC转换时间

固定为12clk。

3.3 通道切换时间

至于ADC->SMCR寄存器中的CHCG,即采样通道切换等待时间,实测对通道切换时间没有影响。
(可能是测试方法问题,如有需要可以自行测试一下看看)

3.4 DMA搬运时间

手册上未写,但实测当使用DMA将ADC外设的数据搬运到RAM中时,每个通道需要额外一个时钟。
(可能是测试方法问题,如有需要可以自行测试一下看看)

5 采样率

5.1 计算方法

在前面的章节中,已经得到了单个通道在进行AD转换时所需要的时钟数。
所有快速通道需要的时钟数是一样的,所有慢速通道AD转换需要的时钟数也是一样的
(每个通道不能分别配置采样保持时间)
并且,因为所有通道是连续转换的,因此无论是快速通道还是慢速通道,他们的采样率是一样的。

目前已知:单个快速通道在一次AD转换中需要的时钟数、单个慢速通道在一次AD转换中需要的时钟数、ADC的工作时钟
则所有通道的采样率可以用下式来计算:

采样率 = A D C 工作时钟 / (快速通道转换时钟数 ∗ 快速通道数量 + 慢速通道转换时钟数 ∗ 快速通道数量) 采样率=ADC工作时钟/(快速通道转换时钟数 * 快速通道数量+慢速通道转换时钟数 * 快速通道数量) 采样率=ADC工作时钟/(快速通道转换时钟数快速通道数量+慢速通道转换时钟数快速通道数量)

5.2 过采样

在这里插入图片描述
过采样可通过ADC->CFGR寄存器配置。
在这里插入图片描述在这里插入图片描述
当使能过采样后,ADC的采样率将会按照设置的过采样率分频。

6 采样值和真实值的转换

在这里插入图片描述
上图的意思其实就是ADC的转换值取决于VDDA的电压值。
当没有使能过采样或硬件平均时,ADC的转换结果为12bit,最大值为4096。当采集一个大于或等于VDDA的电压时,得到的转换值为4096;当采集一个0V或低于0V的电压时,得到的转换值为0。

在一般情况下,VDDA是已知且稳定准确的,那么根据上述比例关系,可以根据采样值得到真实电压值。

但如果VDDA是波动的,或在一些对采样精度要求很严格的应用场合下,我们应该知道当前的VDDA是多少,以得到准确的比例关系。这种时候就要同时采集内部VREFINT通道,换算出当前VDDA的真实电压值,进而得知被采集信号的真实电压值。

在这里插入图片描述

相关文章:

【复旦微FM33 MCU 开发指南】ADC

前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写,旨在提供手册解析和开发指南。 本文章及本系列其他文章将持续更新,本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期:2024/11/09 全文字数&#xff…...

ORB_SLAM3安装

ORB_SLAM3安装 一.前期准备1.1ubuntu查看当前版本的命令1.2 根据ubuntu版本,更新下载软件源1.3 先下载git1.4 vim语法高亮1.5 常见的linux命令 二.ORB-SLAM3下载2.1 ORB_SLAM3源码下载2.2 安装依赖库2.2.1 依赖库2.2.2 安装pangolin2.2.3 安装opencv2.2.4 Eigen3安装…...

GoLang协程Goroutiney原理与GMP模型详解

本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程,也成为协程,由Go运行时管理。它是Go语言并发编程的核心概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。 以下是一些…...

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前,我们先来了解一下搜索 1 搜索是什么 ① 概念:用户输入想要的关键词,返回含有该关键词的所有信息。 ② 场景: ​ 1互联网搜索:谷歌、百度、各种新闻首页; ​ 2 站内搜索&#xff…...

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

本文目录索引 一个指令和三种方式通过约束脚本添加Golden位流工程MultiBoot位流工程验证example1总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我…...

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目: 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队: 陈金妙(新加坡科学技术研究局) 发表时间: 2024-10-15 发表期刊: Nature Methods 影响因子: 36.1&#xff0…...

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(1-3)

在前端开发中,模块化是一个重要的概念,不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module,因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…...

[NewStar 2024] week5完结

每次都需要用手机验证码登录&#xff0c;题作的差不多就没再进过。今天把week5解出的部分记录下。好像时间过去很久了。 Crypto 没e也能完 这题给了e,p,q,dp,dq。真不清楚还缺啥 long_to_bytes(pow(c,dp,p)) 格格你好棒 给了a,b和提示((p2*r) * 3*a q) % b < 70 其中r…...

IntelliJ IDEA的快捷键

IntelliJ IDEA 是一个非常强大的集成开发环境&#xff0c;它提供了大量的快捷键来加速开发者的日常工作。这里为您整理了一份 IntelliJ IDEA 的快捷键大全&#xff0c;包含了编辑、导航、重构、运行等多个方面的快捷键。请注意&#xff0c;这些快捷键是基于 Windows 版本的 Int…...

暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费

暮雨直播是一款内置直播源的电视直播应用程序&#xff0c;提供丰富的频道内容&#xff0c;包括教学、首页、一线、博主、解说、动漫、堆堆等。该应用的内置直播源持续更新维护&#xff0c;确保用户可以稳定地观看各种电视频道。暮雨直播承诺永久免费&#xff0c;为用户提供了一…...

单相锁相环,原理与Matlab实现

单相锁相环基本原理 单相锁相环的基本原理图如下所示&#xff0c; u α u_\alpha uα​ u β u_\beta uβ​经Park变换、PI控制实现对角频率 ω \omega ω和角度 θ \theta θ的估算。不同锁相环方案之间的差异&#xff0c;主要表现在正交电压 u β u_\beta uβ​的生成&#x…...

PICO+Unity 用手柄点击UI界面

如果UI要跟随头显&#xff0c;可将Canvas放置到XR Origin->Camera Offset->Main Camera下 1.Canvas添加TrackedDeviceGraphicRaycaster组件 2.EventSystem移动默认的Standard Input Module&#xff0c;添加XRUIInputModule组件 3.&#xff08;可选&#xff09;设置射线可…...

Rust移动开发:Rust在iOS端集成使用介绍

iOS调用Rust 上篇介绍了 Rust移动开发&#xff1a;Rust在Android端集成使用介绍, 这篇主要看下iOS上如何使用Rust&#xff0c;Rust可以给移动端开发提供跨平台&#xff0c;通用组件支持。 该篇适合对iOS、Rust了解&#xff0c;想知道如何整合调用和编译的&#xff0c;如果想要…...

虚拟现实技术在旅游行业的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 引言 虚拟现实技术概述 定义与原理…...

《Java核心技术 卷I》Swing使用颜色

使用颜色 使用Graphics2D类的setPaint方法可以为图形上下文上的所有后续的绘制操作选择颜色。例如&#xff1a; g2.setPaint(Color.RED); g2.drawString("Warning!",100,100); 可以用一种颜色填充一个封闭图像(例如&#xff1a;矩形或椭圆)的内部。为此&#xff…...

神书《从零构建大模型》分享,尚未发布,GitHub标星22k!!

《从零构建大模型》是一本即将于今年10月底发布的书籍&#xff0c;github已经吸引了惊人的21.7k标星&#xff01;作者是威斯康星大学麦迪逊分校的终身教授&#xff0c;在GitHub、油管、X上拥有大量粉丝&#xff0c;是一位真正的大佬。 本书免费获取地址 在本书中&#xff0…...

【JavaEE进阶】Spring AOP 原理

在之前的博客中 【JavaEE进阶】Spring AOP使用篇_aop多个切点-CSDN博客 我们主要学习了SpringAOP的应用, 接下来我们来学习SpringAOP的原理, 也就是Spring是如何实现AOP的. SpringAOP 是基于动态代理来实现AOP的,咱们学习内容主要分以下两部分 1.代理模式 2.Spring AOP源码剖…...

【网络安全】2.3 安全的网络设计_2.防御深度原则

文章目录 一、网络架构二、网络设备三、网络策略四、处理网络安全事件五、实例学习&#xff1a;安全的网络设计结论 网络设计是网络安全的基础&#xff0c;一个好的网络设计可以有效的防止攻击者的入侵。在本篇文章中&#xff0c;我们将详细介绍如何设计一个安全的网络&#…...

测绘程序设计|C#字符串及其操作|分割|取子串|格式化数值|StringBuilder类

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 简单介绍了C#字符串分割、取子串、拼接、格式化数值以及StringBuilder类&#xff0c;拿捏测绘程序设计大赛~ &#x1f33f;前言 字…...

自然语言处理——Hugging Face 详解

Hugging Face 是一个以自然语言处理&#xff08;NLP&#xff09;为核心的人工智能平台和开源社区&#xff0c;提供了一系列非常流行的机器学习工具和预训练模型&#xff0c;尤其在文本生成、分类、翻译、情感分析等任务中表现出色。Hugging Face 旗下最为著名的项目是 Transfor…...

本地保存mysql凭据实现免密登录mysql

本地保存mysql凭据 mysql加密登录文件简介加密保存mysql用户的密码到本地凭据 mysql加密登录文件简介 要在 mysql客户端 上连接 MySQL 而无需在命令提示符上输入用户名和口令&#xff0c;下列三个位置可用于存储用户的mysql 凭证来满足此要求。 配置文件my.cnf或my.ini /etc…...

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…...

构建智能防线 灵途科技光电感知助力轨交全向安全防护

10月27日&#xff0c;在南京南站至紫金山东站间的高铁联络线上&#xff0c;一头野猪侵入轨道&#xff0c;与D5515次列车相撞&#xff0c;导致设备故障停车。 事故不仅造成南京南站部分列车晚点&#xff0c;还在故障排查过程中导致随车机械师因被邻线限速通过的列车碰撞而不幸身…...

【go从零单排】泛型(Generics)、链表

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;泛型&#xff08;Generics&#xff09;允许你编写可以处理…...

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…...

推荐一款ETCD桌面客户端——Etcd Workbench

Etcd Workbench 我相信很多人在开始管理ETCD的时候都去搜了Etcd客户端工具&#xff0c;然后找到了官方的Etcd Manager&#xff0c;但用完之后发现它并不好用&#xff0c;还不支持多连接和代码格式化&#xff0c;并且已经好几年不更新了&#xff0c;于是市面上就有了好多其他客…...

01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究

文章目录 Oracle 数据库存储结构深度解析&#xff1a;从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件&#xff08;Control File&#xff09;1.2 联机重做日志文件&#xff08;Online Redo Log File&#xff09;1.3 数据文件&#xff08;Data File&…...

AI教育革命:个性化学习的新篇章

内容概要 在 教育 领域&#xff0c;人工智能 的崭露头角带来了前所未有的变化。如今&#xff0c;个性化学习 已不再是一个遥不可及的梦想&#xff0c;而是通过 AI 技术真正实现的可能。借助先进的数据分析能力&#xff0c;教师可以实时跟踪和评估每位学生的学习进度&#xff0…...

【网络原理】万字详解 UDP 和 TCP

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. UDP1.1 UDP 报文格式1.1.1 源端口/目的端口1.1.2 报文长度1.1.3 校验和 2. TCP2.1 TCP 报文结构2.2 TCP 特…...

从零开始搭建Halo个人博客

前言 老话说得好&#xff0c;好记性不如烂笔头。对于程序员来说&#xff0c;学无止境&#xff0c;需要学习的东西很多&#xff0c;而如果不记录下来可能过不了多久就忘记了&#xff0c;而记录下来这一步也能很好地贯彻费曼学习法。 其实网上有很多博客平台&#xff0c;但是自…...