一、ADC简介
ADC(Analog-Digital Converter,模拟-数字转换器),可以将引脚上连续变化的模拟量转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁
模拟量:时间和幅值均连续的信号,例如:变换的电压、电流
数字量:时间和幅值均离散的信号,例如:单片机中的0和1
STM32的12位ADC是一种逐次逼近型模/数转换器。它多达18个通道,可测量16个外部和2个内部信号源。个通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐的方式存储在16位数据寄存器中
STM32F103C8T6的ADC资源:ADC1、ADC2,10个外部输入通道
ADC术语:
分辨率:满刻度电压与2ⁿ的比值,其中n位ADC的位数。例如:12位ADC能够分辨出满刻度1/2¹²(0.024%)的输入电压变化。一个10V满刻度的12位ADC能够分辨输入电压变化的最小值为2.4mV
转换速率:ADC能够重复进行数据转换的速度,即每秒转换的次数
绝对精度:在ADC中任何数码所对应的实际模拟电压与其理想的电压之差的最大值
相对精度:把这个最大偏差表示为满刻度模拟电压的百分数
线性度:ADC实际转移函数与理想直线的最大偏移
二、ADC结构
2.1 电压输入范围
ADC的输入范围:Vref- < VIN <Vref+
通常Vref+、Vref-和VDDA、VSSA,所以ADC的输入电压也就是:0~3.3V
如果要测量不在0~3.3V内的电压,需要在外部搭建转化电路
2.2 ADC时钟
由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器
2.3 输入通道
注意: 温度传感器和VREFINT只能出现在主ADC1中
对于STM32F103C8T6而言,ADC1与ADC2的外部输入通道相同,对应至PA0~PB1
ADC有16个多路通道。可以把转换组织成两组:规则组和注入组
● 规则组由多达16个转换组成
● 注入组由多达4个转换组成
规则通道:按照一定的顺序规则井然有序的进行转换输出,默认情况下使用的是规则通道。由于数据寄存器只能存储最后一个通道的转换数据,如果转换多通道数据,还需与DMA配合使用
注入通道:
(1)触发注入:如果在规则通道转换期间产生一个外部触发注入,当前转换被复位,注入通道序列被以单次扫描方式进行转换。然后,恢复上次被中断的规则组通道转换
如果在注入通道转换期间产生一个规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行
(2)自动注入:在此模式下,必须禁止注入通道的外部触发。如果设置了自动注入和连续模式、规则通道至注入通道的转换序列被连续执行。如果ADC时钟的预分频系数为4~8,在两通道的转换期间会自动插入1个ADC时钟间隔;如果分频系数为2,则右2个时钟间隔的延迟
所以,注入通道只有在规则通道存在时才会出现
1.利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。
2.如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。
3.然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
2.3 模式控制
(1)单次转换模式和连续转换模式
单次转换模式:ADC只进行一次转换,每次转换需要触发一次(读取结果时,需要判断结束标志位)
连续转换:当前ADC转换结束后立即启动下一次转换(读取结果时,不需要判断结束标志位)
每次转换结束后,转换数据被存储在相应的数据寄存器中,EOF(转换结束)/JEOF(注入转换结束)被置位,此外还可申请中断
(2)扫描模式和非扫描模式
ADC扫描被选中的所有通道。每个组的每个通道执行单次转换,在每个转换结束后,同一组的下一个通道被自动转换
注:非扫描模式下,仅第一个序列有效
如果设置了连续转换,则不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换
(3)间断模式
规则组间断模式:可以用来执行一个短序列的n次转换(n≤8)
例如,n=3,被转换的通道:0、1、2、3、6、7、8、9
①第一次触发,转换序列为0、1、2
②第二次触发,转换序列为3、6、7
③第三次触发,转换序列为8、9,并产生EOC(End of conversion)事件
④第四次触发,转换序列为0、1、2
注入组间断模式:可以用来执行一个短序列的n次转换(n≤8)
例如,n=1,被转换的通道:1、2、3
①第一次触发,转换序列为1
②第二次触发,转换序列为2
③第三次触发,转换序列为3,并产生EOC(End of conversion)和JEOF(Injected channel end of conversion)事件
④第次触发,转换序列为1
(4)双ADC模式
2.4 外部触发转换
2.5 DMA请求
2.6 数据对齐
一般选用右对齐的方式,读出的值就是转换结果
左对齐的方式,相当于将数据左移了4位,也就是:结果=实际数据*16
如果不需要那么高的精度,可以使用左对齐,然后取出高n位,即可
2.7 转换时间
ADC采样之后,防止外部电压不断变化造成量化、编码的影响,需要将采集到的电压保持一小段时间
采样时间可由软件进行配置,采样时间越长,越能避免一些毛刺信号的干扰,但相应的转换时间也会延长
2.8 校准
2.9 ADC中断
EOC(End of conversion)和JEOF(Injected channel end of conversion)
三、ADC相关库函数
3.1 初始化函数:ADC_Init()
3.2 校准函数
3.3 软件触发转换函数
3.4 通道配置:ADC_RegularChannelConfig ()
四、ADC配置
(1)开启ADC、GPIO时钟
(2)配置ADCCLK的分频器
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //APB2六分频
(3)配置GPIO,完成初始化(模拟输入)
(4)配置多路开关,把左边的通道接入右边的规则组列表中
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5); //在序列1的位置上写入通道3
(5)配置ADC,完成初始化
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; //工作模式:独立模式
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; //单次转换
ADC_InitStruct.ADC_ScanConvMode = DISABLE; //非扫描模式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐:右对齐
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发源选择:不使用外部触发
ADC_InitStruct.ADC_NbrOfChannel = 1; //进行规则转换的数目通道
ADC_Init(ADC1,&ADC_InitStruct);
(6)中断配置(如果使用中断,需要此步骤)
(7)配置NVIC,完成初始化(如果使用中断,需要此步骤)
(8)校准
ADC_ResetCalibration(ADC1); //复位校准
while(ADC_GetResetCalibrationStatus(ADC1) == SET); //复位校准完成
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1) == SET); //复位校准完成
(9)使能ADC