你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32L0系列的ADC用法

[复制链接]
STMCU小助手 发布时间:2021-11-15 22:02
AD转换即模拟信号转换为数字信号,一般在单片机中模拟信号对应电压,通过ADC口将相应的电压转换为二进制的数字信号,从而推算出测得电压。下面我介绍下STM32中L0系列调用库函数来实现AD转换。

        首先最基本的AD转换模式,即单次单通道检测,且不用到DMA。L0系列一共有19个AD口对应19个AD通道,其中16到18为检测内部模拟信号的通道。下面代码中用到是PA0即对应通道0,具体代码如下图:

     
  1.   Adc_init()

  2. {
  3. __HAL_RCC_ADC1_CLK_ENABLE();
  4.     AdcHandle.Instance = ADC1;

  5.   AdcHandle.Init.OversamplingMode      = DISABLE;

  6.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;
  7.   AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
  8.   AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
  9.   AdcHandle.Init.LowPowerAutoWait      = DISABLE;

  10.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  11.   AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
  12.   AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
  13.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  14.   AdcHandle.Init.ContinuousConvMode    = ENABLE;
  15.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  16.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  17.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  18.   AdcHandle.Init.DMAContinuousRequests = DISABLE;

  19.     HAL_ADC_Init(&AdcHandle);
  20.     HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);

  21. }

  22. //配置ADC初始化

  23. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  24. {
  25.   GPIO_InitTypeDef                 GPIO_InitStruct;

  26.   /*##-1- Enable peripherals and GPIO Clocks #################################*/
  27.   /* Enable GPIO clock ****************************************/
  28.   __HAL_RCC_GPIOA_CLK_ENABLE();
  29.   /* ADC1 Periph clock enable */
  30.   __HAL_RCC_ADC1_CLK_ENABLE();

  31.   /*##- 2- Configure peripheral GPIO #########################################*/
  32.   /* ADC3 Channel8 GPIO pin configuration */
  33.   GPIO_InitStruct.Pin = GPIO_PIN_0;
  34.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  35.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  36.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  37. }

  38. //初始化ADC引脚PA0,开启时钟

  39. void get_voltage(void)
  40. {
  41.           bsp_adc_init();
  42.           HAL_ADCEx_EnableVREFINT();
  43.           HAL_ADC_Stop(&AdcHandle);
  44.           AdcHandle.Instance->CHSELR=0;
  45.           sConfig.Channel = ADC_CHANNEL_17;         //通道17专门测内部电压值
  46.            HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
  47.             HAL_ADC_Start(&AdcHandle);
  48.             HAL_ADC_PollForConversion(&AdcHandle, 10);   
  49.             /* Check if the continous conversion of regular channel is finished */
  50.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  51.             {
  52.                 /*##-6- Get the converted value of regular channel  ########################*/
  53.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
  54.             }

  55.             vdd_value=VREF_IN_VALUE*FULL_ADC_DIGTIL_VALUE/uwADCxConvertedValue;    //内部电源电压
  56.             HAL_ADCEx_DisableVREFINT();
  57.             HAL_ADC_Stop(&AdcHandle);
  58.             AdcHandle.Instance->CHSELR=0;
  59.             sConfig.Channel = ADC_CHANNEL_0;             //ADC0,去测外部PA0口接的电压
  60.           HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
  61.             HAL_ADC_Start(&AdcHandle);
  62.             HAL_ADC_PollForConversion(&AdcHandle, 10);   
  63.             /* Check if the continous conversion of regular channel is finished */
  64.             if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  65.             {
  66.                 /*##-6- Get the converted value of regular channel  ########################*/
  67.                 uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
  68.             }
  69.               //直接获取的是二进制码,14位对应最大值4095,内部电压为vdd_value通过比例计算得到电压数值
  70.             temp_voltage=(float)uwADCxConvertedValue*vdd_value/4095;
  71.              //得到浮点型电压值            是乘了1000倍的            
  72.             HAL_ADC_Stop(&AdcHandle);
  73.             //HAL_ADCEx_DisableVREFINT();
  74.             __HAL_RCC_ADC1_CLK_DISABLE();
  75.    }
  76. }
复制代码


  以上ADC检测,相当于一次连续检测了两次,第一次为内部电压用的特地通道17,第二次检测的是外部电压对应硬件连接的PA0对应通道0


收藏 评论0 发布时间:2021-11-15 22:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版