【复旦微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(内部基准源测量)


内部基准源的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的转换结果是一个采样的过程,即在时间上是不连续的。
对一个通道的一次转换过程可以简化为以下步骤:
- 蓝色开关闭合,外面的信号为采样电容充电。
- 充电会持续由软件设定的采样保持时间的时长。
- 蓝色开关断开,由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} RADC | ADC输入通道阻抗(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} CADC | ADC采样电容容值(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上有采样保持时间的计算示例:

虽然他写了,但第一次算的话也不知道他用哪个数据算的,因此我用第一个例子算一下:
- 首先要确定 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Ω。

- 信号源内阻 R A I N R_{AIN} RAIN已给出, R A I N = 1 k Ω R_{AIN}=1kΩ RAIN=1kΩ。
- 代入公式 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
- 如果ADC的工作时钟是16Mhz,那1个时钟对应62.5ns。因此,将采样保持时间设置为4个时钟,实际为241ns,超过226.065ns,是满足要求的。
4.1.5 采样保持时间寄存器配置
通过ADC->SMCR寄存器配置SMTS1和SMTS2。


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 全文字数ÿ…...
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 站内搜索ÿ…...
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࿰…...
【模块化大作战】Webpack如何搞定CommonJS与ES6混战(1-3)
在前端开发中,模块化是一个重要的概念,不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module,因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…...
[NewStar 2024] week5完结
每次都需要用手机验证码登录,题作的差不多就没再进过。今天把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 是一个非常强大的集成开发环境,它提供了大量的快捷键来加速开发者的日常工作。这里为您整理了一份 IntelliJ IDEA 的快捷键大全,包含了编辑、导航、重构、运行等多个方面的快捷键。请注意,这些快捷键是基于 Windows 版本的 Int…...
暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费
暮雨直播是一款内置直播源的电视直播应用程序,提供丰富的频道内容,包括教学、首页、一线、博主、解说、动漫、堆堆等。该应用的内置直播源持续更新维护,确保用户可以稳定地观看各种电视频道。暮雨直播承诺永久免费,为用户提供了一…...
单相锁相环,原理与Matlab实现
单相锁相环基本原理 单相锁相环的基本原理图如下所示, u α u_\alpha uα u β u_\beta uβ经Park变换、PI控制实现对角频率 ω \omega ω和角度 θ \theta θ的估算。不同锁相环方案之间的差异,主要表现在正交电压 u β u_\beta uβ的生成&#x…...
PICO+Unity 用手柄点击UI界面
如果UI要跟随头显,可将Canvas放置到XR Origin->Camera Offset->Main Camera下 1.Canvas添加TrackedDeviceGraphicRaycaster组件 2.EventSystem移动默认的Standard Input Module,添加XRUIInputModule组件 3.(可选)设置射线可…...
Rust移动开发:Rust在iOS端集成使用介绍
iOS调用Rust 上篇介绍了 Rust移动开发:Rust在Android端集成使用介绍, 这篇主要看下iOS上如何使用Rust,Rust可以给移动端开发提供跨平台,通用组件支持。 该篇适合对iOS、Rust了解,想知道如何整合调用和编译的,如果想要…...
虚拟现实技术在旅游行业的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 虚拟现实技术在旅游行业的应用 引言 虚拟现实技术概述 定义与原理…...
《Java核心技术 卷I》Swing使用颜色
使用颜色 使用Graphics2D类的setPaint方法可以为图形上下文上的所有后续的绘制操作选择颜色。例如: g2.setPaint(Color.RED); g2.drawString("Warning!",100,100); 可以用一种颜色填充一个封闭图像(例如:矩形或椭圆)的内部。为此ÿ…...
神书《从零构建大模型》分享,尚未发布,GitHub标星22k!!
《从零构建大模型》是一本即将于今年10月底发布的书籍,github已经吸引了惊人的21.7k标星!作者是威斯康星大学麦迪逊分校的终身教授,在GitHub、油管、X上拥有大量粉丝,是一位真正的大佬。 本书免费获取地址 在本书中࿰…...
【JavaEE进阶】Spring AOP 原理
在之前的博客中 【JavaEE进阶】Spring AOP使用篇_aop多个切点-CSDN博客 我们主要学习了SpringAOP的应用, 接下来我们来学习SpringAOP的原理, 也就是Spring是如何实现AOP的. SpringAOP 是基于动态代理来实现AOP的,咱们学习内容主要分以下两部分 1.代理模式 2.Spring AOP源码剖…...
【网络安全】2.3 安全的网络设计_2.防御深度原则
文章目录 一、网络架构二、网络设备三、网络策略四、处理网络安全事件五、实例学习:安全的网络设计结论 网络设计是网络安全的基础,一个好的网络设计可以有效的防止攻击者的入侵。在本篇文章中,我们将详细介绍如何设计一个安全的网络&#…...
测绘程序设计|C#字符串及其操作|分割|取子串|格式化数值|StringBuilder类
由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~ 简单介绍了C#字符串分割、取子串、拼接、格式化数值以及StringBuilder类,拿捏测绘程序设计大赛~ 🌿前言 字…...
自然语言处理——Hugging Face 详解
Hugging Face 是一个以自然语言处理(NLP)为核心的人工智能平台和开源社区,提供了一系列非常流行的机器学习工具和预训练模型,尤其在文本生成、分类、翻译、情感分析等任务中表现出色。Hugging Face 旗下最为著名的项目是 Transfor…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
