STM32F0 ADC学习

这篇博客主要探讨了STM32F0系列微控制器中ADC的使用,特别是在STM32F0XX_HAL_DRIVER驱动库中的实现。通过在stm32f0xx_hal_conf.h中启用ADC宏定义,可以开启ADC模块。文章介绍了ADC的三种工作模式:polling、interrupt和DMA,并选择了polling模式来获取多个通道的数据。在配置过程中,涉及到了ADC_HandleTypeDef和ADC_ChannelConfTypeDef结构体,以及关键参数如ADC时钟选择、采样周期、分辨率和扫描模式的设定。此外,还详细说明了一个名为get_ADC_value的函数,用于根据通道号获取相应的AD转换值。

开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。

ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。

ADC有三种工作模式,polling\ interrupt\DMA


我这里使用了polling的方式来获取多通道的数据。


首先是要声明两个参数设置的结构体

ADC_HandleTypeDef             AdcHandle;
ADC_ChannelConfTypeDef        sConfig;

  AdcHandle.Instance = ADC1;
  
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;
  AdcHandle.Init.LowPowerAutoWait      = DISABLE;
  AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.ScanConvMode          = ADC_SCAN_ENABLE;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.ContinuousConvMode    = ENABLE;
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  AdcHandle.Init.DMAContinuousRequests = DISABLE;//
  AdcHandle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;
  
  /* Initialize ADC peripheral according to the passed parameters */
  if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
  {
    Error_Handler();
  }
  
    if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    Error_Handler();
  }
  
  /* ### - 2 - Start calibration ############################################ */
  if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
  {
    Error_Handler();
  }

基本的参数设置

比较重要的参数有ADC clock设置,sample cycle,ADC分辨率,多通道 scan mode设置。

ADC clock 有两个时钟源可以选择,一个是内部的14MHZ的时钟,,另一个为APB的时钟 最大为14MHZ.




get_ADC_value 为读取AD值的模块,形参为通道,输入通道名称得到该通道对应的AD值。

float get_ADC_value(uint32_t channel)
{
 // uint32_t nResultDMA;
  float  temp;
  start_adc();
  config_channel(channel);
  
  HAL_ADC_Start(&AdcHandle);
  HAL_ADC_PollForConversion(&AdcHandle,1);
  
  temp=HAL_ADC_GetValue(&AdcHandle);
  HAL_ADC_Stop(&AdcHandle);
  //temp=temp*3/4096;
  return temp;

}









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值