STM32(HAL库)通过ADC读取MQ2数据

2023-10-27

目录

1、简介

2、CubeMX初始化配置

2.1 基础配置

2.1.1 SYS配置

 2.1.2 RCC配置

2.2 ADC外设配置

2.3 串口外设配置

 2.4 项目生成

 3、KEIL端程序整合

3.1 串口重映射

3.2 ADC数据采集

3.3 主函数代

3.4 效果展示


1、简介

本文通过STM32F103C8T6单片机通过HAL库方式对MQ2烟雾传感器进行数据的读取,并通过串口来进行显示。

2、CubeMX初始化配置

2.1 基础配置

2.1.1 SYS配置

 2.1.2 RCC配置

2.2 ADC外设配置

2.3 串口外设配置

 2.4 项目生成

 3、KEIL端程序整合

3.1 串口重映射

具体步骤:stm32(HAL库)使用printf函数打印到串口

3.2 ADC数据采集

首先在adc.c最下方添加ADC采集程序,如下所示:

 代码如下:

uint16_t ADC_IN_1(void) //ADC采集程序
{
	HAL_ADC_Start(&hadc1);//开始ADC采集
	HAL_ADC_PollForConversion(&hadc1,500);//等待采集结束
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
	{
		return HAL_ADC_GetValue(&hadc1);//读出ADC数值
	}
	return 0;
}

接着在adc.h中进行函数声明,如下图所示:

uint16_t ADC_IN_1(void);//ADC采集程序

3.3 主函数代码整合

首先定义变量接受ADC_IN_1()采集数据,如下图所示:

接着进行ADC采样校准,如下图所示:

 最后进行数据打印,如下图所示:

 所用代码(便于复制)如下:

uint8_t adc_mq2;

HAL_ADCEx_Calibration_Start(&hadc1);//ADC采样校准

adc_mq2 = ADC_IN_1();
printf("%d",adc_mq2);
HAL_Delay(200);

 main.c如下所示:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

uint8_t adc_mq2;

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_ADCEx_Calibration_Start(&hadc1);//ADC采样校准
	
	
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
		adc_mq2 = ADC_IN_1()/100;
        printf("%d",adc_mq2);
        HAL_Delay(200);
    /* USER CODE END WHILE */

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

