STM32入门教程-2023版【3-3】gpio输入

关注 + 星标公众号    不错过精彩内容

图片

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 

上两小节我们已经把GPIO的结构和8种输入输出模式都讲完了,到这里还不懂的可以回头看一下。

 一、硬件介绍

(1)按键介绍

  • 按键:常见的输入设备,按下导通,松手断开(左下角的这个图片就是按键,上面白色的是按钮,下面是它的两个引脚)

  • 按键抖动现象:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动(通过下面这个波形就可以看到,假设按键没按下是高电平,按下了就是低电平,那在按下的瞬间,信号由高电平变为低电平时,就会来回的抖几下,这个抖动会比较快,通常在5~10ms之间,人眼是分辨不出来的,但是对于高速运行的单片机而言,5~10ms的时间还是很漫长的,所以我们要对这个抖动进行过滤,否则就会出现接键按一下,单片机却反映了多次的现象,另外在按键松手的时候,也会有一小段时间的抖动,也需要过滤。最简单的过滤办法就是加一段延时,把这个抖动时间耗过去,这样就没问题了)

图片

(2)传感器模块介绍

从左到右分别是:光敏电阻传感器、热敏电阻传感器、对射式红外传感器、反射式红外传感器(它们的电路结构和工作原理都差不多)

图片

