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

devtools/2024/11/12 18:53:00/

前言

本系列基于复旦微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.ppmy.cn/devtools/132617.html

相关文章

nginx配置代理地址

1,配置19上的代理 location /jmis/ { alias D:/images/; autoindex on; sendfile on; } 2.在18服务器上访问19的图片。18服务器nginx代理 proxy_set_header 指令用于在发送给后端服务器的请求中添加或修改指定的HTTP头信息。 proxy_p…

C++ 游戏开发:打造高效、性能优越的游戏世界

在游戏开发领域,C 一直是最受欢迎的编程语言之一。其高效的内存管理和对硬件的底层控制,使得 C 成为开发高性能游戏的首选语言。从大型 3D 游戏引擎到独立游戏的制作,C 在游戏开发中发挥了不可替代的作用。 本文将带你了解 C 在游戏开发中的…

【深度学习】batchsize太大或太小的优缺点,如何平衡batchsize大小

一. batchsize太小的缺点 1. 耗时长,训练效率低 假设batchsize1,每次用完一个数据进行训练,如果数据总数很多,完整训练完一遍数据需要时间很长,训练效率低 2. 训练数据难以收敛 假设batchsize1,每次用一个…

Kubernetes-ArgoCD篇-03-部署

1、从 Git 存储库创建应用程序 包含留言簿应用程序的示例存储库可在 https://github.com/argoproj/argocd-example-apps.git 上找到,以演示 Argo CD 的工作原理。 1.1 argocd server port-forward 我们这里通过port-forward 访问 Argo CD: kubectl p…

tinymce扩展功能:1、行高、段落间距、格式刷;2、视频上传进度条;3、对复制的图片设置尺寸

tinymce扩展功能:1、行高、段落间距、格式刷;2、视频上传进度条;3、对复制的图片设置尺寸 一、需求描述二、行高、段落间距、格式刷插件三、实现视频上传的进度条、对复制的图片设置尺寸 一、需求描述 使用技术: vue2 tinymce5.…

Linux(CentOS)yum update -y 事故

CentOS版本:CentOS 7 事情经过: 1、安装好CentOS 7,系统自带JDK8,版本为:1.8.0_181 2、安装好JDK17,版本为:17.0.13 3、为了安装MySQL执行了 yum update -y(这个时候不知道该命令的…

单调栈—acwing

一、题目: AcWing 830. 单调栈 - AcWing 暴力算法思想 双指针算法,本质上是比较操作,两个循环,时间复杂度高。通过栈可以一次遍历。 可以知道,只要前面有一个小于我的数,就可以。如果前面的数&#xff…

解题--多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 此算法用…