/**	
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  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_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

3.4 效果展示

上文如有错误,恳请各位大佬指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32(HAL库)通过ADC读取MQ2数据 的相关文章

随机推荐

  • 认识传输层(UDP与TCP)

    传输层主要负责数据能够从发送端发送到接收端 要正确传输就要明确发送端和接收端 这时候IP地址和端口号一起就可以确定一端了 那么他们是怎么唯一标识的呢 1 端口号 port 端口号唯一标识一个主机上进行通信的不同应用程序 在TCP IP协议中
  • flutter Stack超出底图范围后,关闭按键点击效果失效

    既然是关闭按键超出了底图范围导致不能点击 那就让关闭按键不超出就可以了 可以给底图再添加一个大点的底图 这两个底图作为一个整体 关闭按键就可以点击了 如图 下面添加了一个黑色的底图用来扩充原来的底图范围 白色关闭按键就可以点击得到了 ret
  • 计算机硬件耗电,电脑中最耗电的三个硬件排行:这答案意料之外的情理之中!...

    众所周知 只要电脑工作的话就肯定会耗电 那么问题就来了 在电脑中哪个硬件的耗电量是最高的呢 耗电的多少又会有哪些标准进行判断呢 就像笔者的文章中反复强调的 我们既要知道结果但同时还需要知道 为什么 笔者今天就继续用打破砂锅问到底的死磕精神来
  • echarts地图map

    在vue中使用echarts绘制图表 npm install echarts save 全局安装echarts 具体代码及注释如下
  • mac上的matlab的设置工具箱cvx

    cvx的下载地址 http cvxr com cvx download 首先怎么做到在终端运行matlab程序呢 打开终端 vi bash profile 进行配置 加入 export PATH PATH Applications MATL
  • ixp协议服务器,ipx协议中的“内部网络号”是什么意思?

    1 IPX的协议构成 IPX协议簇包括如下主要协议 IPX 第三层协议 用来对通过互联网络的数据包进行路由选择和转发 它指定一个无连接的数据报 相当于TCP IP协议簇中的IP协议 SPX 顺序包交换 Sequenced Packet Ex
  • angular编译版本冲突解决办法总结

    刚刚涉足angular 对于node npm typescript等都不太熟悉 网上下载别人源码一编译 报一堆英文错误 死了的心都有了 先来感受一下吧 经过两天的踩坑 东看看 西查查 终于算是解决了目前项目的错误 虽然不知道为什么 但是可以
  • 三元运算符判断字符串是否为空

    有一个变量String userId 判断是否为null 如果为null 就赋值为空串 否则就不变 用if条件写是 if null userId userId 想用三元运算符写 常见错误写法 userId null userId 这样是错误
  • html禁止自动填充input表单的完美解决办法

    提交登陆等表单时 允许记录了密码则会保存起来 且每次都会自动填充入input 我们有时候不需要自动填充 试过网上的各种方法都没能完美解决 最后终于找到解决办法 废话不多说 直接上代码
  • STM8S105K4T6硬件IIC调试小结

    1 IIC初始化 具体时钟设置参考此篇文章 https blog csdn net u014397533 article details 46495905 void I2C Init void I2C CR1 0x00 禁止I2C外设 此句
  • 日本语语料库

    来自 日语语料库建设的现状综述 上海外国语大学 毛文伟 2009年 1 EDR语料库 EDR 该语料库由日本电子化辞书研究所开发 并于1995年推出 素材选自新闻报道和杂志 规模为 20 万句 另有 10 万 句左右的英语语料 在原始语料的
  • 深度学习图像融合 合成 协调笔记

    目录 图像合成最新资料汇总1 图像合成最新资料汇总2 图像渲染 pip install poetry
  • 【Espruino】NO.05 按键是你的仆人

    http blog csdn net qwert1213131 article details 27104341 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 按键 生活中随处可见 手机 电脑 家用电器 用来执行各种功能
  • Linux中用stat命令查看文件时3个时间点解析

    有些时候 我们需要使用stat命令来查看文件的详细信息 另外联想下 ls l命令显示的是什么时间 touch命令修改文件的时间戳 修改的又是什么时间 在这里我们一起来试验下 首先 我们来看下stat情况 如图所示 会出现3个类型的时间 分别
  • CPU时间与系统时间(CPU time and wall clock time)

    CPU时间是指一段程序在CPU上面运行消耗的时间 也是内核时间 kernel time 在Linux Unix系统里面 C 程序的COU时间可以用一些第三方的库提供的函数测出 但是在Windows系统里面 没有可以直接使用的第三方函数 在这
  • Session和Cookie实现购物车

    来自森大科技官方博客 http www cnsendblog com index php p 342 GPS平台 网站建设 软件开发 系统运维 找森大网络科技 http cnsendnet taobao com 使用Session和Cook
  • 自定义Mybatis框架

    目录 自定义Mybatis分析 轮子缺少的配件 组装轮子 制定骨架 解析配置文件 类关系梳理 创建默认实现类 实现基于注解的查询 目录结构 流程图 通过快速入门示例 Mybatis快速入门 我们发现使用 mybatis 是非常容易的一件事情
  • easyui dialog 子窗口jsp(被弹出窗口)调用父jsp页面方法操作父jsp

    父jsp monthDuty jsp 选中tab2 var selectTabByIndex function tabId tabs select 1 中间js文件 monthDutyJs js var dialog parent sunn
  • 「Linux-基础」CentOS 8 LVM逻辑卷管理

    LVM逻辑卷管理 枫梓林 提示 建议按着步骤来 文章目录 LVM逻辑卷管理 1 简介 2 建立LVM的步骤 3 逻辑卷管理及部署 1 磁盘分区 2 物理卷管理 建立物理卷 扫描物理卷 显示物理卷 删除物理卷 3 卷组管理 建立卷组 扫描卷组
  • STM32(HAL库)通过ADC读取MQ2数据

    目录 1 简介 2 CubeMX初始化配置 2 1 基础配置 2 1 1 SYS配置 2 1 2 RCC配置 2 2 ADC外设配置 2 3 串口外设配置 2 4 项目生成 3 KEIL端程序整合 3 1 串口重映射 3 2 ADC数据采集