工作原理:传感器元件(光敏电阻 / 热敏电阻 / 红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出 (电阻的变化不容易直接观察) ,再通过电压比较器进行二值化即可得到数字电压输出

下面这个图就是传感器模块的基本电路:

图片

单独看这个模块,这个N1就是传感器元件所代表的的可变电阻,它的阻值可以根据环境的光线、温度等模拟量进行变化,上面这个R1,是和N1进行分压的定值电阻,R1和N1串联,一端接在VCCE极,一端接在GND负极,这就构成了基本的分压电路。

左边这个C2是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑.一般我们在电路里遇到这种一端接在电路中,另一端接地的电容,都可以考虑一下这个是不是滤波电容的作用,如果是滤波电容的作用,那这个电容就是用来保证电路稳定的,并不是电路的主要框架.

这时候我们在分析电路的时候,就可以先把这个电容给抹掉,这样就可以使我们的电路分析更加简单。那我们把这个电容抹掉,整个电路的主要框架就是定值电阻和传感器电阻的分压电路了。

在这里可以用分压定理来分析一下传感器电阻的阻值变化对输出电压的影响,当然我们还可以用上下拉电阻的思维来分析,当这个N1阻值变小时,下拉作用就会增强,中间的AO端的电压就会拉低,极端情况下,N1阻值为0,AO输出被完全下拉,输出0V。

图片

当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高,极端情况下,N1阻值无穷大,相当于断路,输出电压被R1拉高至VCC。如

图片

用上下拉电阻来分析电路的,可以举个例子来说明上下拉电阻的工作逻辑。

AO这个输出端你可以把它想象成一个放在屋里的水平杆子,R1上拉电阻相当于拴在屋顶的弹簧,将杆子往上拉,N1下拉电阻相当于拴在地面的弹簧,将杆子往下拉,N1这个电阻的阻值越小,弹簧的拉力就越强。

这个杆子的高度就相当于电路中的电压,如果只有上拉弹簧或者下拉弹簧,那杆子肯定被拉到了屋顶或者地面,在电路中就相当于中间点的电压为VCC或者GND。

那当两个弹簧相互拉扯的时候,中间的输出端就会向拉力强的一端偏移,至于偏移多少,就取决于两个弹簧的弹力之差了,如果上下拉弹簧的弹为一致,则杆子会处于居中的位置,也就是电路输出VCC/2的电压,如果上面的阻值小,拉力强,那输出电压就会变高;反之下面的阻值小,输出电压就会变低,如果阻值为0,在电路中就是短接的状态,那就相当于拉力无穷大了;如果上下拉电阻的阻值都为0,就是两个无穷大的为在对抗,在电路中呈现的状态就是电源短路,所以这种情况应该避免。

这个上拉电阻和下拉电阻,在单片机电路中会经常出现,比如弱上拉、弱下拉、强上拉、强下拉等,这里强和弱就指电阻阻值的大小,也就是这个弹簧弹力的大小,上拉和下拉就指是接到VCC还是GND,也就是这个杆子是拉向屋顶还是拉向地面,最终的输出电压就是在弹簧拉扯下最终杆子的高低。

在N1和R1这两个电阻的分压下,AO就是我们想要的模拟电压输出了,所以这里可以看到,这个AO电压就直接通过这个排针输出了,这就是AO电压的由来,仅需两个电阻分压即可得到

图片

那接下来这个模块还支持有数字输出,这个数字输出就是对AO进行二值化的输出,这里二值化是通过这个芯片LM393来完成的,这个LM393是一个电压比较器芯片,红框圈的里面有两个独立的电压比较器电路,然后剩下的是VCC和GND供电,那我们VCC就接到了电路的VCC,GND也接到了电路的GND,最左边这里有个电容,是一个电源供电的滤波电容(这个电压比较器其实就是一个运算放大器,有关运算放大器的知识,我在51单片机视频的AD/DA那一节有讲过,大家不会的可以去看一下)

图片

当这个运算放大器为比较器,当这个同相输入端的电压大于反相输入端的电压时,输出就会瞬间升高为最大值也就是输出接VCC,反之当同相输入端的电压小于反相输入端的电压时,输出就会瞬间降低为最小值也就是输出接GND,这样就可以对一个模拟电压进行二值化了

实际的应用在这里,同相输入端IN+接到了AO这里,就是模拟电压端,IN-呢,接了一个R2电位器,这个电位器的接法也是分压电阻的原理,拧动电位器,IN-就会生成一个可调的闻值电压

图片

两个电压进行比较,最终输出结果就是DO,数字电压输出DO最终就接到了引脚的输出端,这就是数字电压的由来

图片

右边这里还有两个指示灯电路,左边的是电源指示灯,通电就亮,右边的是DO输出指示灯,它可以指示DO的输出电平,那右边DO这里还多了个R5上拉电阻,这个是为了保证默认输出为高电平的

图片

最右边就是P1的排针,分别是VCC、GND、DO和AO

图片

对于光敏电阻传感器来说,这个N1就是光敏电阻;对于热敏电阻传感器来说,这个N1就是热敏电阻;

图片

对应这个红外传感器来说,这个N1就是一个红外接收管,当然对应还会多一个点亮红外发射管的电路在这里,发射管发射红外光,接收管接收红外光,模拟电压就表示的是接收光的强度,那这个模块的这里,电位器是直接换成了两个电阻进行分压,这样数字输出就是固定闯值的二值化了,这个模块通常用来检测通断,所以阈值也不需要过多的调整

图片

那最后一个模块也是一个红外发射管和接收管, 只不过它是向下发射红外光,然后检测反射光的,这个可以用来做寻迹小车

(3)硬件电路

按键

最上面两个是下接按键的方式,最下面两个是上接按键的方式,一般来说我们的按键都是用上两种方式,也就是下接的方式,这个原因跟LED的接法类似,是电路设计的习惯和规范

图片

第一种接法是按键的最常用的接法了,随便选取一个GPIO口,比如PA0,然后通过K1接到地,当按键按下时,PA0被直接下拉到GND,此时读取PAO口的电压就是低电平.

当按键松手时,PA0被悬空,引脚电压会不确定,所以在这种接法下,必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象。

如果PA0是上拉输入模式,按下按键,引脚为低电平,松手,引脚为高电平

图片

第二种接法,相比较第一个图,在这里外部接了一个上拉电阻,这个上拉电阻大家可以想象成一个弹簧,把这个端口向屋顶上拉,当按键松手时,引脚由于上拉作用,自然保持为高电平,当按键按下时,引脚直接接到GND,所以引脚就为低电平。

这种状态下,引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入,如果是上拉输入,那就是内外两个上拉电阻共同作用了,这时高电平就会更强一些,对应高电平就更加稳定,当然这样的话,当引脚被强行拉到低时,损耗也就会大一些

图片

第三种接法,PA0通过按键接到3.3V,这样也是可以的,不过要求PA0必须要配置成下拉输入的模式,当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平。

这要求单片机的引脚可以配置为下拉输入的模式,一般单片机可能不一定有下拉输入的模式,所以最好还是用上面的接法,下面的作为扩展部分,大家了解一下即可

图片

最后一种接法,就是在刚才的这种接法下面再外接一个下拉电阻,这个接法PA0需要配置为下拉输入模式或者浮空输入模式,和第二种类似

图片

总结:上面两种接法,按键按下为低电平,松手为高电平;下面两种接法,按键按下为高电平,松手为低电平;左边两种接法必须要求引脚是上拉或下拉输入的模式;右边两种接法可以允许引脚是浮空输入的模式,因为已经外置了上拉电阻和下拉电阻,一般我们都用上面两种接法,下面两种接法用的较少

传感器模块

最右边的是传感器模块的电路,因为是使用模块的方案,所以电路还是非常简单的,这里VCC接3.3V,GND接GND,用于供电,DO数字输出随便接一个端口,比如PA0,用于读取数字量,AO模拟输出呢,我们之后学ADC模数转换器的时候再讲,现在还是不用接的

图片

二、C语言学习

  

这里不再过多赘述,这里主要讲的一些C语言高级一点的知识,学过C语言的可以不用再学

没学过的,有需要可以点击这里观看视频学习

作 者 :硬核王同学

------- END ------

关注公众号回复“加群”按规则加入技术交流群  回复“1024”查看更多内容

图片

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

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

相关文章

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序: 2、ITP新建工程: 3、依次选择,最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来,地址绑定:M1 6、地址绑定:Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

力扣——C语言:合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode) 这道题有多种方法可以解决 一、暴力求解 这种方法最简单,我们只需要把两个数组合在一起然后在冒泡排序就可以了 代码如下: void merge(int* nums1, int nums1Size, int m, int* nums2…

Redis 过期删除策略

常见的三种过期删除策略: 定期删除;惰性删除;定时删除; 定期删除策略 每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。 定期删除的实现在 expire.c 文件下的 activeExpireCycle …

c++在结构(Struct)中使用栈(Stack)

栈实现 1.入栈 2.出栈 3.空栈 4.满栈 5.栈顶 完整栈实现源码: // // myStack.hpp // algo_demo // // Created by Hacker X on 2024/1/9. //#ifndef myStack_hpp #define myStack_

【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是是《驱动序列》文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识…

DAY2-English Learning

一、积累 1.trunk 案例: i put my luggage in the trunk of the car. 翻译:我把行李放在汽车的后备箱里。 2. solvent 例句:The sovlent is uesd to dissolve the paint. 翻译:溶剂是用来溶解油漆的。 3. 受伤的表达 1.cramp …

人工智能_机器学习091_使用三维瑞士卷数据_KMeans聚类算法进行瑞士卷数据聚类---人工智能工作笔记0131

然后我们首先来构建一下数据 准备瑞士卷数据: import numpy as np 导入数学计算包 import matplotlib.pyplot as plt 导入画图包 #自底向上聚类 from sklearn.cluster import AgglceerativeClustering 导入分层聚类模型 from sklearn.datasets import make_swiss_roll # 瑞士卷…

谷粒商城项目|微服务架构的一些与思考解决跨域问题

1.微服务架构的组成每部分的作用 2.还有其他的微服务架构模式吗 3.微服务服务交互的方式 1)grpc 2)rest api 4.微服务网关与API网关? 5.注册中心比较(Nacos与Eureka) Nacos Nacos 是阿里巴巴开源的项目,N…

