一、ADC介绍
ADC,即模数转换器,它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC,每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和两个内部信号源。各个通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或者右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2(72M的APB2总线)经分频产生。
二、ADC主要特征
●12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求:2.4V到3.6V
● ADC输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有DMA请求产生
三、STM32F1 ADC结构框图
这里参照的是stm32中文手册中的图:
在上图中,可以看出,在这3个ADC中,每个都有16个外部通道(0~15) ,经GPIO端口到达注入通道或者规则通道,规则通道和注入通道的不同就是:在规则通道中,ADC会按顺序依次扫描每个通道,而注入通道有点像中断,如果ADC正在扫描规则通道,但是有个注入通道,此时会优先扫描注入通道中的数据, 注入通道是不按顺序来的。外部的 16 个通道在转换的时候可分为2组通道:规则通道组和注入 通道组,其中规则通道组最多有16路,注入通道组最多有 4 路。
stm32中GPIO端口对应的ADC通道如下图:
四、stm32ADC配置步骤
具体配置步骤如下:
(1)使能端口时钟和ADC时钟,设置引脚模式为模拟输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式
(2)设置ADC的分频因子
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
(3)初始化ADC参数,包括ADC工作模式、规则序列等
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef*
ADC_InitStruct);
typedef struct
{
uint32_t ADC_Mode; // ADC 工作模式选择
FunctionalState ADC_ScanConvMode; /* ADC 扫描(多通道)或者单
次(单通道)模式选择 */
FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连
续转换选择
uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择
uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式
uint8_t ADC_NbrOfChannel; // ADC 采集通道数
} ADC_InitTypeDef;
(4)使能ADC并校准
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
执行复位校准的方法是:
ADC_ResetCalibration(ADC1);
执行 ADC 校准的方法是:
ADC_StartCalibration(ADC1); //开始指定 ADC1 的校准状态
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
(5)读取ADC转换值
设置规则序列通道以及采样周期的库函数是:
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t);
ADC_Channel,uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1,
ADC_SampleTime_239Cycles5 );
设置好规则序列通道及采样周期,接下来就要开启转换,由于我们采
用的是软件触发,库函数
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,
FunctionalState NewState);
开启转换之后,就可以获取ADC 转换结果数据,调用的库函数是:
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
获取 AD 转换的状态信息的库函数是:
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t
ADC_FLAG);
例如我们要判断 ADC1 的转换是否结束,方法是:
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束