当前位置: 首页 > article >正文

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

一、什么是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.kler.cn/a/313674.html

相关文章:

  • Rust学习(二):rust基础语法Ⅰ
  • NCC前端调用查询弹框
  • 使用HTML、CSS和JavaScript创建动态圣诞树
  • SCUI Admin + Laravel 整合
  • Redis - String 字符串
  • 网络安全技术在能源领域的应用
  • C++第十一节课 new和delete
  • [Python可视化]数据可视化在医疗领域应用:提高诊断准确性和治疗效果
  • AI视觉算法盒是什么?如何智能化升级网络摄像机,守护全方位安全
  • 机器学习--AlexNet
  • 系统架构设计师:软件架构的演化和维护
  • 【AI视频】Runway:Gen-2 运镜详解
  • 马踏棋盘c++
  • Ubuntu上使用qt和opencv显示图像
  • MySQL —— 事务
  • RabbitMQ Spring客户端使用
  • 多版本node管理工具nvm
  • C#_封装详解
  • 人话学Python-循环语句
  • 数据结构(Day14)
  • 掌握C#中的动态规划技术
  • 监控易监测对象及指标之:全面监控DB2_linux数据库
  • Scikit-learn (`sklearn`) 教程
  • 二级C语言2024-3易错题
  • 小叶OJ 2716: 过河问题 ← 贪心算法
  • Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案