【Python学习】Python学习9-字符串

目录 【Python学习】Python学习9-字符串 前言创建语法访问字符串的值字符串拼接Python 转义字符Python字符串运算符Python格式化字符串Python 三引号Unicode字符串Python 的字符串内建函数参考 文章所属专区 Python学习 前言 本章节主要说明Python的字符串类型。 创建语法 …

SQL基础知识2

select语句 1、where语句 具体的在 SQL基础知识1 2、集函数 餐厅订单案例 where后面用集函数会导致无效/错误,原因在3.1 3、group by、having 继上面的餐厅案例 案例:用两个条件分组 1、having和where的区别 2、总值计算 (汇总&#x…

Mysql高可用|索引|事务 | 调优

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 chatgpt体验地址 文章目录 前言sql语句的执行顺序关键词连接名字解释sql语句 面试坑点存储引擎MYSQL存储引擎 SQL优化索引索引失效索引的数据结构面试坑点 锁事务四大特性事务的隔离级别M…

创建一个矩形中有两个三角形

#include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream>float vertices[] {// 第一个三角形0.5f, 0.5f, 0.0f, // 右上0.5f, -0.5f, 0.0f, // 右下-0.5f, -0.5f, 0.0f, // 左下-0.5f, 0.5f, 0.0f, // 左上 };unsigned i…

P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS)

