基于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),也就是。 梯度…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...