STM32L0开发系列——01 ADC采集

前言

使用芯片:STM32L051C8T6
软件平台:KEIL V5、STM32CubeL0
库函数:HAL

一、原理图

本文介绍在STM32上使用ADC1的第1通道,对电池电量进行采集。

二、ADC通道与引脚对应关系

通道 引脚
PA0 ADC_IN0
PA1 ADC_IN1
PA2 ADC_IN2
PA3 ADC_IN3
PA4 ADC_IN4
PA5 ADC_IN5
PA6 ADC_IN6
PA7 ADC_IN7
PB0 ADC_IN8
PB1 ADC_IN9
PC0 ADC_IN10
PC1 ADC_IN11
PC2 ADC_IN12
PC3 ADC_IN13
PC4 ADC_IN14
PC5 ADC_IN15
PC5 ADC_IN15
PC5 ADC_IN15
内部温度传感器 (VSENSE) ADC_IN16
内部参考电压 (VREFINT) ADC_IN17
监视外部 VLCD 电源针脚 ADC_IN18

三、ADC相关

1、 ADC 可由 APB 时钟或 HSI16 时钟提供。
2、 ADC 转换时间: 12 位分辨率对应的转换时间为 0.87 µs (1.14 MHz), 10 位分辨率
对应的转换时间为 0.81 µs,若降低分辨率,可进一步缩短转换时间。

四、实验步骤

1、系统时钟配置

//******************************************************************************
//name:             SystemClock_Config
//introduce:        系统时钟配置
//parameter:        none
//return:           none         //changetime:       2019.05.21
//******************************************************************************
void SystemClock_Config(void)
{RCC_ClkInitTypeDef RCC_ClkInitStruct;RCC_PeriphCLKInitTypeDef PeriphClkInit;RCC_OscInitTypeDef RCC_OscInitStruct;__PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSIState = RCC_HSI_ON; //ADC的时钟源RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;HAL_RCC_OscConfig(&RCC_OscInitStruct);RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);__SYSCFG_CLK_ENABLE();}

注意:一开始程序中没有配置HSI时钟,采集不到电压

2、ADC文件


#include "main.h"ADC_HandleTypeDef hadc;
GPIO_InitTypeDef GPIO_InitStruct;
ADC_ChannelConfTypeDef sConfig;//******************************************************************************
//name:             ADC_Init
//introduce:        ADC初始化
//parameter:        none
//return:           none         //changetime:       2019.05.21
//******************************************************************************
void ADC_Init(void)
{uint32_t Calibration=0;__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);hadc.Instance = ADC1;hadc.Init.OversamplingMode = DISABLE;hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;hadc.Init.Resolution = ADC_RESOLUTION_12B;hadc.Init.SamplingTime = ADC_SAMPLETIME_79CYCLES_5;hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc.Init.ContinuousConvMode = DISABLE;hadc.Init.DiscontinuousConvMode = DISABLE;hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc.Init.DMAContinuousRequests = DISABLE;hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;hadc.Init.LowPowerAutoWait = DISABLE;hadc.Init.LowPowerFrequencyMode = DISABLE;hadc.Init.LowPowerAutoPowerOff = DISABLE;HAL_ADC_Init(&hadc) ;//启动ADC校验功能HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);//获取校验值Calibration = HAL_ADC_GetValue(&hadc);// 清除之前通道sConfig.Channel = ADC_CHANNEL_1|ADC_CHANNEL_2|ADC_CHANNEL_3;sConfig.Rank = ADC_RANK_NONE;   // 清除通道属性HAL_ADC_ConfigChannel(&hadc, &sConfig);}//******************************************************************************
//name:             GET_ADC
//introduce:        单通道采集ADC的值
//parameter:        CH:ADC采集通道
//return:           ADC采集值         //changetime:       2019.05.21
//******************************************************************************
uint32_t GET_ADC(uint32_t CH)
{uint32_t adc_conv_var;sConfig.Channel = CH;sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;   // 设置通道HAL_ADC_ConfigChannel(&hadc, &sConfig);// 启动转换HAL_ADC_Start(&hadc);// 等待转换结束HAL_ADC_PollForConversion(&hadc,20);// 超时20ms// 读取结果adc_conv_var = HAL_ADC_GetValue(&hadc);// 清除通道sConfig.Rank = ADC_RANK_NONE;    // 清除通道HAL_ADC_ConfigChannel(&hadc, &sConfig);return adc_conv_var;
}//******************************************************************************
//name:             Get_Adc_Average
//introduce:        多次采集求平均值
//parameter:        CH:ADC采集通道
//return:           ADC采集值         //changetime:       2019.05.21
//******************************************************************************void Get_Adc_Average(uint32_t *ch,uint32_t *adcx,uint8_t times)
{uint32_t temp_val[9]={0};uint8_t t,i;for(t=0;t<times;t++){for(i=0;i<9;i++){temp_val[i]+=GET_ADC(ch[i]);HAL_Delay(5);}}for(i=0;i<9;i++){adcx[i] = temp_val[i]/times;}}     

3、main中测试

while(1)
{BATTER_VALUE = GET_ADC(ADC_CHANNEL_1);temp=(float)BATTER_VALUE*(3.3/4096)*2; printf("temp=%0.2f\r\n",temp);HAL_Delay(100);
}

四、实验结果


由于ADC的精度是12bit(4096)、参考电压为3.3V,因此实际读出的电量值为BATTER_VALUE3.3/40962.

试验成功

STM32L0系列之ADC采集相关推荐

  1. STM32L0系列的ADC用法

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

  2. Aurix TC3xx系列MCU ADC模块简介(一)

    文章目录 1 前言 2 ADC模块简介(TC3xx) 1.1 ADC模块特点 1.2 转换器内部结构 1.3 转换时间 3 EDSADC模块简单介绍 >>返回总目录<< 1 前 ...

  3. 关于STM32G071RB的ADC采集误差问题

    1 G0系列控制器在开启ADC采集后,因为开启ADC采集功能时,内部ADC处理电路会向管脚泄露一些电荷,在管脚上面形成毛刺,即便将ADC的采集管脚接地,测量ADC采集使用的管脚也会产生较大的尖刺,如下 ...

  4. 采样频率和带宽的关系_ADI公司AD7380系列SAR ADC的片内过采样

    原标题:ADI公司AD7380系列SAR ADC的片内过采样 本文引用地址: 简介 本应用笔记讨论逐次逼近寄存器(SAR)型模数转换器(ADC)中的片内过采样.常见过采样技术有两种:正常平均和滚动平均 ...

  5. STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)

    STM32 ADC采集板载温度 STM32 ADC简介 ​ STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用, 也可以使用双重模 ...

  6. STM32F030F4P6-提高ADC采集精度

    STM32F0/F1系列的ADC都是12位的,通常情况下我们都需要将AD采集的码值进行转换得到实际的电压值,然后根据不同类型的传感器,换算为对应的温度.压力等数据. 常规的算法是,将ADC采集到的值a ...

  7. vivado生成ltx文件命令_Xilinx Artix-7系列FPGA 高速采集卡开发例程使用手册.pdf

    Xilinx Artix-7系列FPGA 高速采集卡开发例程使用手册 Xilinx Artix-7 系列FPGA 高速采集卡开发例程使用手册 Revision History Draft Date R ...

  8. 合泰HT32单片机使用PDMA和ADC采集多路模拟值并显示在OLED屏上

    合泰单片机HT32F52352使用PDMA+ADC采集多路模拟值并显示在0.96寸OLED屏上. 最近在参加合泰杯的比赛,顺便写点小教程方便大家. 合泰HT32单片机开发环境搭建和配置教程:https ...

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

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

