基于stm32的ADC读取烟雾报警器的数值

news2024/12/28 5:55:27

       本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压大于临界值时就意味着空气中可燃气体或烟雾的浓度过高,就会出发蜂鸣器报警。

一、硬件部分

名称图片作用
stm32f103c8t6单片机--
MQ-2烟雾报警器将空气中可燃气体或烟雾的浓度转化为具体的数值给到单片机的ADC外设
蜂鸣器空气中可燃气体或烟雾的浓度过高触发报警,由低电平触发

二、ADC的简单介绍

1.什么是ADC?

这里的ADC不是你游戏里的ADC打野,手册上说:12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

蒙逼不?淡定,从使用者的角度来说ADC就是一个把模拟电压转换成数字电压的工具,然后把数据放到内存中暂时储存。手册上说了那么多其实就是ADC使用时候的配置,下面我们慢慢讲。

2.ADC配置的描述

首先来说说这18个通道,图片中间靠左有GPIO端口,从IN0到IN15,一共有16个通道,还有两个通道是温度传感器还有VREFINT。但是在这个手册是针对stm32f10系列的,对于我们的stm32f103c8t6来说只有IN0到IN9,温度传感器还有VREFINT共计11个通道。ADC通道的作用是实现模拟信号的采样和量化,将连续变化的模拟信号转换为离散的数字信号,以便于数字系统的处理和分析。12位ADC转换的总时间T=采样周期(1.5个周期)+量化编码周期(12.5个周期),我们这里的ADC周期是12MHz,所以最短的转换时间为 1.17us。

2.简单常用转换的模式

2.1非扫描模式与扫描模式

非扫描模式适用于只占用一个通道,而扫描模式适用于多个通道。见下图

图1有一个通道,适用于非扫描模式;图二有多个通道,适用于扫描模式。如果在图二中使用非扫描模式,就只会发序列1里面的数据。

2.2单次转换与连续转换

单次转换就是说,每一次你使用的时候,都需要开启触发条件,通道的数据只要发送出去以后,通道就关闭了;连续转换就是说,你只需要在刚开始的时候开启一次触发条件,即使你这一轮通道里的数据发送完了,通道也不会关闭,下一轮数据还可以接着发。

看到了吗?连续模式下,触发转换的条件只需要一次就行。而且不管在什么模式下,每一轮的数据全部发出之后都会有EOC这个标志位置一。

当然了,还有别的模式,这里就不说了,有兴趣的可以自己看手册。

3.规则组与注射组

规则组(Regular Group)是ADC中最常用的组,它可以同时采集多个不同的模拟信号,并将这些信号转换为相应的数字值。规则组通常包含一个或多个ADC通道,每个通道都可以连接到一个外部模拟信号源上,并且可以设置不同的采样频率、分辨率等参数。规则组的输出数据可以通过DMA(直接存储器访问)或中断方式传输到内存或其他设备中。

结合最上面的图我们可以看出来规则组最多只有16个通道,但是经过模数转换器以后,每次只有一个通道的数据可以进入规则通道数据寄存器。打个比方,现在有16个人(人就是通道)来餐厅(餐厅就是模数转换器)吃饭,但是餐厅只能容下一个人(只有一个数据寄存器)。第一个人在里面吃饭,如果第二个人也想进去,就需要把第一个人撵走,占据第一个人的位置(这样的话,第一个数据就消失了,所以说要在第二个数据来之前把第一个数据取走),后面的人依次进行这样的操作。

注射组(Injected Group)是ADC中另一个可选的组,它可以在规则组正在进行转换时,对某些特定的模拟信号进行额外的采样和转换。注射组通常用于需要高速响应的应用场合,例如获取瞬态信号或快速变化的信号。注射组通常包含一个或多个ADC通道,每个通道都可以设置不同的触发条件、采样时间等参数。注射组的输出数据也可以通过DMA或中断方式传输到内存或其他设备中。

结合最上面的图,我们可以看到注射组最多只有4个通道,经过模数转换器以后,每次可以让四个通道的数据都进入规则通道数据寄存器。

需要注意的是,规则组和注射组之间并不是互斥的关系,它们可以同时使用,也可以单独使用。在使用ADC时,需要根据具体的应用场景和要求,选择适合的组合方式。

下面的内容都针对规则组。

4.左对齐与右对齐

左对齐的数据比右对齐的数据大了16倍,右对齐是我们基础的对齐方式。

三、stm32cube的配置

SYS

RCC

ADC

GPIO

四、程序部分

