STM32Cube HAL库——ADC电压采集

本文介绍了如何使用STM32CubeHAL库进行ADC电压采集,以电池电压为例,通过STM32CubeMX配置ADC引脚,然后在STM32CubeIDE中编写代码计算电压,最终实现显示原始ADC值和电池电压的实际值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32Cube HAL库——ADC电压采集

一、ADC基本介绍

模拟数字转换器,即A/D转换器,或简称ADC(Analog to Digital Converter),通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。

A/D转换的作用是将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。在实际电路中,这些过程有的是合并进行的,例如,取样和保持,量化和编码往往都是在转换过程中同时实现的。

这种转换器的基本原理是把输入的模拟信号按规定的时间间隔采样,并与一系列标准的数字信号相比较,数字信号逐次收敛,直至两种信号相等为止。然后显示出代表此信号的二进制数,模拟数字转换器有很多种,如直接的、间接的、高速高精度的、超高速的等。每种又有许多形式。同模拟数字转换器功能相反的称为“数字模拟转换器”,亦称“译码器”,它是把数字量转换成连续变化的模拟量的装置,也有许多种和许多形式。
如果还有不懂,请看其它博主的文章。

二、STM32CubeMX配置

为体现ADC实际效果,本例中用ADC采集电池电压。
OLED显示屏程序是在完成调试接口任务的基础上进行的(所有编程都在这个基础上进行,没有完成则无法烧录),可以在链接代码或者上一期代码的基础上进行编程。

1.确定引脚

查看控制板电路图,确定与电池相关的引脚(或者自己设计电路)。
在这里插入图片描述
在这里插入图片描述
发现PB1引脚与电池电压有联系,确定以PB1引脚来采集电池电压。

2.配置引脚

点击PB1引脚选择ADC1_IN9并修改名字,选中IN9,开启连续转换模式的使能(选为Enabled),具体如下图。
在这里插入图片描述
在这里插入图片描述
点击右上角GENERATE CODE按钮生成代码。

三、STM32CubeIDE编程

1.计算引脚电压与电池关系

将电压的范围设置在0-3300mV,电压转换关系:Voltage=(3300X)/2^12 mV。(X为ADC转换后的值,即原始数据)
根据电路图计算PB1引脚电压与电池电压的关系:V电源=11
VPB。
首先获取ADC转换后的值,并显示(原始值),再通过电路图计算并显示电池电压的实际值。

1.编程

首先在主函数main.c中定义变量:

//在int main和while之间定义,位置一定要对,在begain和end之间。
	  int adcval[0];
	  float V_value1;

在while循环中加入以下代码:

	  adcval[0] = HAL_ADC_GetValue(&hadc1);   //ADC1中获取转换后的值,并将其存储在adcval[0]变量中
	  HAL_ADC_PollForConversion(&hadc1, 50);   //轮询函数,它等待ADC转换完成,最多等待50毫秒
	  OLED_ShowString(0,10,"ADC:");
	  OLED_ShowNumber(30,5,adcval[0],4,16);//输出原始值

	  HAL_ADC_Start(&hadc1);//函数启动ADC1,让它开始进行转换
	  HAL_ADC_PollForConversion(&hadc1,100);//轮询函数,它等待ADC转换完成,最多等待100毫秒。
	  if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))//判断ADC是否转换成功
	  {
		  //读取
		  adcval[0]=HAL_ADC_GetValue(&hadc1);
		  V_value1 = (adcval[0]/4096.0*3300*11);//计算
		  HAL_Delay(300);
		  OLED_ShowString(70,10,"V:");
		  OLED_ShowNumber(85,10,(uint32_t)V_value1,5,12);//输出实际值
		  OLED_ShowString(120,10,"m");
	  }
	  OLED_Refresh_Gram();
  }

烧录代码运行后效果如下(分别显示原始值和电池电压实际值):
在这里插入图片描述

三、小结

本例中以电池电压为例讲解了ADC采集电压的过程,学会这个,我们就可以将模拟信号转化为数字信号并进行显示,比如温度传感器,压力传感器等。
大家一起学习一起进步,变得更强,希望大家点赞和关注,下期将带来电机控制的内容。

### 使用 STM32 HAL 实现 ADC 电压采集 为了使用 STM32 HAL 进行 ADC 电压采集,需要完成几个关键步骤。这些步骤涵盖了硬件配置、初始化设置以及数据读取。 #### 硬件准备 确保正确连接了所需的电源引脚。对于 ADC 功能来说,特别需要注意的是 VDDA 和 VREF+ 引脚的处理[^2]: - **VDDA**:这是模拟部分的工作电源,建议采用独立的模拟电源输入以提高 ADC 的精度,不过其最大值不应超过 4V。 - **VREF+**:作为 ADC 转换过程中的正参考电压源,通常会将其直接连到 VDDA 上;但如果追求更高的测量准确性,则应考虑外接一个稳定的参考电压模块,该电压范围应在 1.8 至 VDDA 之间。 #### 初始化与配置 通过 STM32CubeMX 工具生成基础代码框架后,在 `main.c` 文件里添加如下初始化函数调用来启动 ADC 接口并设定采样通道等参数[^3]: ```c /* USER CODE BEGIN Includes */ #include "stm32f4xx_hal.h" /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); int main(void) { /* Reset of all peripherals, Initializes the Flash interface and Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); // 初始化 ADC while (1) { uint32_t adcValue; if(HAL_OK == HAL_ADC_Start(&hadc1)) { if(HAL_OK == HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY)) { adcValue = HAL_ADC_GetValue(&hadc1); // 获取转换后的数值 // 这里可以根据需求进一步处理adcValue变量... HAL_Delay(1000); // 延迟一段时间再继续下一次采样 } } HAL_ADC_Stop(&hadc1); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; /** Common config */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 设置时钟分频因子 hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 设定分辨率 hadc1.Init.ScanConvMode = DISABLE; // 单一通道模式 hadc1.Init.ContinuousConvMode = DISABLE; // 关闭连续转换模式 hadc1.Init.DiscontinuousConvMode = DISABLE; // 不启用不连续转换模式 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;// 外部触发边沿选择无 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐 hadc1.Init.NbrOfConversion = 1; // 只有一个待测信号 if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(__FILE__, __LINE__); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_0; // 配置使用的具体通道号 sConfig.Rank = 1; // 定义此通道在序列中的位置 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 设置采样时间周期数 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(__FILE__, __LINE__); } } ``` 这段程序展示了如何利用 HAL 函数来进行基本的 ADC 操作,包括开始/停止转换、等待转换结束以及获取最终的结果。请注意,这只是一个简单的例子,实际开发过程中可能还需要调整更多细节来满足特定应用场景的要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰远_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值