蓝桥杯—STM32G431RBT6(ADC数模转换,从原理到应用)

news/2024/9/22 5:27:33 标签: stm32, 嵌入式硬件, 单片机, 蓝桥杯, c语言

一、什么是ADC?

ADC(Analog-to-Digital Converter)即模数转换器。它是一种将模拟信号转换为数字信号的电子器件。在电子系统中,ADC 起着至关重要的作用,它能将连续变化的模拟量(如电压、电流等)转换为离散的数字量,以便数字电路进行处理、存储和传输。ADC通过将模拟量转化为数字量,例如将连续的电压信号转化为离散的数字信号。

二、配置工程

蓝桥杯竞赛板有两个模拟电压输出,分别是PB15和PB12.STM32G431内部集成2个有最高12位精度ADC(ADC1、ADC2)可配置的转换精度:6位,8位,10位,12位。12位精度为:0000 0000 0000 ~ 1111 1111 1111,2^12 = 4096。意思是把0 ~ 3.3v分成4096份  一份精度约为0.0008v(电压变换了0.0008v,ADC都能感受到).如原理图所示,两个采集端均存在跳线帽,若跳线帽拔掉,则无法正常工作。

分别配置PB15和PB12

三、使用步骤

在adc.c中编写getADC1和getADC2函数,目的是为了获取AD值,并在adc.h声明
uint16_t getADC2(void)
{
uint16_t adc=0;
	HAL_ADC_Start(&hadc2);//启动ADC转换
	adc=HAL_ADC_GetValue(&hadc2);//获取AD值
	return adc;
}
uint16_t getADC1(void)
{
uint16_t adc=0;
	HAL_ADC_Start(&hadc1);
	adc=HAL_ADC_GetValue(&hadc1);
	return adc;
}

对上述代码进行详解

  1. uint16_t adc=0;:定义一个 16 位无符号整数变量 adc,并初始化为 0。
  2. HAL_ADC_Start(&hadc2);:调用特定的硬件抽象层(HAL)函数来启动 hadc2 的 ADC 转换。
  3. adc=HAL_ADC_GetValue(&hadc2);:使用 HAL 函数获取 hadc2 转换得到的 AD 值,并将其存储到 adc 变量中。
  4. return adc;:函数返回获取到的 AD 值。

uint16_t adc=0初始化为 0 主要有以下原因:

  1. 明确初始状态:确保变量在使用前有一个明确的、可预期的初始值,避免出现未定义或不确定的情况。
  2. 避免潜在错误:如果不进行初始化,变量可能会包含随机或无效的数据,这可能导致后续计算或操作出现错误。
  3. 一致性:将其初始化为 0 可以保持代码的一致性和可读性,使代码更易于理解和维护。

&hadc2 表示取变量 hadc2 的地址。

在这个函数中,它是将 hadc2 的地址传递给 HAL_ADC_Start 和 HAL_ADC_GetValue 等函数,以便这些函数能够对指定的 ADC 进行操作。

在adc.h中声明
/* USER CODE BEGIN Prototypes */
uint16_t getADC2(void);
uint16_t getADC1(void);
/* USER CODE END Prototypes */
在main.c中添加校准函数,也可以放置与adc.c中的初始化函数中void MX_ADC1_Init(void),void MX_ADC2_Init(void)
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);

这两行代码的作用是分别启动hadc1hadc2这两个 ADC 的校准操作。ADC_SINGLE_ENDED表示单端模式的校准。通过执行校准,可以提高 ADC 的测量精度。

 定义两个值,用来获取ADC采集到的值
 double volt_R37;
 double volt_R38;

double是双精度浮点数,是一种计算机数据类型。它具有更高的精度和范围,能表示比单精度浮点数更精确的小数。

volt_R37=getADC2()*3.2/4096;
volt_R38=getADC1()*3.2/4096;

这两行代码是在对获取到的 ADC 值进行进一步的计算和转换。getADC2()getADC1()获取到的是经过 ADC 转换后的数值,然后分别乘以3.2/4096,可能是为了将 ADC 值转换为实际的电压值。

sprintf(buf,"     R37:%.2fV      ",volt_R37);
	LCD_DisplayStringLine(Line4,(uint8_t*)buf);
		sprintf(buf,"     R38:%.2fV      ",volt_R38);
	LCD_DisplayStringLine(Line5,(uint8_t*)buf);

 %.2f表示以保留的浮点数形式输出电压值两位小数

四、效果展示

五、代码开源

通过网盘分享的文件:16-TEST7-ADC.zip
链接: https://pan.baidu.com/s/1N3-lp_dettxJMHnpxKlvHg?pwd=0820 提取码: 0820


http://www.niftyadmin.cn/n/5669730.html

相关文章

Ubuntu 20.04 内核升级后网络丢失问题的解决过程

在 Ubuntu 系统中,内核升级是一个常见的操作,旨在提升系统性能、安全性和兼容性。然而,有时这一操作可能会带来一些意外的副作用,比如导致网络功能的丧失。 本人本来是想更新 Nvidia 显卡的驱动,使用 ubuntu-drivers …

一些线上常用排查问题的命令

排查CPU过高时使用到的一些命令 top free df top命令 top 命令是一个动态的实时视图,显示系统的整体运行状况,包括 CPU 使用率、内存使用情况、进程信息等。 free 命令 free 命令用于显示系统中物理内存和交换内存的使用情况。 df 命令 df 命令用…

ESP8266+DHT11+Python制作一个物联网温湿度传感器

ESP8266是一款低功耗、高集成度的Wi-Fi SOC(System on Chip,系统级芯片),这款芯片专为物联网(IoT)应用而设计,常见开发ESP8266的环境可以使用Arduino或者ESP8266 RTOS SDK、NodeMCU,…

在Linux中运行flask项目

准备 这里我准备了一个GitHub上某个大佬写的留言板的Flask项目,就用这个来给大家做示范了。 查看留言板的目录结构 查看主程序所用的库函数 只有一个第三方库 Flask 安装pip sudo apt install python3-pip -y测试 pip 安装成功 修改pip镜像源 修改pip的默认下载…

C++_数据封装详解

C 数据封装 所有的 C 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。程序数据:数据是程序的信息,会受到程序函数的影响。 封装是面向对象编程中的把数…

常见项目场景题2(多次输错密码禁止登录,分布式下多线程抢夺资源)

多次输错密码后如何禁止一定时间内用户再次登录 通常使用 IP 地址为单位来进行限制,而非具体的用户。这样可以减少误伤其他用户的可能性。 (一个非法用户可能会拿他人的账号不断尝试登录) 同时,以 IP 地址为单位进行限制还可以避…

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号:DELL PowerVault md3800f 故障问题:存储除尘后通电开机,发现有物理硬盘没有插到位,用户带电拔插了多块物理盘,导致关连的磁盘阵列掉线,卷失败; 处理方式&#xf…

pytorch 算子调用kernel示例(MINIST)

pytorch 算子调用kernel示例(MINIST) 当进行 MNIST 分类任务时,PyTorch 中的每一个算子会根据设备类型(CPU 或 CUDA)自动选择合适的内核(kernel)进行计算。本文以GPU为例,介绍算子调用kernel的过程。 1. …