STM32L051使用HAL库操作实例(14)- ADC采集电压

这篇具有很好参考价值的文章主要介绍了STM32L051使用HAL库操作实例(14)- ADC采集电压。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、ADC外设简要说明

三、STM32CubeMX配置(本文使用的STM32CubeMX版本为6.1.2)

1.MCU选型

2.时钟使能

3.外部时钟配置

4.串口配置

5.ADC引脚配置

6.配置STM32CubeMX生成工程文件

7.点击GENERATE CODE生成工程文件

四、工程源码

五、运行状态


一、前言

本文主要介绍通过HAL库搭建工程及如何通过STM32L051的ADC外设读取外部电压;

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

1.MCU:STM32L051C8T6

2.软件平台:KEIL V5.27、STM32CubeMX V6.1.2

3.库类型:HAL

二、ADC外设简要说明

1.STM32L051这款MCU不像F1系列大容量版本的MCU有外置Vref引脚,所以在使用这款单片机时,如果采用外部的3.3V电源电压作为基准,那么在外部电压发生波动时就会影响ADC测量数据的准确性。这里有两种方法:一种是可采用在外部使用如TL431搭建基准电源电路,需要使用2路ADC通道,在ADC进行读取时先使用一路通道进行TL431基准电压的读取进行比较,然后在读取另一外部输入的通道;第二种是采用MCU内部的基准电压作为基准,在ADC进行读取时先获取内部的基准电压值,然后在读取另一外部输入的通道,这里例程采用的是第二种方法。

2.查看datasheet得知,STM32的mcu有一个寄存器VREFINT_CAL的值为厂家存放的基准电压,该值的环境:在温度为25°C时获取的原始VDD = 3V,由下图说明VREFINT内部基准电源为ADC和比较器提供稳定的电压输出。VREFINT内部连接ADC_IN17输入通道,它可以准确的监测VDD值。

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

3.查看STM32L051参考手册可找到厂家已给出相应的计算公式,如下图:

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

我们可以看到,手册中已说明,对于不知道VDDA值的应用,必须使用内部参考电压,内部参考电压Vdda=3V,ADC读取电压的计算公式也列出了。那么我们在使用ADC时就需要读取两个通道的值,首先为ADC_IN17的值(即VREFINT_DATA),ADC_DATA是外部ADC引脚通道上测量的值,VREFINT_CAL为内部参考电压校准值,可以直接地址读取。我们使用的这款STM32L051C8T6芯片VREFINT_CAL地址为:0X1FF80078。使用公式直接读取VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);FULL_SCALE是根据我们设置的ADC分辨率而定,12位ADC分辨率值:2^12 - 1 = 4096 - 1。

三、STM32CubeMX配置(本文使用的STM32CubeMX版本为6.1.2)

思路:使用PA0引脚(ADC_IN0通道)读取外部电压(通过电位器调节),读取后将读出的数值通过串口一打印出来。

1.MCU选型

例程使用的为STM32L051C8T6型号;

2.时钟使能

使用外部时钟

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

3.外部时钟配置

将时钟选用外部HSE时钟,频率采用32M

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

4.串口配置

启用USART1,模式为异步通讯模式。波特率采用9600,数据长度8为,无校验,1个停止位。

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

5.ADC引脚配置

选择使用PA0引脚作为ADC输入端,

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

ADC参数配置

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

6.配置STM32CubeMX生成工程文件

1.编辑好文件名称,保存路径,输出工程文件类型。

7.点击GENERATE CODE生成工程文件

