ADC简介

        ADC(Analog-Digital Converter)模拟-数字转换器

        ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

        12位逐次逼近型ADC,1us转换时间

        输入电压范围:0~3.3V,转换结果范围:0~4095

        18个输入通道,可测量16个外部和2个内部信号源

        规则组和注入组两个转换单元

        模拟看门狗自动监测输入电压范围

        STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

ADC框图

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

通道10

PC0

PC0

PC0

通道11

PC1

PC1

PC1

通道12

PC2

PC2

PC2

通道13

PC3

PC3

PC3

通道14

PC4

PC4

通道15

PC5

PC5

通道16

温度传感器

通道17

内部参考电压

转换模式

单词转换 非扫描模式

连续转换 非扫描模式

单次转换 扫描模式

连续转换 扫描模式

转换时间

        AD转换的步骤:采样,保持,量化,编码

STM32 ADC的总转换时间为:

        TCONV = 采样时间 + 12.5个ADC周期

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期

        TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

校准

        ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差

        建议在每次上电后执行一次校准

启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期

函数介绍

在rcc.h里,这个函数是用来配置ADCCLK分频器的,它可以对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCLK

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);

接下来都是在adc.h里,

//DeInit恢复缺省设置,恢复为上电默认状态,
void ADC_DeInit(ADC_TypeDef* ADCx);

//初始化
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

//结构体初始化
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);

//给ADC上电的
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

开启DMA输出信号的,如果使用DMA转运数据,就得调用这个函数

void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

中断输出控制,用于控制某个中断,能不能通往NVIC

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

下面四个函数分别是复位校准、获取复位校准状态,开始校准、获取开始校准状态,这就是用于控制校准的函数,在ADC初始化完成之后,以此调用

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

这个是用于软件触发的函数

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC获取软件开始转换状态(一般不用这个函数)

FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);

第一个获取标志位状态,用来判断转换是否结束,第二个清除标志位,第三个获取中断状态,第四个清除中断挂起位

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

配置间断模式,第一个函数是,每个几个通道间断一次,第二个函数是,是否启用间断模式

void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC规则组通道,第一个参数ADCx,第二个参数ADC_Channel就是你想指定的通道,第三个Rank就是序列几的位置,第四个SampleTime就是指定通道的采样时间(这个函数比较重要

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);

ADC外部触发转换控制,就是是否允许外部触发转换

void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC获取转换值,就是获取AD转换的数据寄存器,读取转换结果就是要使用这个函数(这个函数比较重要)

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

ADC获取双模式转换值,这个是双ADC模式读取转换结果的函数

uint32_t ADC_GetDualModeConversionValue(void);

下面三个函数是对模拟看门狗进行配置的,第一个是是否启动模拟看门狗,第二个是配置高低阈值,第三个是配置看门的通道,

void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);

ADC温度传感器,内部参考电压控制,这个是用来开启内部的两个通道的,如果要用这两个通道,就得调用这个函数

void ADC_TempSensorVrefintCmd(FunctionalState NewState);

作者:2401-

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 ADC模数转换器

发表回复