当前位置:   article > 正文

STM32_HAL库—ADC采集数据_hal库adc采集

hal库adc采集

目录

一、简介

二、实例

1. (单通道、阻塞式)配置及实现方式

2. (单通道、中断式)配置及实现方式

3. (多通道、阻塞式)配置及实现方式

4. (多通道、DMA)配置及实现方式


一、简介

       STM32 的ADC精度为 12 位,且每个 ADC 最多有 16 个外部通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

        ADC 的转换时间跟 ADC 的输入时钟和采样时间有关,公式为:

Tconv = ( 采样时间 + 12.5 个周期 ) / 预分频

        一般我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是12M,然后设置 “ 采样时间 ” 为 1.5 个周期。通过公式:(1.5+12.5) / 12M = 1.166...us ,算出最短的转换时间大约为 1.17us。

        下面使用的 3 个例子设置的 “ 采样时间 ” 为 239.5 个周期,转换时间则大约为 240.54us。

二、实例

晶振配置(72M)在这里插入图片描述

1. (单通道、阻塞式)配置及实现方式

(1)配置数据

(2)代码实现

  1. HAL_ADCEx_Calibration_Start(&hadc1); //ADC内部校准
  2. HAL_ADC_Start(&hadc1); //ADC开启转换
  3. while(1){
  4. uint16_t ADC_num = HAL_ADC_GetValue(&hadc1); //获取ADC端口数据
  5. float ADC_V = 3.3*ADC_num/4096; //换算后的电压值(默认参考电压接的3.3V)
  6. ......
  7. }

2. (单通道、中断式)配置及实现方式

 (1)配置数据

ADC1中断使能。

  (2)代码实现。

  1. uint16_t ADC_num;
  2. //主函数
  3. main(){
  4. HAL_ADCEx_Calibration_Start(&hadc1); //ADC内部校准
  5. HAL_ADC_Start_IT(&hadc1); //ADC开启中断转换
  6. while(1){
  7. ......
  8. float Adc_Value= 3.3*ADC_num/4096; //换算后的电压值(默认参考电压接的3.3V)
  9. ......
  10. }
  11. }
  12. //ADC中断回调函数
  13. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
  14. ADC_num=HAL_ADC_GetValue(&hadc1);
  15. }

3. (多通道、阻塞式)配置及实现方式

(1)配置数据

 (2)代码实现

  1. HAL_ADCEx_Calibration_Start(&hadc1); //ADC内部校准
  2. while(1){
  3. HAL_ADC_Start(&hadc1); //ADC开启转换
  4. while (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);//等待ADC转换完成,或者超过最大等待时间
  5. uint16_t ADC_num1 = HAL_ADC_GetValue(&hadc1); //获取ADC端口1 数据
  6. HAL_ADC_Start(&hadc1); //ADC开启转换
  7. while (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);//等待ADC转换完成,或者超过最大等待时间
  8. uint16_t ADC_num2 = HAL_ADC_GetValue(&hadc1); //获取ADC端口2 数据
  9. HAL_ADC_Start(&hadc1); //ADC开启转换
  10. while (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);//等待ADC转换完成,或者超过最大等待时间
  11. uint16_t ADC_num3 = HAL_ADC_GetValue(&hadc1); //获取ADC端口2 数据
  12. float ADC_V1 = 3.3*ADC_num1/4096; //换算后的电压值(默认参考电压接的3.3V)
  13. float ADC_V2 = 3.3*ADC_num2/4096; //换算后的电压值(默认参考电压接的3.3V)
  14. float ADC_V2 = 3.3*ADC_num2/4096; //换算后的电压值(默认参考电压接的3.3V)
  15. ......
  16. }

4. (多通道、DMA)配置及实现方式

(1)配置数据

(2)代码实现

  1. __IO uint16_t ADC_Value[2]={0}; //ADC缓存变量
  2. HAL_ADCEx_Calibration_Start(&hadc1); //ADC1内部校准
  3. HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value,2); //开启ADC中断DMA转换
  4. while(1){
  5. float ADC_1 = (float)3.3*ADC_Value[0]/4096; //对ADC_Value[0](通道8)缓存的值换算成电平数据
  6. float ADC_2 = (float)3.3*ADC_Value[1]/4096; //对ADC_Value[1](通道9)缓存的值换算成电平数据
  7. .....
  8. }
  9. //ADC1_DMA中断回调函数
  10. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
  11. //HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value,2); //配置里面打开了“连续转换模式”,所以这里不用再次开启ADC中断DMA转换
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/126003
推荐阅读
相关标签
  

闽ICP备14008679号