ADC模数转换 基本原理

Posted studying~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADC模数转换 基本原理相关的知识,希望对你有一定的参考价值。

ADC:模数转换器,将模拟信号(0v,3v,6v等)转换为表示一定比例电压值的数字信号(1,2,3等)。

STM32F10x ADC特点

12位逐次逼近型的模拟数字转换器。
最多带3个ADC控制器
最多支持18个通道,可最多测量16个外部和2个内部信号源。
支持单次和连续转换模式
转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
通道0到通道n的自动扫描模式
自动校准
采样间隔可以按通道编程
规则通道和注入通道均有外部触发选项
转换结果支持左对齐或右对齐方式存储在16位数据寄存器
ADC转换时间:最小转换时间 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)

在这里插入图片描述

ADC供电要求:2.4V-3.6V
ADC输入范围:VREF-(负参考电压,一般为0v) ≤ VIN(输入电压) ≤ VREF+(正参考电压,一般为3.3v)

STM32F10x系列芯片ADC通道和引脚对应关系

在这里插入图片描述
ADC框图
在这里插入图片描述
在这里插入图片描述

STM32通道组

规则通道组:相当正常运行的程序,即对通道转换的进行排序,最多16个通道。
注入通道组:相当于中断,可以打断规则通道组的转换顺序,去转换指定的通道,最多4个通道。
在这里插入图片描述

通道转换模式

单次转换模式:ADC只执行一次转换。
连续转换模式:当前ADC转换一结束马上启动另一次转换。
扫描模式:ADC扫描所有被(规则或注入)通道组选中的通道,并在每个通道上进行单次转换。
在扫描模式下,由ADC_SQRx或者ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE,即使能中断标志位,则在最后一个通道转换完毕后才会产生EOC或者JEOC中断。

转换结束会将数据传入对应的寄存器,并将转换结束标志置1,若设置了使能中断标志位,则开启中断。

ADC中断

规则组和注入组的每个通道转换结束都会产生中断

ADC时钟配置

来自APB2总线时钟的分配

不要让ADC时钟超过14MHz,否则可能不准。

====================================================================

常用库函数

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);

void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

ADC初始化函数ADC_Init

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

typedef struct
{
  uint32_t ADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位
  FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位 
  FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
  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;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//不开启扫描 
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发软件 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);	

ADC使能函数 ADC_Cmd();

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC使能软件转换函数 ADC_SoftwareStartConvCmd

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState)

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动

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_1, 1, ADC_SampleTime_239Cycles5 );

ADC 获取转换结果函数ADC_GetConversionValue

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

ADC_GetConversionValue(ADC1);//获取ADC1转换结果

ADC单次转换实现步骤
1.开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
GPIO_Init();
APB2PeriphClockCmd();
2. 复位ADC1,同时设置ADC1分频因子。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
3. 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
4. 使能ADC并校准。
ADC_Cmd(ADC1, ENABLE);
5. 配置规则通道参数:
ADC_RegularChannelConfig();
6.开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
7.等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);

以上是关于ADC模数转换 基本原理的主要内容,如果未能解决你的问题,请参考以下文章

ADC-DET是啥

用Proteus仿真Arduino UNO ADC模数转换

51单片机 ADC0809模数转换与显示+Proteus仿真

STM32学习笔记(13)——模数转换ADC

stm32F103之ADC模数转换

51单片机ADC0832模数转换+ LCD12864显示+Proteus仿真