#include "main.h"
#include "adc.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f)
{
unsigned char temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return ch;
}
int main(void)
{
  /* USER CODE BEGIN 1 */
   uint32_t smoke_value=0;
  /* 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 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_ADC_Start(&hadc1); //启动ADC单次转换
		HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成
		smoke_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
		dianya=smoke_value*3.3/4096;
		if(dianya>1.0)//烟雾报警器电压返回值大于1.0,则蜂鸣器报警
		{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,GPIO_PIN_RESET);//蜂鸣器AO输出接在B7
			HAL_Delay(1000);
		}//蜂鸣器AO输出接在B7
		else
		{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,GPIO_PIN_SET);
		HAL_Delay(1000);
		}
		printf("dianya = %f\r\n",dianya);
		//printf("smoke_value = %d \r\n", smoke_value);
		HAL_Delay(100);
  }
  /* USER CODE END 3 */
}

五、串口显示

用打火机来代替易燃气体,半按下打火机,对准烟雾报警器,里面的气体就会出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一:基于LaTeX环境方案二:基于KaTeX(推荐) 方案三:基于Matplotlib写在最后 引言 近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验,避免商家总是要在众多的配送公司中选择想要,小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处,指定需要设置的首选…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅&…

Linux进程控制(一)

前言:Linux进程控制是指在Linux操作系统中,对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统,能够同时运行多个进程任务的执行,继前面我们对Linux进程创建的学习之后,今…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: 如何实现线程同步&…

Linux touch命令:创建文件及修改文件时间

既然知道了如何在 Linux 系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用 touch 命令。 需要注意的是,touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令会在当前位置建立一个空文件&…

“第五十三天”

今天没有做什么,不过这个在打印,的时候一直卡着,我一直在想把逗号打印在后面,所以一直想办法确定最后一个是哪一位,这里居然没有绕过来其实可以看做是前面,这样第一个不打印逗号,后面打印就可以…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向 引言 大模型是10倍的机会,但并不是平均主义的机会,没有低垂的果实。 企业想在大模型的赛道上跑出成绩,应该怎么做,又要选择哪些赛道&#xff1…

postgresSQL 数据库本地创建表空间读取本地备份tar文件与SQL文件

使用pgAdmin4,你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步:找到Tablespaces 第二步:创建表空间名称 第三步:指向数据文件 第四步:找到Databases,创建表空间 第五步:输入数…

矩阵按键简单使用

1、写矩阵按键(下面在按这个格式把别的行也写入进去) 2、在LCD中显示

听GPT 讲Rust源代码--library/std(7)

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中,kernel_copy.rs文件位于sys/unix目录下,其主要作用是实现特…

全志T113-S3 裸机SMHC eMMC读写问题记录

由于全志的资料实在太少,很多只能通过很长时间测试才能知道问题,目前还没有实现时钟初始化,只使用了默认的24MHz时钟,测试eMMC读写过程中遇到2个问题; 问题1:读取扇区的时候,会遇到数据停止位错…

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写,是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集,像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

双11数码好物盘点、实用不踩坑的数码好物推荐

每年的双11都是买数码产品的最佳时间,因为很多外设产品的在双11都有很不错的降价空间,今天就列出几款适合双11购买的数码产品吧! 1、不用入耳佩戴的开放式耳机 -官方售价:199 推荐理由: 要推荐的是这款健康舒适的开…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

分布式锁-Redis红锁解决方案

一 分布式锁的概念 1:概念 分布式锁(多服务共享锁) 在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…

Oracle数据库设置归档模式(超级简单)

1、打开监听 查看监听的状态,如果没打开监听需要打开监听,如果打开直接下一步 lsnrctl status 打开监听 lsnrctl start 2、启动数据库 首先进入数据库 sqlplus /nolog 然后连接管理员 conn / as sysdba 3、查看当前模式 archive log list 可以…

Spring5学习笔记—CGlib动态代理

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Spring专栏 ✨特色专栏: M…

Linux UWB Stack实现——FiRa会话状态机

在FiRa标准中,很重要的一个概念就是FiRa会话以及会话的管理,本文主要介绍了在Linux UWB Stack实现中,FiRa会话状态机管理的实现。 在FiRa中,会话分为INIT、DEINIT、ACTIVE、IDLE四种状态,其定义如下。 enum fira_sess…

2023年上半年上午易错题(软件设计师考试)

计算机中,系统总线用于 (1) 连接。 A. 接口和外设 B. 运算器、控制器和寄存器 C. CPU、主存及外设部件 D. DMA控制器和中断控制器 在由高速缓存、主存和硬盘构成的三级存储体系中,CPU执行指令时需要读取数据,那…