基于stm32的ADC读取烟雾报警器的数值
本文想要设计一个设计一个有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输出接在B7HAL_Delay(1000);}//蜂鸣器AO输出接在B7else{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 */
}
五、串口显示

用打火机来代替易燃气体,半按下打火机,对准烟雾报警器,里面的气体就会出来。
相关文章:
基于stm32的ADC读取烟雾报警器的数值
本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压…...
无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)
✨求关注~ 💻博客:www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…...
【IO面试题 四】、介绍一下Java的序列化与反序列化
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:介绍一下Java的序列化与…...
M1本地部署Stable Diffusion
下载安装 参考博客: 在Mac上部署Stable Diffusion(超详细,AI 绘画入门保姆级教程) 安装需要的依赖库 brew install cmake protobuf rust python3.10 git wget 可能中途会存在下载报错或者下载卡主的问题,需要切国内源 brew进行替换源: …...
java中的内存分配
目录 1.堆内存 2.栈内存 3.常量池 4.寄存器 5.示例 6.总结 1.堆内存 堆用来存放程序中动态生产的数据,如new出来的对象。 通过new方式创建的对象,数组及字符串都有自己的内存地址。 方法调用完毕后,方法中new出来的对象就会变成垃圾…...
Matter.js 插件:matter-wrap(世界是圆的)
本文简介 点赞 关注 收藏 学会了 记得以前看爆笑校园里有一集讲到,一个人对着前面开了一枪,过了一阵子弹打中他自己的后脑勺。作者想通过这个冷笑话告诉大家一件事:地球是圆的。 在 Matter.js 世界里,默认是没有边界的&#…...
HCIA --- ACL(访问控制列表)
ACL访问控制列表 一、作用 访问控制 --- 在路由器流量进或出的接口上,匹配流量产生动作---允许、拒绝定义感兴趣流量 --- 抓取流量,之后给到其他的策略,让其他策略进行工作; 二、匹配规则 至上而下逐一匹配,上条匹…...
Xcode自定义快捷键
一、新建脚本 1. 编写脚本 把脚本sh文件保存在安全的目录,不会被删除 我这里主要是两个常用的: 1.打开终端: xcode-terminal.sh #!/bin/shif [ -n "$XcodeProjectPath" ]; then open -a Terminal "$XcodeProjectPath"/.. elseo…...
jmeter界面压测过程卡死解决思路
1、排查压测机的资源是否充足; 2、检查jmeter压测脚本,除聚合报告的所有组件关闭; 我在压测过程中出现频繁卡死,就是查看结果数和断言结果信息量过多导致: 3、直接用非gui界面形式,也就是脚本形式压测。...
听GPT 讲Rust源代码--library/std(6)
题图来自 Why you should use Python and Rust together[1] File: rust/library/std/src/sys/unix/thread_parking/netbsd.rs 文件netbsd.rs位于Rust源代码的rust/library/std/src/sys/unix/thread_parking目录下。该文件是Rust标准库中用于Unix操作系统的线程等待和唤醒机制的…...
如何使用gpt提高效率
如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅&…...
配置VUE环境过程中 npm报错的处理方案以及VUE环境搭建过程
背景:VUE已经出来很久了,一直想研究这个东西也很久了。由于各种各样的原因,一直没有能处理。最近终于有时间可以研究了。 奈何报错了 嘤嘤嘤~~ 针对报错情况,其实后来没有找到什么好的方案,几经周折,终于搭…...
springboot 配置文件加载顺序
SpringBoot中配置文件的加载顺序是怎样的? 优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。 1.命令行参数。所有的配置都可以在命令行上进行指定; 2.Java系统属性(System.getProperties0) ; 3.操作系统环境变量 4.jar包外…...
二分查找java
一、题目。 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…...
深入理解Java中的转义字符
最近在学习《两周自制脚本语言》这本书,在词法分析的一些复杂的正则中用到了大量的转义字符’\,比如正则字符串中包含了这个部分\\\\\"你知道它是匹配什么的么? 反斜杠在字符串和正则表达式中都有特殊作用。今天让我们来深入理解一下Ja…...
VScode 调试 linux内核
VScode 调试 linux内核 这里调试的 linux 内核是通过 LinuxSD卡(rootfs)运行的内核 gdb 命令行调试 编辑 /home/tyustli/.gdbinit 文件,参考 【GDB】 .gdbinit 文件 set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit在 lin…...
Babylonjs学习笔记(五)——创建PBR材质
书接上回,这里讨论PBR材质!!! // 创建天空盒/* */const createSkyBox (scene:Scene):void>{const envTex CubeTexture.CreateFromPrefilteredData(./env/environment.env,scene)scene.environmentTexture envTex;scene.cre…...
C++ -- 深入理解多态
前言:多态的概念,通俗地来讲就是多种形态。当我们要完成某个行为的时候,不同的对象去完成时会产生不同的状态,这就叫做多态。具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。多态在C的类和对象中…...
【Java】泛型通配符
类型通配符 类型通配符<?> 一般用于接受使用,不能够做添加List<?>:表示元素类型未知的list,它的元素可以匹配任何类型带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中类型通配符上限࿱…...
NNDL:作业五
习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明: 激活函数以sigmoid为例。 神经元:有两层,线性层和激活层:yw*xb,然后y‘sigmoid(y),也就是。 梯度…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...


