STM32第十二课:ADC检测烟雾浓度(MQ2)

文章目录

  • 需求
  • 一、MQ-2 气体传感器
    • 特点
    • 应用
    • 电路及引脚
  • 二、实现流程
    • 1.开时钟,分频,配IO
    • 2.配置ADC的工作模式
    • 3.配置通道
    • 4.复位,AD校准
    • 5.数值的获取
  • 需求实现
  • 总结


需求

使用ADC将MQ2模块检测到的烟雾浓度模拟量转化为数字量。
最后,将实时检测的结果显示在串口上。
在这里插入图片描述


一、MQ-2 气体传感器

特点

广泛的探测范围,高灵敏度,快速响应恢复,优异的稳定性,寿命长以及简单的驱动电路。

应用

可用于家庭和工厂的气体泄漏监测装置, 适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等的探测。

电路及引脚

在这里插入图片描述
在这里插入图片描述

二、实现流程

由于该模块的实现流程和ADC光照采集几乎一样,下面使用库函数的方式来编写。

1.开时钟,分频,配IO

该模块使用的引脚为PC1/ADC123_IN11,所以接下来我们要配置PC1。
烟雾检测模块是获得一个模拟量,所以接引脚模式配置为模拟输入。
代码如下:

	//开时钟ADC1和PCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置GPIO口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//MQ2GPIO_Init(GPIOC, &GPIO_InitStructure);

2.配置ADC的工作模式

和光照检测一样,直接改成库函数就行。
代码如下(示例):

	ADC_InitTypeDef ADC_InitStruct={0};  //ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC独立模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//选择软件SWSTART位触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续还是单次模式ADC_InitStruct.ADC_ScanConvMode = DISABLE;//关闭扫描ADC_InitStruct.ADC_NbrOfChannel = 1;ADC_Init(ADC1,&ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);

3.配置通道

这里使用库函数编写就很简单了,直接一个函数就解决了。
输入参数 1 ADCx:x 可以是 1 或者 2 来选择 ADC 外设 ADC1 或 ADC2
输入参数 2 ADC_Channel:被设置的 ADC 通道
输入参数 3 Rank:规则组采样顺序。取值范围 1 到 16。
输入参数 4 ADC_SampleTime:指定 ADC 通道的采样时间值

ADC_RegularChannelConfig(ADC1, ADC_Channel_11,1, ADC_SampleTime_239Cycles5);

4.复位,AD校准

没什么好说的,该部分可有可无,想严谨点的话就加上。

	ADC_ResetCalibration(ADC1);//复位while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);//AD校准while(ADC_GetCalibrationStatus(ADC1));	

5.数值的获取

依旧是先转换一次,再while等待转换完成,最后读取打印。

void Get_Smoke_Value()
{uint16_t Smoke=0;//让规则通道转换一次ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC1->CR2 |= 0x01<<22;while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0)//判断寄存器的位2是不是等于1,是0就等待转换完成{}Smoke = ADC_GetConversionValue(ADC1); //读规则组通道数据寄存器printf("烟雾浓度参数 = %d \r\n",Smoke);		return; 
}

需求实现

关键代码如下:
main.c

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "pwm.h"
#include "adc.h"int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); SysTick_Config(72000);RGBpwm_Config();uint8_t cai_count=0;uint16_t cont=0;Adc_Config();while(1){	if(ledcnt[0]>=ledcnt[1]){//过去500msledcnt[0]=0;Get_Smoke_Value();}}return 0;
}

adc.c

