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

【复旦微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的真实电压值,进而得知被采集信号的真实电压值。

在这里插入图片描述


http://www.kler.cn/a/387448.html

相关文章:

  • 5G 现网信令参数学习(3) - RrcSetup(1)
  • 速盾:cdn和反向代理的关系是什么?
  • LLMs:MindFormers的简介、安装和使用方法、案例应用
  • java---认识异常(详解)
  • [Docker#4] 镜像仓库 | 部分常用命令
  • Springboot应用的端口配置方法解析与优先级详解
  • 微服务中常用分布式锁原理及执行流程
  • delphi 编译多语言工程 error RC2104 : undefined keyword or key name:
  • js id字符串转数组
  • 学习threejs,使用JSON格式保存和加载整个场景
  • Chromium127编译指南 Mac篇(二)- 安装Xcode
  • 【工具】VeraCrypt|Windows 怎么给磁盘文件夹加密码?开源磁盘加密工具 VeraCrypt 教程
  • 青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
  • 暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费
  • SpringBoot Java教学辅助平台:构建高效学习环境
  • LeetCode每日一题3235---判断矩形的两个角落是否可达
  • hadoop+spark中8088,18080,19888,4040端口页面的区别
  • Windows Server服务器上安装的MySQLl数据库连接遇到10055错误
  • FastReport将停止 .NET Framework 上的 WebReport 更新
  • 【JS】如何设置一个只读属性
  • 手把手教你写Unity3D飞机大战(5)玩家子弹射击之显示瞄准图标
  • 工程数学线性代数(同济第七版)附册课后习题答案PDF
  • 【重学 MySQL】八十三、掌握循环结构 LOOP、WHILE、REPEAT 的高效应用
  • 使用git lfs向huggingface提交较大的数据或者权重
  • SQLite的BLOB数据类型与C++二进制存储学习记录
  • 403 Request Entity Too Lager(请求体太大啦)