四、工程源码

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint16_t i;
	uint32_t SUM[3];
	uint16_t ADC_DATA[101];
	uint16_t VREFINT_DATA[101];
	ADC_ChannelConfTypeDef sConfig;
	uint16_t VREFCAL = 0;
	float V_CHANNEL = 0;
	int16_t ADC_value;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	/*获取内部校准电压参考值*/
	VREFCAL = *(__IO uint16_t *)(0x1FF80078);
	printf("\r\nSTM32L051C8T6 开发板ADC读取实验\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		SUM[0] = 0;
		SUM[1] = 0;
		for(i=0; i<100; i++)
		{
			/*获取PA0引脚电压值*/
			ADC_DATA[i] = 0;
			/*开启ADC校准,使用的为单端校准模式*/
			HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
			/*寄存器数据清零*/
			hadc.Instance->CHSELR=0;
			/*转换通道配置*/
			sConfig.Channel = ADC_CHANNEL_0;
			/*配置所选通道*/
			HAL_ADC_ConfigChannel(&hadc, &sConfig);
			/*启动转换*/
			HAL_ADC_Start(&hadc);
			/*等待转换结束,1000为times*/
			HAL_ADC_PollForConversion(&hadc,1000);
			/*读取结果*/
			ADC_DATA[i] = HAL_ADC_GetValue(&hadc);
			/*停止ADC读取*/
			HAL_ADC_Stop(&hadc);
			SUM[0] += ADC_DATA[i];
			
			/*获取内部基准电压值*/
			VREFINT_DATA[i] = 0;
			HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
			/*寄存器数据清零*/
			hadc.Instance->CHSELR=0;
			/*转换通道配置*/
			sConfig.Channel = ADC_CHANNEL_VREFINT;
			/*配置所选通道*/
			HAL_ADC_ConfigChannel(&hadc, &sConfig);
			/*启动转换*/
			HAL_ADC_Start(&hadc);
			/*等待转换结束*/
			HAL_ADC_PollForConversion(&hadc,1000);
			/*读取结果*/
			VREFINT_DATA[i] = HAL_ADC_GetValue(&hadc);
			/*停止ADC读取*/
			HAL_ADC_Stop(&hadc);
			SUM[1] += VREFINT_DATA[i];
		}
		/*计算外部输入电压平均值*/
		ADC_DATA[100] = SUM[0] / 100;
		/*计算内部基准电压平均值*/
		VREFINT_DATA[100] = SUM[1] / 100;
		/*计算公式V_channelx = 3V *VREFINT_CAL*ADC_DATAx/(VREFINT_DATA*FULL_SCALE)*/
		/*V_channel为计算后的值,VREFCAL为内部基准值、FULL_SCALE为12位分辨率即4096-1*/
		/*ADC_DATA为外部采集电压值,VREFINT_DATA为通道17采集的值*/
		/*计算校准后的电压值*/
		V_CHANNEL = (float)(3*VREFCAL*ADC_DATA[100])/(VREFINT_DATA[100]*4095);
		/*电压值放大1000倍*/
		ADC_value = V_CHANNEL * 1000;
		/*通过打印ADC_value值*/
		printf("ADC数据:%dmv",ADC_value);
		/*延时*/
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

五、运行状态

运行状态如下,ADC读取数据还是蛮准的。

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

万用表读取数据,ADC读取数据与万用表基本差不多。

STM32L051使用HAL库操作实例(14)- ADC采集电压,STM32L0,STM32,stm32,嵌入式硬件,单片机

工程源码链接:STM32L051C8T6_ADC读取例程源码文章来源地址https://www.toymoban.com/news/detail-793424.html

到了这里,关于STM32L051使用HAL库操作实例(14)- ADC采集电压的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32+HAL库使用ADC轮询模式采集音频信号

    ADC模块:咪头声音采集模块 缺点:占用CPU的使用率         软件开始ADC转换后,一直等到转换完成后,才向后执行,这个代码在初始化ADC之后执行一次校准(不执行这一步也可以,但精度可能会低一些);然后就可以使用ADC轮询转换了,只需要三步: 启动转换 、 等待转

    2024年02月15日
    浏览(37)
  • STM32L4 HAL库通过串口通信改变PWM占空比

    使用串行通信的目的是为了让上位机能控制STM32来改变PWM的输出 这里用的是定时器TIM4的3通道,当然也可以改为其他的定时器,具体请参考手册 偷下懒,直接拿正点原子的例子程序修改了一下。 示例用的是UART1 引脚是PA9(TX),PA10(RX) 主要修改的地方在接收数据的部分,我用l

    2024年02月15日
    浏览(35)
  • STM32 hal库使用笔记(五)ADC—单通道/双通道DMA传输

    实现目的:利用ADC采集光敏传感器/烟雾传感器的值,并利用串口打印 实验平台:正点原子精英版 一、简介 1.DMA的介绍 参考:STM32 hal库使用笔记(四)DMA—内存到内存/内存到外设_乱码小伙的博客-CSDN博客 2.ADC简介      ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚

    2024年02月03日
    浏览(49)
  • 【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

    【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总) 此文章是讨论将先前所有的低功耗配置功能整合起来的一个库(适用于STM32L4系列) 目前除了普通唤醒方式外 加入了UART唤醒和RTC唤醒配置 如果后续有更多唤醒加入(如I2C等 将直接在后续的文章

    2024年02月19日
    浏览(35)
  • STM32 HAL库 STM32CubeMX -- ADC

    ADC(Analog-to-Digital Converter)指模/数转换器或者模拟/数字转换器。 是指将连续变量的模拟信号转换为离散的数字信号的器件。 也就是将 模拟信号 转化为 数字信号 。 STM32f103 系列有3 个ADC,精度为12 位,每个ADC 最多有16 个外部通道和2个内部信号源。其中ADC1 和ADC2 都有16 个外部

    2024年02月15日
    浏览(34)
  • stm32 ADC 精讲(基于HAL库)

    首先ADC是将模拟量信号转化为数字信号,简单来说就是把一些连续信号转化为 010101。 典型的ADC叫做逐次逼近型ADC,接下来我们来分模块讲解上述电路图 上图所示,是一个 电压比较器,将待测电压Vin输入到比较器的正端上去,当正端电压大于负端电压时,在输出端输出1,反之

    2024年02月14日
    浏览(51)
  • stm32——hal库学习笔记(ADC)

    ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器 优点:转换速度快 缺点:成本高、功耗高、分辨率低 优点:结构简单、低功耗 缺点:转换速度较慢 特点: 分辨率和采样速度相互矛盾, 分辨率越高,采样速率越低 ①参考电压/模拟部分电压 ②输入通道 ③转换序列 ④触

    2024年02月22日
    浏览(38)
  • STM32的ADC开发HAL库

    配置ADC转换通道。 Data Alignment(数据对齐)一般默认右对齐 因为只对一个引脚测量ADC因此不用使能扫描模式。 ADC的扫描模式是一种工作模式,用于在单个转换序列中连续地转换多个输入通道的模拟信号。 在扫描模式下,ADC会按照预先配置的顺序对多个输入通道上的模拟信号

    2024年01月16日
    浏览(27)
  • STM32 HAL库 ADC+DMA

       软件触发:STM32 HAL库 软件触发ADC 多通道连续转换_随风飘零翼的博客-CSDN博客 配置如图      注意采样周期不要过小,不然频繁中断会导致在RTOS中卡死 写了部分关键代码,在两个任务中OLED和串口打印分别显示的通道值。 后来发现使用的杜邦线接触不良,固定好之后,接

    2024年02月14日
    浏览(31)
  • STM32_HAL库—ADC采集数据

    目录 一、简介 二、实例 1. (单通道、阻塞式)配置及实现方式 2. (单通道、中断式)配置及实现方式 3. (多通道、阻塞式)配置及实现方式 4. (多通道、DMA)配置及实现方式        STM32 的ADC精度为 12 位,且每个 ADC 最多有 16 个外部通道。各通道的A/D转换可以单次、连续、扫描或

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包