#include "ADC.h"
//库函数
void Adc_Config(void)
{//开时钟ADC1和PC,PARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置GPIO口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//MQ2GPIO_Init(GPIOC, &GPIO_InitStructure);//配置ADC1ADC_InitTypeDef ADC_InitStruct={0};  //ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC独立模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//选择软件SWSTART位触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续还是单次模式ADC_InitStruct.ADC_ScanConvMode = DISABLE;//关闭扫描ADC_InitStruct.ADC_NbrOfChannel = 1;ADC_Init(ADC1,&ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//配置通道ADC_RegularChannelConfig(ADC1, ADC_Channel_11,1,  ADC_SampleTime_239Cycles5);//校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));	}void Get_Smoke_Value()
{uint16_t Smoke=0;//让规则通道转换一次ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC1->CR2 |= 0x01<<22;while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0)//判断寄存器的位2是不是等于1,是0就等待转换完成{}Smoke = ADC_GetConversionValue(ADC1); //读规则组通道数据寄存器printf("烟雾浓度参数 = %d \r\n",Smoke);return; 
}

adc.h

#ifndef _ADC_H_
#define _ADC_H_
#include "stm32f10x.h"
#include "stdio.h"
void Get_Smoke_Value();
void Adc_Config(void);
#endif

总结

大致流程和ADC光照采集差别不大,照着一步一步做就能实现。

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

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

相关文章

2.00004 优化器执行计划生成的流程是怎么样的?

文章目录 整体架构关键结构体PlannerInfo (pathnodes.h:195)PlannerGlobal (pathnodes.h:95)函数栈关键函数pg_plan_query (postgres.c:885)planner (planner.c:274)standard_planner (planner.c:287)subquery_planner (planner.c:628)整体架构 关键结构体 PlannerInfo (pathn…

Servlet_Web小结

1.web开发概述 什么是服务器&#xff1f; 解释一&#xff1a;服务器就是一款软件,可以向其发送请求,服务器会做出一个响应. 可以在服务器中部署文件,让他人访问 解释二&#xff1a;也可以把运行服务器软件的计算机也可以称为服务器。 web开发&#xff1a; 指的是从网页中向后…

MySQL-SQL优化Explain命令以及参数详解

前言 在MySQL优化的众多手段中&#xff0c;EXPLAIN命令扮演着至关重要的角色。它是数据库管理员和开发者手中的利器&#xff0c;用于分析SQL查询的执行计划。通过执行EXPLAIN&#xff0c;MySQL会提供一份详细的查询执行计划报告&#xff0c;这份报告揭示了查询将如何执行&…

【GIT】GIT服务器迁移了之后如何重新映射

最近我的一个GIT服务器镜像迁移了&#xff0c;伴随着ip地址也发生了变化。 经过实践&#xff0c;发现执行一下三步即可解决&#xff1a; 1、进入客户端版本管理后的源码文件夹&#xff1b; 2、执行&#xff1a; git remote -v 如果目录不对会提示&#xff1a; fatal: not…

2024年6月个人工作生活总结

title: 2024年6月个人工作生活总结 urlname: code-for-2024-06 tags: 代码积累知识总结 categories:我的程序代码 date: 2024-06-30 00:00:00 photos:gallery/tech/c2.jpg 本文为 2024年6月工作生活总结。 研发编码 编码和注释 因某些需要&#xff0c;重拾了2019年的工程代码…

Scala 循环

Scala 循环 Scala,作为一种多范式的编程语言,提供了丰富的方式来处理循环和迭代。在Scala中,除了传统的for和while循环外,还有更高级的函数式编程特性,如集合操作和高阶函数,这些都可以用来实现循环和迭代的任务。本文将详细介绍Scala中的循环机制,包括基本语法、高级用…

JUC工具类: Semaphore详解

Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证&#xff0c;只有成功获取许可证&#xff0c;才能使用资源。立刀旁 目录 # 带着BAT大厂…

EDA 虚拟机 Synopsys Sentaurus TCAD 2016.03 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1baw0IhmnFOKVkJMI3zkD_A?pwdcheo 提取码&#xff1a;cheo

【SQL】如何描述索引的分类

数据库中的索引种类多样&#xff0c;每种索引都有其特定的用途和特点。以下是常见的索引分类&#xff1a; 1. 单列索引 (Single-Column Index) 对单个列创建的索引。最基本的索引类型。 CREATE INDEX idx_column_name ON table_name (column_name);2. 多列索引 (Composite I…

联邦的基础配置

一、联邦的定义 联邦&#xff1a;在AS内部部署全互联的IBGP对等体可以很好解决IBGP路由传递的问题&#xff0c;但是扩展性低&#xff0c;大型网络中会带来沉重负担&#xff0c;针对此问题可以用路由反射器解决&#xff0c;也可以利用联邦解决&#xff0c;联邦也被称为联盟。大…

从Telnet到SSH:提升远程访问的安全性

前言 在计算机网络和远程通信中&#xff0c;Telnet和SSH是两种常用的协议&#xff0c;用于远程访问和管理服务器。然而&#xff0c;它们在安全性和功能方面有显著的区别。本文将详细讲述Telnet和SSH的区别&#xff0c;并探讨SSH在增强远程访问安全性中的重要性。 什么是Telne…

上门按摩SPA系统源码定制,专业搭建开发预约服务平台

在快节奏的现代社会&#xff0c;人们对放松和舒缓压力的需求日益增长。上门按摩SPA服务因其便捷性和私密性&#xff0c;受到了越来越多消费者的青睐。为了满足这一市场需求&#xff0c;专业的上门按摩SPA预约服务平台的搭建显得尤为重要。 我们的团队专注于为按摩SPA行业提供上…

MRTK 2.8.3

1.PC按键控制 移动摄像头:WSADQE、鼠标右键 模拟双手:左手(左Shift)、右手(右Shift) 将模拟的双手保持在视野中:T或Y 旋转模拟手部:按住Ctrl并移动鼠标 捏合手势:左Shift/空格 + 鼠标左键 2.常用脚本 (1)HandInteractionTouch(需搭配NearInteractionTouchableVolum…

python中方法的重写详解

python中对于类的继承的时候调用父类中一些方法的时候&#xff0c;会根据新的功能给方法增加一些新的内容&#xff0c;同时又要保留一些原有的父类里面的一些内容&#xff0c;此时就要对方法进行重写&#xff0c;这里面详细记录自己对于方法重写的心得 重写父类用两种&#xf…

使用Qt制作一个简单的界面

1、创建工程 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 选择 build system&#xff0c;有qmake、CMake 和 Qbs 三个选项。 CMake 很常用&#xff0c;功能也很强大&#xff0c;许多知名的项目都是用它&#xff0c;比如 OpenCV 和 VTK&#xff0c;但它的语法繁…

元宇宙相关技术研究--由AR眼镜引发的人机交互思考

本文是继上一篇文章基础上,跟踪最新VR/AR/MR眼镜技术发展的总结文章。随着IT新技术的发展,眼镜作为一种全新的交互方式,未来将逐渐走到人机交互的核心位置,眼镜集成了人机交互过程中的视觉(即眼睛)、听觉(即声音)、手势(即代替键盘鼠标触摸等)及方向位置感知等。这些交…

免费的CMS指纹识别系统

以下是一些免费的CMS指纹识别系统&#xff1a; WhatCMS&#xff1a;WhatCMS 是一个免费的在线工具&#xff0c;可以帮助用户快速识别网站所使用的CMS系统&#xff0c;包括WordPress、Joomla、Drupal等常见的CMS系统。用户只需输入网站的URL&#xff0c;即可获得识别结果。 ht…

如何成为C#编程高手?

成为C#编程高手需要时间、实践和持续的学习。以下是一些建议&#xff0c;可以帮助你提升C#编程技能&#xff1a; 深入理解基础知识&#xff1a; 确保你对C#的基本语法、数据类型、控制结构、面向对象编程&#xff08;OOP&#xff09;原则有深刻的理解。学习如何使用Visual Stud…

2024最新!将mysql的数据导入到Solr

Solr导入mysql的数据 如何安装导入数据前准备配置Solr的Jar包以及Mysql驱动包1.1、将solr-8.11.3\dist下的两个包进行移动1.2、将mysql-connect包也移动到该位置1.3、重启Solr项目 配置xml2.1、第一步我们需要创建核心2.2、第二步修改xml(这里是结合19年的教程)2.3、 创建data-…

mybatis延迟加载

mybatis延迟加载 1、延迟加载概述 应用场景 ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求&#xff0c;当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载的好处 ​ 先从单表查询、需要时再从关联表去关联查…