一文详解ADC模拟数字转换器

adc简介
12位adc是一种逐次逼近型模拟数字转换器,它有多达18个通道,可以测量16个外部和2个内部信号源。各通道的a/d转换可以单次、连续、扫描或间断模式执行.adc的结果可以是左对齐或者是右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值。
adc的输入时钟不得超过14mhz,它是由pclk2经分频产生。
adc主要特征
12位分辨率
转换结束、注入转换结束和发生模拟看门狗事件时产生中断
单次和连续转换模式
从通道0到通道n的自动扫描模式
自校准
带内嵌数据一致性的数据对齐
采样间隔时间可以按通道分别编程
规则转换和注入转换均有外部触发选项
间断模式
双重模式(带2个或以上adc的器件)
adc转换时间
adc供电要求:2.4v到3.6v
adc输入范围:vref-
规则通道转换期间有dma请求产生
adc功能框图
注意:1、adc3的规则转换和注入转换触发与adc1和adc2的不同
2、tim8_ch4和tim8_trgo及他们的重映射位只存在于大容量产品中
adc引脚
vdda和vssa应该分别连接到vdd和vss。
电压输入范围
adc输入范围为vref-
通道选择
有16个通道,可以把转换组织分成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道0、通道2、通道15。
规则组:由多达16个转换组成,规则通道和它们的转换顺序在adc_sqrx寄存器中选择,规则组中转换的总数应写入adc_sqr1寄存器的了l[3:0]位中
注入组:由多达4个转换组成,注入通道和它们的转换顺序在adc_jsqr寄存器中选择,注入组里的转换总数目应写入adc_jsqr寄存器的l[1:0]中
如果 adc_sqrx 或 adc_jsqr 寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉
冲将发送到 adc 以转换新选择的组。
温度传感器/vrefint内部通道
温度传感器和通道adc_in16相连接,内部参照电压vrefint和adc_in17相连接。可以按注入或规则通道对这两个内部通道进行转换
单次转换模式
单次转换模式下,adc只执行一次转换,该模式下即可通过设置adc_cr2寄存器的adon位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时cont位为0.
一旦选择通道的转换完成:
如果一个规则通道被转换:
-转换数据被存储在16位adc_dr寄存器中
-eoc(转换结束)标志被设置
-如果设置了eocie,则产生中断
如果一个注入通道被转换
-转换数据被存储在16位的adc_drj1寄存器中
-jeoc(注入转换结束)标志被设置
-如果设置了jeocie位,则产生中断
连续转换模式
在连续转换模式中,当前面adc转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置adc_cr2寄存器上的adon位启动,此时的cont位是1.
每个转换后:
如果一个规则通道被转换
-规则数据被存储在16位的adc_dr寄存器中
-eoc(转换结束)标志被设置
-如果设置了eocie,则产生中断
如果一个注入通道被转换:
-转换数据被存储在16位的adc_drj1寄存器中
-jeoc(注入转换结束)标志被设置
-如果设置了jeocie位,则产生中断
规则通道:顾名思义,规则就是规矩的意思,我们平时一般使用的就是这个通道,或者应该说我们用到的就是这个通道,没有什么要特别注意的。
注入通道:注入,可以理解为插入,插队的意思,就是一种不安分的意思,它是一种在规则通道转换的时候强行插入的一种转换通道,如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道完成之后,再回到规则通道的转换流程。这点跟中断程序很像,都是不安分的主,所以注入通道只有在规则通道存在时才会出现。
转换顺序
规则序列
规则序列寄存器有3个,分别为sqr3、sqr2、sqr1。sqr3控制着规则序列中的第一个到第六个转换,对应的位为:sq1[4:0]~sq6[4:0],第一次转换的是位 4:0 sq1[4:0],如果通道 16 想第一 次转换,那么在 sq1[4:0] 写 16 即可。sqr2 控制着规则序列中的第 7 到第 12 个转换,对应的位 为:sq7[4:0]~sq12[4:0],如果通道 1 想第 8 个转换,则 sq8[4:0] 写 1 即可。sqr1 控制着规则序 列中的第 13 到第 16 个转换,对应位为:sq13[4:0]~sq16[4:0],如果通道 6 想第 10 个转换,则 sq10[4:0] 写 6 即可。具体使用多少个通道,由 sqr1 的位 l[3:0] 决定,最多 16 个通道。
注入序列
注入序列寄存器jsqr只有一个,最多支持4个通道,具体多少个由jsqr的jl[2:0]决定。如果jl的值小于4的话,则jsqr跟sqr决定转换顺序的设置不一样,第一次转换的不是jsqr1[4:0];而是jcqrx[4:0],x=4-jl,跟sqr刚好相反,如果 jl=00(1 个转换),那么转换的顺序是从 jsqr4[4:0] 开始,而不是从 jsqr1[4:0] 开始,这个要注意,编程的时候不要搞错。当 jl 等于 4 时,跟 sqr 一样。
触发源
通道选好了,转换的顺序也设置好了,那接下来就开始转换了,adc的转换可以由adc控制寄存器2:adc_cr2的adon这个位来控制,写1的时候开始转换,写0的时候停止转换,这个是最简单也是最好理解的开启adc转换的控制方式。
除了这种控制方法,adc还支持触发转换,这个触发包括内部定时器触发和外部io触发。触发源有很多,具体选择哪一种触发源,由adc控制寄存器2:adc_cr2的extsel[2:0]和jextsel [2:0]位来控制。extsel[2:0]用于选择规则通道的触发源jextsel [2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由 adc控制寄存器2:adc_cr2 的
exttrig 和 jexttrig 这两位来激活。其中 adc3 的规则转换和注入转换的触发源与 adc1/2
的有所不同,在框图上已经表示出来.
转换时间
adc时钟
adc输入时钟adc_clk由pclk2经过分频产生,最大是14mhz,分频因子由rcc时钟配置寄存器rcc_cfgr的位15:14设置,可以是2/4/6/8分频,注意这里没有1分频。一般我们设置pclk2=hclk=72m。
采样时间
adc使用若干个adc_clk周期对输入的电压进行采样,采样的周期数可通过adc采样时间寄存器adc_smpr1控制的是通道10~17.每个通道可以分别使用不同的时间采样,其中采样周期最小是1.5个。
adc 的转换时间跟 adc 的输入时钟和采样时间有关,公式为: tconv = 采样时间 + 12.5 个周期。 当 adclk = 14mhz (最高),采样时间设置为 1.5 周期(最快),那么总的转换时间(最短) tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us 。
一般我们设置 pclk2=72m ,经过 adc 预分频器能分频到最大的时钟只能是 12m ,采样周期设
置为 1.5 个周期,算出最短的转换时间为 1.17us ,这个才是最常用的。
中断
转换结束中断
数据转换结束后可以产生中断,中断分为3种:规则通道转换结束中断,注入转换通道转换结束中断,模拟看门狗中断。其中转换结束很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应的中断服务程序。
模拟看门狗中断
当被adc转换的模拟电压低于阈值或者高于阈值时,就会产生中断,前提是我们开起了模拟看门狗中断,其中低阈值和高阈值由adc_ltr和adc_htr设置。例如我们设置高阈值是2.5v,那么模拟电压超过2.5v的时候,就会产生模拟看门狗中断,反之低阈值也一样。
dma请求
规则和注入通道转换结束后,除了产生中断外,还可以产生dma请求,把转换好的数据直接存储在内存里面。要注意的是只有adc1和adc3可以产生dma请求。
adc_mode :配置 adc 的模式,当使用一个 adc 时是独立模式,使用两个 adc 时是双模式,
在双模式下还有很多细分模式可选,我们一般使用一个 adc 的独立模式。
scanconvmode :可选参数为 enable 和 disable ,配置是否使用扫描。如果是单通道 ad 转换
使用 disable ,如果是多通道 ad 转换使用 enable 。
adc_continuousconvmode :可选参数为 enable 和 disable ,配置是启动自动连续转换还是单
次转换。使用 enable 配置为使能自动连续转换;使用 disable 配置为单次转换,转换一次后
停止需要手动控制才重新启动转换。一般设置为连续转换。
adc_externaltrigconv :外部触发选择,图 单个 adc 功能框图 中列举了很多外部触发条件,可
根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。
adc_dataalign :转换结果数据对齐模式,可选右对齐 adc_dataalign_right 或者左对齐
adc_dataalign_left 。一般我们选择右对齐模式。
adc_nbrofchannel : ad 转换通道数目,根据实际设置即可。
其中实验可以分为4个实验:独立模式单通道采集实验(分为中断存储和dma直接存储)、独立模式多通道采集实验、双重adc同步规则模式采集实验
我直接以双重adc同步规则模式采集实验为例
宏定义:
main.c
个人总结
关于adc程序驱动的编写,stm32官方的例程中有一些帮助,对于程序编写的步骤我总结如下:
1、初始adc用到的gpio
2、设置adc的工作参数并初始化
3、设置adc工作时钟(在rcc文件的adc设置)
4、设置adc转换通道顺序和采样时间
5、配置使能adc转换完成中断,在中断内读取转换数据
6、如果是dma读取数据,需要配置adc的响应dma
7、使能软件触发adc转换

2018手机CPU大起底:苹果A12很强,联发科P60很弱
Lantiq推出业界首款G.fast家庭网关参考设计
松下动力电池材料革新路径
用LED光在家种菜全过程图集
APS计划排产软件推动灯具照明行业生产精益化
一文详解ADC模拟数字转换器
LED新厂宏齐表现极佳,营运快速增温
了解SMPS损耗的公共问题
用AI,认识西门子的另一面
[组图]300V电子管稳压电源
2012年中国光伏装备行业发展壁垒分析
华为推自主操作系统时机已到?
为苹果过分担忧了,iPhoneX或供不应求,iphone8销量大受打击
风云四号正式交付使用实现我国静止轨道气象卫星弯道超车
HTC One X/S 确定4月初上市
光纤线选择时需要注意哪几点
基于matlab的偶极子天线设计程序
OPPO Reno3系列即将发布 将是OPPO首款上市的国行5G手机
shijidianli在不同土质下土壤电阻率参考表
基于STC89C52单片机的数字电压表
s