AD转换即模拟信号转换为数字信号,一般在单片机中模拟信号对应电压,通过ADC口将相应的电压转换为二进制的数字信号,从而推算出测得电压。下面我介绍下STM32中L0系列调用库函数来实现AD转换。

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

Adc_init()

{

__HAL_RCC_ADC1_CLK_ENABLE();
    AdcHandle.Instance = ADC1;
 
  AdcHandle.Init.OversamplingMode      = DISABLE;
  
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;
  AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
  AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
  AdcHandle.Init.LowPowerAutoWait      = DISABLE;
    
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
  AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.ContinuousConvMode    = ENABLE;
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  AdcHandle.Init.DMAContinuousRequests = DISABLE;

HAL_ADC_Init(&AdcHandle);
    HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);

}

//配置ADC初始化

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
  GPIO_InitTypeDef                 GPIO_InitStruct;
  
  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO clock ****************************************/
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /* ADC1 Periph clock enable */
  __HAL_RCC_ADC1_CLK_ENABLE();
  
  /*##- 2- Configure peripheral GPIO #########################################*/
  /* ADC3 Channel8 GPIO pin configuration */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

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

void get_voltage(void)
{
          bsp_adc_init();
          HAL_ADCEx_EnableVREFINT();
          HAL_ADC_Stop(&AdcHandle);
          AdcHandle.Instance->CHSELR=0;
          sConfig.Channel = ADC_CHANNEL_17;         //通道17专门测内部电压值
           HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
            HAL_ADC_Start(&AdcHandle);
            HAL_ADC_PollForConversion(&AdcHandle, 10);    
            /* Check if the continous conversion of regular channel is finished */
            if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
            {
                /*##-6- Get the converted value of regular channel  ########################*/
                uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
            }
            
            vdd_value=VREF_IN_VALUE*FULL_ADC_DIGTIL_VALUE/uwADCxConvertedValue;    //内部电源电压
            HAL_ADCEx_DisableVREFINT();
            HAL_ADC_Stop(&AdcHandle);
            AdcHandle.Instance->CHSELR=0;
            sConfig.Channel = ADC_CHANNEL_0;             //ADC0,去测外部PA0口接的电压
          HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
            HAL_ADC_Start(&AdcHandle);
            HAL_ADC_PollForConversion(&AdcHandle, 10);    
            /* Check if the continous conversion of regular channel is finished */
            if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
            {
                /*##-6- Get the converted value of regular channel  ########################*/
                uwADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
            }
              //直接获取的是二进制码,14位对应最大值4095,内部电压为vdd_value通过比例计算得到电压数值
            temp_voltage=(float)uwADCxConvertedValue*vdd_value/4095;
             //得到浮点型电压值            是乘了1000倍的            
            HAL_ADC_Stop(&AdcHandle);
            //HAL_ADCEx_DisableVREFINT();
            __HAL_RCC_ADC1_CLK_DISABLE();
   }
 }

以上ADC检测,相当于一次连续检测了两次,第一次为内部电压用的特地通道17,第二次检测的是外部电压对应硬件连接的PA0对应通道0,在下篇博客将分析对检测到电压值的处理。

STM32L0系列的ADC用法相关推荐

  1. STM32L0系列之ADC采集

    STM32L0开发系列--01 ADC采集 前言 使用芯片:STM32L051C8T6 软件平台:KEIL V5.STM32CubeL0 库函数:HAL 一.原理图 本文介绍在STM32上使用ADC1 ...

  2. 基于stm32L0系列的AD7682驱动程序

    基于stm32L0系列的AD7682驱动程序 //调用u16 AD7682(u8 adINx),即可切换通道,得到返回的ADC值.实测程序可用,ADC值为0-65535 //CFG_COM=[13:0 ...

  3. STM32L0系列串口重定义的方法

    STM32L0系列串口重定义的方法 芯片型号:STM32L071RBT6 本篇重点:将printf( ) 函数重定义到USART1 集成开发工具(IDE):IAR 在uart已经配置好情况下,重定义f ...

  4. python items函数用法,Python中dictionary items()系列函数的用法实例

    本文实例讲述了Python中dictionary items()系列函数的用法,对Python程序设计有很好的参考借鉴价值.具体分析如下: 先来看一个示例: import html # availab ...

  5. 基于Cortex M0+的STM32L0系列简介

    L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...

  6. STM32L0系列之【工程开始】

    文章目录 1.前言 2.开发工具 3.简述开发工具生成的代码结构 3.1 main.c简析 3.2 代码运行流程以及HAL库的调用结构 3.2.1 HAL_Init() 3.2.2 SystemClo ...

  7. STM32L0系列之【LPTIM定时器】

    上一章:STM32L0系列之[串口收发] 文章目录 1.LPTIM介绍 2.配置时钟源并且启动 3.初始化配置LPTIM 4.LPTIM中断处理函数 5.启用LPTIM,中断触发回调函数 6.main ...

  8. STM32L0系列之【串口收发】

    上一章:STM32L0系列之[TIM通用定时器] 文章目录 1.串口1 USART1初始化 [注意使能接收中断] 2.串口接收中断 3.串口接收中断完成回调函数 4.重定向输入输出,将输出重定向至pr ...

  9. STM32L0系列之【EEPROM读写】

    上一章:STM32L0系列之[LED点灯,看门狗IWDG] /*------------------------------------------------------------ Func: E ...

最新文章

  1. php中创建关联数组,以及遍历数组
  2. 《深入理解Java虚拟机》笔记01 -- 运行时数据区
  3. Python面向对象简单继承
  4. 如何利用python在yi'ge_【GE查找Python面试题】面试问题:使用 TVM … - 看准网
  5. “中国智造”为System x提供创新源动力
  6. sshpass批量执行操作
  7. 基于51单片机的计算器
  8. 当代刻板程序员生态图鉴!网友:哈哈哈太真实了
  9. git bash here 找不到应用程序_git 简单命令
  10. 字符串连接类(Javascript)
  11. Bitmap,Drawable转换
  12. 翻译: 2.6 概率论 深入神经网络 pytorch
  13. Hibernate教程——我的笔记
  14. 视频教程-职场办公Excel技巧精粹灵活妙用集锦-Office/WPS
  15. 【Godot】Godot 插件制作流程
  16. python词云图绘制
  17. python程序设计基础教程慕课版课后题答案薛景_Python程序设计基础教程(慕课版)...
  18. 第二人生的源码分析(三十九)关闭WinXP的错误报告功能
  19. 2017华为算法大赛总结
  20. 77道Spring面试题以及参考答案(2021年最新版),java开发项目经理面试题

热门文章

  1. element+后台管理系统数据导出为excel+进度条导出
  2. 线性回归和逻辑回归的典型面试考点
  3. 跟网络游戏,手机APP游戏告别
  4. 小米手机与HBuilder连接的问题解决
  5. 如何用随机森林算法,在深海养肥一群鱼
  6. MySql简单入门_第四篇 高级使用(4)_触发器
  7. 137.Linux输入子系统基本概念
  8. 微信公众号配置网页授权域名报错:无法访问xxx指向的web服务器或虚拟主机的目录
  9. 2019软件测试都学习什么?
  10. java 查看内存_java 内存查看工具