目录 [NOIP2001 提高组] 数的划分题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 动态规划的解题思路Code运行结果DFSCode运行结果 [NOIP2001 提高组] 数的划分 题目描述 将整数 n n n 分成 k k k 份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相…

FCRP第一题详解一

先看效果&#xff1a; 20240106-094943 看他的第一要求&#xff1a; 1.整个模板只能出现一个数据集&#xff0c;下拉复选框与报表主体共用一个数据集&#xff0c;且不影响互相显示。 所以这里不能通过SQL语句来过滤&#xff0c;SQL语句中中只能全部查询出来&#xff0c;这样保…

Linux———head,tail命令详解(狠狠爱住)

目录 head 命令&#xff1a; head 命令基本语法&#xff1a; 常用选项 示例 显示文件的前 10 行&#xff1a; 显示文件的前 5 行&#xff1a; 显示文件的前 100 个字节&#xff1a; 不显示文件名的标题信息&#xff1a; 显示文件名的标题信息&#xff1a; tail 命令&…

基于JAVA+SpringBoot的咖啡商城

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着互联网的普及和发…

Transformer从菜鸟到新手(五)

引言 上篇文章我们在单卡上完成了完整的训练过程。 从本文开始介绍模型训练/推理上的一些优化技巧&#xff0c;本文主要介绍多卡并行训练。 下篇文章将介绍大模型推理常用的缓存技术。 多卡训练 第一个要介绍的是利用多GPU优化&#xff0c;因为在单卡上训练实在是太慢。这…

java开发中如何使用定时任务

定时任务概述&#xff1a; 任务调度&#xff1a; 是指系统为了自动完成特定任务&#xff0c;在约定的特定时刻执行任务的过程。有了任务调度&#xff0c;即可解放更多的人力&#xff0c;而是由系统自动去执行任务。 常用业务场景案例&#xff1a; 某电商系统需要在每天上午10点…

利用“与非”运算实现布尔代数中的与,或,非三种运算

什么是“与非”运算&#xff1f; 要想明白“与非”运算&#xff0c;首先要明白“与”运算和“非”运算。 “与”运算在离散数学中叫做合取式&#xff0c;也就是A和B相同时为1的时候结果才为1&#xff0c;其余情况都为0 下面是“与”运算的真值表 “非”运算在离散数学中叫做否…

网络协议与攻击模拟_01winshark工具简介

一、TCP/IP协议簇 网络接口层&#xff08;没有特定的协议&#xff09; 物理层&#xff1a;PPPOE宽带拨号&#xff08;应用场景&#xff1a;宽带拨号&#xff0c;运营商切网过来没有固定IP就需要拨号&#xff0c;家庭带宽一般都采用的是拨号方式&#xff09;数据链路层网络层…