ADC模数转换基本原理
一.参考资料
正点原子探索者STM32F4开发板
《STM32F4开发指南-库函数版本》-第23章 ADC实验
- STM32F4xx官方资料:
《STM32F4中文参考手册》-第11章 模数转换(ADC)
二.ADC
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
1.STM32F4x ADC特点
2.STM32F40x大容量芯片带3个ADC控制器
其中144脚芯片因为带PF脚,所以多8个通道,为24个外部通道。
小于144脚芯片只有16个外部通道。
3.STM32F40x系列ADC外部通道和引脚对应关系
通道号 | ADC1 | ADC2 | ADC3 |
---|---|---|---|
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | PF3 |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC13 | PC13 | PC13 |
通道14 | PC4 | PC4 | PF4 |
通道15 | PC5 | PC5 | PF5 |
4.ADC引脚
5.ADC框图
6.STM32通道组
- 规则通道组:相当正常运行的程序。最多16个通道。
规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中 - 注入通道组:相当于中断。最多4个通道。
注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中
STM32F4的ADC的各通道可以单次,连续,扫描或者间断模式执行。
7.单次转化 VS 连续转换
8.扫描模式
9.ADC_CR1控制寄存器1
10.ADC中断
11.ADC时钟配置
不要让ADC时钟超过36MHz,否则可能不准。
12.ADC_CCR通用控制寄存器
13.ADC_CR1寄存器
14.ADC_CR2寄存器
15.数据对齐方式
16.ADC_SMPR1寄存器
17.ADC_SMPR2寄存器
18.ADC的采样时间
最小采样时间0.42us(ADC时钟=36MHz,采样周期为3周期下得到)
19.ADC_SQR1/SQR2/SQR3规则序列寄存器
20.ADC_JSQR注入系列寄存器
21.ADC_DR规则通道数据寄存器
22.ADC_JDR注入通道数据寄存器
23.ADC_SR状态寄存器
24.常用库函数
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
25.ADC通用初始化函数ADC_CommonInit
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
typedef struct
{
uint32_t ADC_Mode;//多重ADC模式选择
uint32_t ADC_Prescaler; //ADC预分频
uint32_t ADC_DMAAccessMode; //DMA访问模式
uint32_t ADC_TwoSamplingDelay; //2个采样阶段之间的延迟
}ADC_CommonInitTypeDef;
这些参数用来配置ADC_CCR寄存器的相关参数
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct)
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay
= ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode
= ADC_DMAAccessMode_Disabled; //DMA失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);
26.ADC初始化函数ADC_Init
void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);
typedef struct
{
uint32_t ADC_Resolution;//ADC分辨率
FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位
FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
uint32_t ADC_ExternalTrigConvEdge; //外部触发使能方式:ADC_CR2的位29:28,EXTEN
uint32_t ADC_ExternalTrigConv; //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]
uint32_t ADC_DataAlign; //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN
uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]
}ADC_InitTypeDef;
void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
27.ADC使能函数 ADC_Cmd();
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
28.ADC使能软件转换函数 ADC_SoftwareStartConvCmd
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState)
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动
29.ADC 规则通道配置函数ADC_RegularChannelConfig
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1,ADC_SampleTime_480Cycles);
30.ADC 获取转换结果函数ADC_GetConversionValue
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC_GetConversionValue(ADC1);//获取ADC1转换结果
三.实验
实验目的:ADC1的通道5(PA5)进行单次转化
- 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_Init(); - 复位ADC1,同时设置ADC1分频因子。
ADC_DeInit(ADC1); - 初始化ADC_CCR寄存器。
ADC_CommonInit(); - 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct); 使能ADC。
ADC_Cmd(ADC1, ENABLE);
- 配置规则通道参数:
ADC_RegularChannelConfig(); - 开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);