ADC—DAC
ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。
12位逐次逼近型ADC,1us转换时间
输入电压范围:03.3V,转换结果范围:04095
一一对应的线性关系
18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
逐次逼近型ADC
从多个输入通道中选择开关输入,再通过逐次逼近将数据传输给DAC
ADC框图
通道
转换模式
(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 | void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); |
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; |
注:结构体初始化的时候要放的是结构体的地址