前言
本系列基于复旦微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的真实电压值,进而得知被采集信号的真实电压值。