STM32开发(ADC模数转换)
目录
一、ADC相关介绍
二、CPU内的ADC1/4
1、ADC工作原理
2、ADC转换公式
3、采样时机和偏移补偿
三、ADC工作模式
1、ADC内部框图
1)ADC1内部框图
2)ADC4内部框图
2、ADC采样模式
四、标准库操作ADC
五、HAL库操作ADC
1、STM32CudeMX配置工程
1)配置引脚为ADC模式
2)配置ADC模式的各项参数
2、API接口分析
1)HAL_ADC_Start(开启ADC采集转化功能)
2)HAL_ADC_PollForConversion(监视ADC转化是否完成)
3)HAL_ADC_GetValue(获取ADC采集转化的结果)
4)HAL_ADC_Stop(关闭ADC采集转化功能)
5)HAL_ADCEx_Calibration_Start(校准采样时机)
3、示例代码
1)单通道单次转化模式
2)单通道多次转换模式
3)多通道多次转换模式
一、ADC相关介绍
ADC(Analog to Digital converter):模数转换(模拟信号转数字信号)
模拟信号:周期性连续变化的信号
数字信号:由0和1组成的离散信号
二、CPU内的ADC1/4
ADC的采样位数: 本质就是ADC采样的精度,也就是模拟信号转化为数学信号后的位数,位数越多精度越高
数据寄存器: 用于存储转换后的数字量
最大采样速率: 代表每秒采样的次数,取决于CPU的时钟速率
1、ADC工作原理
ADC的转化原理:逐次逼近法
逐次逼近法:二分查找(折半查找)以ADC4为例,ADC4是12位采样,那么就是将Vin分成了2^12份,就是4096份,从这4096份中不断折半查找
2、ADC转换公式
以电压模拟信号->电压数字信号为例,此时使用12位的ADC4待测电压的数字信号 = (2^(ADC的采样位数) / 参考电压) * 待测电压值ADC转化后的数字信号 = 4096 / 3.2v * 2.15v = 1010 1100 0000
解析:4096:代表对应采样位数的ADC转化最大范围(12位ADC为2^12, 14位ADC为2^14)3.2v:参考电压/供电电压2.15v:待测电压
3、采样时机和偏移补偿
当我们使用ADC采集,去采集一些波形信号的时候,
就和上图一样是通过采集多个点来模拟连续信号的。(图中只使用了3个采集点,一般常用5点法,或者更多)但是硬件没办法将采集时机的间隔完全保持一致,那么采集多次后就会向后发生相位偏移,
就会导致无法采集到所需要的信号,因此需要使用硬件所提供的偏移补偿机制也就是校准机制偏移补偿机制:实际上是初始化采集时机,也就是校准注意:校准ADC采样时机,只有采样开始前和采样结束后 可以校准,采样过程中不可以校准初始化
三、ADC工作模式
1、ADC内部框图
1)ADC1内部框图
2)ADC4内部框图
2、ADC采样模式
单通道单次转化模式:只是用ADC模数转换器中的一个独立通道,将输入到这个通道中的模拟信号转换为数字信号,并且只转化一次就结束单通道连续转化模式:只是用ADC模数转换器中的一个独立通道,将输入到这个通道中的模拟信号转换为数字信号,当转化一次结束后,会自动开启下一次转化单通道连续转化模式 = while(1) + 单通道单次转化模式多通道单次转化模式:使用ADC模数转换器中的多个通道,这些通道中都会被输入模拟信号,ADC模数转换器会根据通道的顺序,依次转化成数字信号并且每个通道只转化一次多通道连续转化模式:使用ADC模数转换器中的多个通道,这些通道中都会被输入模拟信号,ADC模数转换器会根据通道的顺序,依次转化成数字信号当所有使用的通道都被转化一次之后,会回到最初始的通道重新开始转化多通道连续转化模式 = while(1) + 多通道单次转化模式间隔转化模式(间隔触发模式):想要实现ADC通道中模拟信号转化为数字信号,需要给对应通道提供一个触发信号(触发源)当这个触发信号触发时,ADC通道进行模数转化如:按键按下,ADC通道进行转化ADC的转化模式:独立模式(单通道模式)、扫描模式(多通道模式)、触发模式
四、标准库操作ADC
五、HAL库操作ADC
1、STM32CudeMX配置工程
1)配置引脚为ADC模式
2)配置ADC模式的各项参数
2、API接口分析
ADC采样和转换的流程1. 初始化ADC采样的采样时机(打开ADC采样的校准模式)2. 开启ADC采样转化功能3. 等待 采样和转化结束,将数字量数据存放到数据寄存器中4. 通过模数转换公式,将数字信号转换为模拟信号注意:校准ADC采样时机,只有采样开始前和采样结束后 可以校准,采样过程中不可以校准初始化
1)HAL_ADC_Start(开启ADC采集转化功能)
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
功能:HAL库提供的用于开启ADC采样转化功能的函数
参数:hadc:ADC4外设控制器的句柄
返回值:函数执行成功,返回HAL_OK函数执行失败,返回错误码
2)HAL_ADC_PollForConversion(监视ADC转化是否完成)
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
功能:HAL库提供的用于阻塞等待ADC采样+转化完毕,数据被存放到数据寄存器中的函数
参数:hadc:ADC4外设控制器的句柄Timeout:超时检测时间,当前函数的最大阻塞时间
返回值:当ADC采样+转化数据完毕后,表示这个函数执行成功,函数执行成功,返回HAL_OK当ADC采样+转化数据没结束时,此时这个函数处于阻塞状态函数执行失败,返回错误码#define HAL_MAX_DELAY 0xFFFFFFFFU (最大延时时间)
3)HAL_ADC_GetValue(获取ADC采集转化的结果)
uint32_t HAL_ADC_GetValue(const ADC_HandleTypeDef *hadc)
功能:HAL库提供的用于获取转化完毕的数字信号的函数
参数:hadc:ADC4外设控制器的句柄
返回值:返回成功获取的数字信号
4)HAL_ADC_Stop(关闭ADC采集转化功能)
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
功能:HAL库提供的用于关闭ADC采样转化功能的函数
参数:hadc:ADC4外设控制器的句柄
返回值: 函数执行成功,返回HAL_OK函数执行失败,返回错误码
5)HAL_ADCEx_Calibration_Start(校准采样时机)
/*** @brief Perform an ADC automatic self-calibration* Calibration prerequisite: ADC must be disabled (execute this* function before HAL_ADC_Start() or after HAL_ADC_Stop() ).* @param hadc ADC handle* @param CalibrationMode Selection of calibration offset or* linear calibration offset.* @arg ADC_CALIB_OFFSET Channel in mode calibration offset* @arg ADC_CALIB_OFFSET_LINEARITY Channel in mode linear calibration offset* @param SingleDiff Selection of single-ended or differential input* This parameter can be one of the following values:* @arg @ref ADC_SINGLE_ENDED Channel in mode input single ended* @arg @ref ADC_DIFFERENTIAL_ENDED Channel in mode input differential ended* @retval HAL status*/
HAL_StatusTypeDef
HAL_ADCEx_Calibration_Start
(ADC_HandleTypeDef *hadc, uint32_t CalibrationMode, uint32_t SingleDiff)功能:HAL库提供的用于校准ADC采样的函数(此函数只需要开启一次即可)
参数:hadc:ADC4外设控制器的句柄CalibrationMode:校准模式的设置ADC_CALIB_OFFSET 偏移量校准方式(最基础的)ADC_CALIB_OFFSET_LINEARITY 硬件线性化校准(高级的)线性化校准比偏移量校准更准确,一般使用一些高精度仪器上SingleDiff:输入的模拟信号的选择ADC_SINGLE_ENDED:输入单端信号(一个信号就代表一个电信号)ADC_DIFFERENTIAL_ENDED:输入差分信号(两个信号代表一个电信号)
返回值:函数执行成功,返回HAL_OK函数执行失败,返回错误码
3、示例代码
1)单通道单次转化模式
2)单通道多次转换模式
3)多通道多次转换模式