最新文章

  1. 网站推广——网站推广专员建设网站是选择新域名还是老域名?
  2. linux网络编程常用函数详解与实例(socket--bind--listen--accept)
  3. 【机器学习】机器学习模型解释神器:Shapash
  4. 【渝粤题库】陕西师范大学200831 编译原理 作业
  5. 图解Java常用数据结构
  6. 乔新亮:以赢为终,三个月打造一支硬核IT团队
  7. sql server 2005 几个常用的存储过程或函数
  8. Farseer.net轻量级开源框架 中级篇:事务的使用
  9. endnote 制作GB/T7714《文后参考文献著录规则》的输出格式
  10. JPush极光推送的原理
  11. 北向接口jms消息服务器,运行日志 - eSight V300R010C00SPC600 维护指南 18 - 华为
  12. APP推送系统工作原理
  13. 雷柏M300G使用体验
  14. 数学问题1 - 两个圆圈,小圆贴着大圆外部转过一圈,问小圆转几圈
  15. Kindle资源-史上最全60GB的Kindle技术电子书资源网盘打包下载
  16. ebcdic编码与ascII编码互转
  17. yandex浏览器_15分钟内制作自己的文本编辑器:Yandex的实践
  18. 中海达数据怎么转rinex_中海达GPS数据处理软件包使用手册-(36页)-原创力文档...
  19. 4G和5G频谱共享技术
  20. 12个学习 CSS3 网站布局设计的优秀案例

热门文章

  1. 制作OpenCV相机标定板棋盘格图像
  2. Sign function
  3. 51系列密码锁:Proteus仿真+Keil程序(免费提供)
  4. 用python语言解一元二次方程
  5. 将fla文件的影片剪辑按钮等一些类文件和外部的as文件整合到swc中
  6. 【Webpack5笔记】Webpack高级配置---提升开发体验
  7. 当前对计算机专业人才的要求,关于计算机专业人才需求的分析
  8. 免费论文下载:林巧稚的论文期刊
  9. https://mp.weixin.qq.com/s/_ZxzEo1HfyM4DH-rLKcgIg? 电容(2)之旁路电容
  10. Java编程练习之:转换罗马数字