少女祈祷中...

ADC—DAC

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

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

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

输入电压范围:03.3V,转换结果范围:04095

一一对应的线性关系

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

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

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

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

逐次逼近型ADC

image.png

从多个输入通道中选择开关输入,再通过逐次逼近将数据传输给DAC

ADC框图

image.png

image.png

通道

image.png

转换模式

(1)单次转换,非扫描模式

(2)单次转换,扫描模式

(3)连续转换,扫描模式

数据对齐

数据全靠右,前面补0.

AD转换的步骤

量化、编码:ADC逐次比较的过程

采样、保持:闭合采样开关,过一段时间再断开。

STM32 ADC的总转换时间为:

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

EOC为1,表示转换已完成,为0,表示转换未完成。

EOC会自动清除标志位,不需手动

代码逻辑

(1)开启RCC时钟,包括ADC与GPIO

配置ADCCLK分频器

(2)把GPIO配置成模拟输入的模式

(3)配置多路开关

(4)配置ADC转换器

单次转换/多次转换

扫描/非扫描

通道个数

触发源

数据对齐

(5)给ADC上电

代码

对APB2的72MHZ时钟选择2,4,6,8分频,输入到ADCCLK

1
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);

恢复缺省配置

1
void ADC_DeInit(ADC_TypeDef* ADCx);

Init初始化

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

StructureInit结构体初始化

1
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);

给ADC上电

1
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

开启DMA输出信号

1
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

中断输出控制

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

复位校准

1
void ADC_ResetCalibration(ADC_TypeDef* ADCx);

获取复位校准状态

1
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

开始校准

1
void ADC_StartCalibration(ADC_TypeDef* ADCx);

获取开始校准状态

1
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

ADC软件触发控制

1
void ADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx, FunctionalState NewState);

判断EOC是否置1,(判断转换是否结束)

1
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

配置间断模式

(1)每隔几个通道中断一次

1
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);

(2)是否启用中断模式

1
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

给序列填写通道

1
2
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
//Rank对应规则组里16个序列

ADC获取转换值

1
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

模拟看门狗配置

(1)是否启动看门狗

1
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);

(2)配置高低阈值

1
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);

(3)配置看门通道

1
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);

获取标志位状态

1
void ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

清除标志位

1
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

获取中断状态

1
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);

清除中断挂起位

1
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

注:要选择模拟输入,AIN模式就是ADC的专属模式

1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

注:结构体初始化的时候要放的是结构体的地址