ADC转换原理与应用详解
目录
1.ADC介绍
并联比较型 AD(速度最快)
逐次逼近型 adc
ADC的转换模式
ADC的架构
1.ADC输入通道
2.注入通道,规则通道
3.ADC时钟
4.外部触发转换
5.中断
F1与F4区别-ADC
Cubemx的相关配置和配置项说明
ADC相关函数
1.ADC介绍
ADC 基本原理:ADC(Analog - to - Digital Converter,模拟数字转换器)的作用是将模拟信号转换为数字信号。它通过采样、量化和编码三个过程,将连续变化的模拟电压信号转换为离散的数字量 。
并联比较型 AD(速度最快)
vin 是参考电压,接到比较器的+端,- 端接到用来分压的电阻。假设总电压是 8V,8 个电阻可以将其分为 8 等份,精度是 1V;vin 大于- 端的电压比较器输出 1,反之输出 0 ;
比较器的输出端连接锁存器的输入端 D,这个锁存器可以存储一位数据;C 脚的控制引脚,C 脚输入 1 时,锁存器的输入端输入什么,锁存器的输出端就输出什么;如果 C 脚是 0,则无论输入端输入什么,输出端依然保持上一次的数据;
锁存器连接编码器电路,将 8 位转换为 3 位
12位模拟数字转换器
就是ADC的数字存储是12位的 也就是说转换器通过采集转换所得到的最大值是4095 “111111111111”=4095 二进制的12位可表示0-4095个数, 对应着所测电压的实际值,转换的电压范围是0v-3.3v的话,转换器就会把0v-3.3v平均分成4096份。设转换器所得到的值为x,所求电压值为y。
注:有的核心板只有一个ADC(如f411ceu6),具体看具体芯片手册
16个外部通道:芯片上有16个引脚是可以接到模拟电压上进行电压值检测的
2个内部信号源 : 一个是内部温度传感器,一个是内部参考电压
一共支持23个引脚支持ADC,包括21个外部和2个内部信号源
逐次逼近型 adc
原理:二分法
SAR 逐次逼寄存器,执行二分算法的过程
S/H 保持住采集到的 VIN 电压
2^4 次方作为第一次比较,然后是 2^3……到 2^0
ADC的转换模式
a. 单次转换模式:ADC只执行一次转换;
b.连续转换模式:转换结束之后马上开始新的转换;
c.扫描模式:ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续 转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
d.间断模式:触发一次,转换一个通道,再触发,再转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。
扫描模式简单的说是一次对所有所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。 ch0转换完以后就会自动转换通道1,4,5直到转换完这个过程不能被打断。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换。
这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道单独配置为一组。这样每一组转换之前都需要先触发一次。
ADC单通道:
只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换
进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。
ADC多通道:
只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换
进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。
也就是:多通道必须使能扫描模式
ADC的架构
(这是F411的ADC框图)
Vdda和Vssa应该分别连接到Vdd和Vss
1.ADC输入通道
从ADCx_INT0-ADCx_INT15 对应三个ADC的16个外部通道,进行模拟信号转换 此外,还有两个内部通道:温度检测或者内部电压检测
选择对应通道之后,便会选择对应GPIO引脚,相关的引脚定义和描述可在开发板的数据手册里找
2.注入通道,规则通道
我们看到,在选择了ADC的相关通道引脚之后,在模拟至数字转换器中有两个通道,注入通道,规则通道,规则通道至多16个,注入通道至多4个
规则通道:
规则通道相当于你正常运行的程序,看它的名字就可以知道,很规矩,就是正常执行程序
注入通道:
注入通道可以打断规则通道,听它的名字就知道不安分,如果在规则通道转换过程中,有注入通道进行转换,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程
3.ADC时钟
图中的ADC预分频器的ADCCLK是ADC模块的时钟来源。通常,由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。 分频因子由RCC_CFGR的ADCPRE[1:0]配置,可配置2/4/6/8分频
STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。
T = 采样时间 + 12.5个周期,其中1周期为1/ADCCLK
例如,当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周期=1us。
4.外部触发转换
ADC 转换可以由ADC 控制寄存器2: ADC_CR2 的ADON 这个位来控制,写1 的时候开始转换,写0 的时候停止转换
当然,除了ADC_CR2寄存器的ADON位控制转换的开始与停止,还可以支持外部事件触发转换(比如定时器捕捉、EXTI线)
包括内部定时器触发和外部IO触发。具体的触发源由ADC_CR2的EXTSEL[2:0]位(规则通道触发源 )和 JEXTSEL[2:0]位(注入通道触发源)控制。
同时ADC3的触发源与ADC1/2的触发源有所不同,上图已经给出,
具体查看第五部分框图即可理解。
5.中断
中断触发条件有三个,规则通道转换结束,注入通道转换结束,或者模拟看门狗状态位被设置时都能产生中断,
转换结束中断就是正常的ADC完成一次转换,进入中断,这个很好理解;
模拟看门狗中断:
当被ADC转换的模拟电压值低于低阈值或高于高阈值时,便会产生中断。阈值的高低值由ADC_LTR和ADC_HTR配置
模拟看门狗,听他的名字就知道,在ADC的应用中是为了防止读取到的电压值超量程或者低于量程。
DMA
同时ADC还支持DMA触发,规则和注入通道转换结束后会产生DMA请求,用于将转换好的数据传输到内存。
注意,只有ADC1和ADC3可以产生DMA请求,一般我们在使用ADC 的时候都会开启DMA 传输。
F1与F4区别-ADC
F4的ADC支持12位,10位,8位和6位精度,F1只支持12位
F1和F4都具有3个ADC,F1可提供21个输入通道,F4可以提供24个输入通道。
F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最
大采样频率为2.4Msps,3路交替采样可到7.2Msps。
Cubemx的相关配置和配置项说明
下面到了CubeMax的创建时间
H7支持16 14 12位等,最高是16位
配置ADC
设置ADC引脚
因为只有设置了ADC的引脚,才能够设置ADC的时钟分频
ADCs_Common_Settings ADC模式设置
Mode ADC_Mode_Independent
这里设置为独立模式
独立模式模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率
Data Alignment (数据对齐方式): 右对齐/左对齐
Scan Conversion Mode( 扫描模式 ) : DISABLE
如果只是用了一个通道的话,DISABLE就可以了(也只能DISABLE),如果使用了多个通道的话,会自动设置为ENABLE。 就是是否开启扫描模式
Continuous Conversion Mode(连续转换模式) ENABLE
设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以进行转换
Discontinuous Conversion Mode(间断模式) DISABLE
因为我们只用到了1个ADC,所以这个直接不使能即可
规则通道设置
Enable Regular Conversions (启用常规转换模式) ENABLE
使能 否则无法进行下方配置
Number OF Conversion(转换通道数) 1
用到几个通道就设置为几
多个通道自动使能扫描模式
Regular Conversion launched by software 规则的软件触发 调用函数触发即可
Timer X Capture Compare X event 外部引脚触发,
Timer X Trigger Out event 定时器通道输出触发 需要设置相应的定时器设置
这个具体在上方ADC框图的5部分有讲解
Rank 转换顺序
这个只修改通道采样时间即可 默认为1.5个周期
ADC相关函数
开启ADC 3种模式(轮询模式 中断模式DMA模式)
-
HAL_ADC_Start(&hadcx); //轮询模式开启ADC
-
HAL_ADC_Start_IT(&hadcx); //中断轮询模式开启ADC
-
HAL_ADC_Start_DMA(&hadcx); //DMA模式开启ADC
关闭ADC 3种模式(轮询模式 中断模式DMA模式)
-
HAL_ADC_Stop()
-
HAL_ADC_Stop_IT()
-
HAL_ADC_Stop_DMA()
ADC校准函数:
-
HAL_ADCEx_Calibration_Start(&hadcx);
F4系列不支持
读取ADC转换值
-
HAL_ADC_GetValue()
等待转换结束函数
-
HAL_ADC_PollForConversion(&hadc1, 50);
第一个参数是对应的ADC句柄,第二个参数为最大等待时间
ADC中断回调函数
-
HAL_ADC_ConvCpltCallback()
转换完成后回调,DMA模式下DMA传输完成后调用