大家好,欢迎来到IT知识分享网。
ADC介绍
ADC:(Analog to Digital Converter),即模数转换器,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。 它的一般工作过程为:采样——保持——量化——编码。
ADC框图
STM32F103中ADC模块的引脚,分为三个部分,红色框住的是参考电压引脚和器件工作所需电压的引脚;
蓝色和黄色框表示ADC的通道,每个ADC具有多达18个复用通道,可测量来自16个外部源(蓝色框住的,测量从GPIO端口输入的信号)、两个内部源和VBAT通道的信号(黄色框住的,是内部已经接好了的内部输入信号通道)。
ADC引脚

STM32F10X ADC特点
- 12位(位数决定精度)逐次逼近型的模拟数字转换器。
- 最多带3个ADC控制器(每个控制器有多个通道)
- 最多支持18个通道,可最多测量16个外部和2个内部信号源。
- 支持单次和连续转换模式
- 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
- 通道0到通道n的自动扫描模式
- 自动校准
- 采样间隔可以按通道编程
- 规则通道和注入通道均有外部触发选项
- 转换结果支持左对齐或右对齐方式存储在16位数据寄存器
- ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
- ADC供电要求:2.4V-3.6V(通常0-3.3)
- ADC输入范围:VREF ≤ VIN ≤ V0REF+
ADC通道选择
单次转换模式
连续转换模式
ADC时序图
STM32F1x ADC(库函数)
先开启ADC外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
设置ADCCLK的预分频器
ADCCLK预分频器,ADC最多只能14MHz,APB2位72MHz,选择6分频,72/6得到12MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
初始化ADC
初始化ADC,参数一:指定使用哪个ADC资源,可选ADC1、ADC2、ADC3。
参数二:传入ADC_InitStruct类型变量的地址。
ADC_Init(ADC1,&ADC_InitStruct);
ADC_Mode | 选择工作模式,仅用单个ADC的话,那我们选择ADC_Mode_Independent |
ADC_ScanConvMode |
是否开始扫描模式,ENABLE或是DISABLE,不开启的话,仅转换 待转换队列的第一个通道,开启之后会自动按照顺序来转换每个配置过 的通道,一般扫描模式配合DMA转运一起,因为ADC转换速度极快,而 所有通道的转换结果都是放到同一个寄存器里的,因此手动转移结果太慢 的话就会被覆盖,太快的话就会拿到错误数据。 |
ADC_ContinuousConvMode |
是否开启连续模式,ENABLE或是DISABLE,不开启的话每次转换 完一次待转换队列的通道之后就会停下,等待下次转换指令。 开启的话就会不断地一次次自动转换所有配置过的通道。 |
ADC_ExternalTrigConv |
是否使用外部触发,不使用则软件触发,一般使用 软件触发ADC_ExternalTrigConv_None,触发函数下面会介绍。 |
ADC_DataAlign |
数据对齐方式,ADC转换的结果是12位的,而存放结果的 寄存器是16位的,因此有4位的空白位,我们可以选择左对齐或是右对齐, 一般选择右对齐ADC_DataAlign_Right。 |
ADC_NbrofChannel |
通道数目,1 to 16 配置多少就写多少。 |
配置规则组的输入通道
参数一:指定ADC资源
参数二:指定通道,参考引脚定义表
参数三:此参数介于1到16之间,理解为ADC转换通道需要排队,按顺序来转换
参数四:选择转换时间。实际上是选择用几个周期去采样时间,使用的周期越多采样时间越长,得到的数据也就更稳定,没有特殊要求的话可以随意选择一个选项。
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
以内部的温度传感器为例计算这个选项该如何选择
参考手册里说推荐采样时间为17.1us,而采样时间的计算公式为:
(1s/12MHz)*x。x为我们选择的采样花费的周期数,经过计算我们可以知道,x至少要为205.2,因此如果我们要采样内部的温度传感器的话,我们应该选择ADC_SampleTime_239Cycles5。
使能ADC
参数一:选择ADC资源
参数二:选择是否使能
ADC_Cmd(ADC1,ENABLE);
校准
ADC 有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在
校准期间,在每个电容器上都会计算出一个误差修正码 ( 数字值 ) ,这个码用于消除在随后的转换
中每个电容器上产生的误差。
参数:传指定ADC资源
ADC_ResetCalibration(ADC1); //复位校准
while(SET==ADC_GetResetCalibrationStatus(ADC1)); //等到复位校准完成
ADC_StartCalibration(ADC1); //开始校准
while(SET==ADC_GetCalibrationStatus(ADC1)); //等待校准完毕
取值
参数一:指定要读取的ADC资源
读取对应的ADCDR寄存器(读取转换完的数据的前提是转换完了,如果不是连续模式的话,我们是需要先触发转换并且等待转换完毕之后再读取的)
ADC_GetConversionValue( ADC1 );
软件触发转换
参数一:指定触发转换的ADC资源
参数二:是否开启触发转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
获取ADC标志位
参数一:指定ADC资源
参数二:指定要获取的标志位,转换是否结束,获取的标志位:ADC_FLAG_EOC
ADC_GetFlagStatus( ADC1 , ADC_FLAG_EOC )
使用内部温度传感器
参数:是否开启
ADC_TempSensorVrefintCmd(ENABLE);
如果要使用内部的温度传感器的话,使用上面的函数把功能打开,并且这个传感器只能为ADC1使用,通道为第17个通道,也就是 ADC_Channel_16。并且上面说了,推荐的采样时间为17.1us,需要根据这个来配置采样周期。
假设得到的值为x,那么转换为摄氏度的公式为: (1.43-(x*(3.3/4096)))/0.0043+25
最后接线调试。
简述ADC流程
- 首先需要打开外设时钟,使用ADC1就把对应的时钟打开。
- 如果外接模拟信号的话,就把对应的GPIO口配置为模拟输入模式,同时对应的外设时钟也要打开。
- 配置ADCCLK的分频器,因为不能超过14MHz,所以至少是6分频。
- 初始化ADC,参考上面的函数。
- 配置输入通道(一般使用规则组的通道)。
- 使能,上电完之后校准(非必须,但是加上不碍事)
- 在需要的时候触发转换(如果是连续模式的话就不用手动触发了),然后获取值。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140608.html