前言
文章以STM32F103ZET6芯片为例来介绍
建议观看了上一篇文章之后,再来看这篇,直接看这篇也是可以的。
一、输入部分电路
单独抽出输入部分
MCU内部理解输入电路
✨关于输入,GPIOx 常用的输入模式一共有四种:
- 上拉输入
- 下拉输入
- 浮空输入
- 模拟输入
简化电路,这里把片上外设去掉
进一步简化电路
二、上拉与下拉电阻
- 上拉电阻 :为特定电路提供缺省高电压
- 相对的,还有一个下拉电阻,理论和上拉电阻类似,总结一句话:为特定电路提供缺省低电压
- 唯一需要强调的是,输入这里的上拉电阻和下拉电阻,属于 MCU 内部,GPIO 模块内部自带的,和输出开漏那里的外部上拉电阻,在位置上不同,但是功能是类似的。
三、TTL 施密特触发器
常识:我们现实生活中的信息,整体其实就分为两类:
- 一类是可以量化的,状态有限的信息。如:电梯门有没有关好,汽车安全带有没有系好,共享单车有没有锁好,手机有没有调到静音,门铃有没有被摁下等等,我们把类似这种信息叫做数字信息。
- 另一类是连续可变的,随时间变化可以取无穷个值的信息。如:洗澡水的冷热,手机剩余电量,奶茶店背景音乐的音量,早高峰地铁的拥挤程度,骑自行车的快慢,吹风机出风口的风力大小等等,我们把这类信息叫做模拟信息。
- 随着人类进入了信息时代,各种计算机,单片机层出不穷,但归根结底,这些设备都是为人服务的。为了给你更好的服务,计算机 / 单片机,就必须获取人 / 世界的信息,获取你的位置信息,为你提供打车服务,获取你的搜索信息,给你提供搜索服务,获取你的体温、心跳信息,给你提供健康检查,空调获取房间温度,为你自动调节温度等等,换句话说:计算机 / 单片机,必须要能处理数字信息和模拟信息。
- 为了让你的计算机 / 单片机能处理数字信息、模拟信息,硬件工程师,科学家们发明了各种硬件电路,同时也产生了大量的知识,为了培养更多的工程师,科学家,于是所有的高校便开了两门课程《数字电路》和《模拟电路》,很明显,这两门课,是教我们在计算机世界,处理人类和世界的两种信息的:数字信息和模拟信息!
所以施密特触发器就是进行信息处理一个硬件单元。TTL 施密特触发器全称是: Transistor‑Transistor Logic Schmitt Trigger(晶体管‑晶体管逻辑施密特触发器)。它的核心作用是:
- 抗噪整形:把抖动、毛刺、斜坡等不可靠的输入波形整形成规则的方波。
所谓的方波,在硬件上是方波,在软件上就是 0 / 1,本质是数字信息
当 MCU 某一个引脚要进行输入的时候,因为外部因素的干扰,输入信息,不一定是规整的输入信息
输入的信息可能是:
如果没有 TTL 施密特触发器,那么输入信息就可能在 01 之间反复横跳:
如果存在 TTL 施密特触发器,当这类信息输入到引脚,传递到 TTL 施密特触发器,输入波形就会被整形成规则的方波,这个工作是 TTL 施密特触发器的核心作用。
TTL 施密特触发器的硬件电路内部,具有整形模块,规定出正向阈值电压 VT+,和负向阈值电压 VT‑,从而限定一个迟滞区域,要求,01 跳变,不能在一个临界值上下跳转,而是 "必须穿越区域",才能发生跳转。下面见详细解释:
- 正负阈值电压:设定迟滞区域,确保输入必须越过 VT+ 才触发高电平,低于 VT‑ 才返回低电平,防止噪声误触发
- 迟滞区域:迟滞区域的作用是通过设定不同的切换阈值,防止输入微小波动导致输出频繁跳变,从而增强系统的稳定性。
迟滞区域的本质理解
- 输入抖动在迟滞区内时,输出保持上次状态不变,避免误跳变
如果在正向阈值电压或者负向阈值电压附近来回跳转呢?以正向阈值电压为例
在此位置跳转,只有两种情况:
- 高于正向阈值电压 VT+:就应该是高电平
- 在迟滞区域以内:输入抖动在迟滞区内时,输出保持上次状态不变,避免误跳变,你在正向阈值电压 VT + 附近进行跳转,那么最近一次状态就一定是高电平喽,继续维持高电平不变
- 负向阈值电压附近来回跳转同理
⭐结论:如果在正向阈值电压或者负向阈值附近来回跳转,维持最近状态不变。
这样就有效剔除了输入信息突变,输入信息中包含毛刺的问题,当然,这里所有的工作,全部都是在 TTL 施密特触发器内部自动完成的,使用者可以不关心。
四、上拉输入 (Pull‑up Input)
1. 上拉输入是什么?
上拉输入就是 MCU 内部配置了上拉电阻,所谓配置上拉电阻,本质就是:
闭合上拉电阻开关,断开下拉电阻开关
开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关
后续讨论,就去掉下拉部分了。
2. 上拉输入的过程
2.1输入高电平
- 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1
2.2 输入低电平
- 当引脚输入低电平,GPIO 就收到低电平,输入数据寄存器内部就读入 0
❓上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?
不会,本质就是谁更 "强" 的问题
详见下文两个根本问题
2.3 输入引脚悬空
当引脚没有接入任何设备,即和外部断开,在上拉电阻的拉动下,输入数据寄存器默认读到的就是 1,所以,上拉模式本质是提供了输入数据的缺省值
为什么上拉输入中,需要上拉电阻?
因为有了上拉输入,就可以让芯片在无外接输入时,输入数据寄存器默认读到 1,输入数据默认就是高电平(1)。
五、下拉输入 (Pull-down Input)
1. 下拉输入是什么?
下拉输入就是 MCU 内部配置了下拉电阻,所谓配置下拉电阻,本质就是:
闭合下拉电阻开关,断开上拉电阻开关
开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关
后续讨论,就去掉上拉部分了。
2. 下拉输入的过程
2.1 输入高电平
- 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1
❓下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?
- 不会,其实本质就是谁更 "强" 的问题
- 详见下文两个根本问题
2.2 输入低电平
- 当引脚输入低电平, GPIO 就收到低电平,输入数据寄存器内部就读入 0
2.3 输入引脚悬空
- 当引脚没有接入任何设备,即和外部断开,在下拉电阻的拉动下,输入数据寄存器默认读到的就是 0,所以,下拉模式本质是提供了输入数据的缺省值
因为有了输入缺省值,所以下拉输入模式下,无论输入引脚是什么情况,输入数据寄存器内部的数据是确定的
✨ 为什么下拉输入中,需要下拉电阻?
- 提供输入确定性,让缺省输入是低电平(0)
六、两个根本问题
无论是上拉,还是下拉,我们有两个问题其实并没有清楚回答:
- 上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?
- 下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?
这两个问题,其实原理上是同一种问题。
要理解这点,需要知道两点:
- 无论是上拉电阻,还是下拉电阻,阻值在单片机内部,都属于高阻值器件,阻值一般都高达 30kΩ~50kΩ
- 欧姆定律 V = I * R,在计算电压角度,计算的是对应设备在整个电路中承担的电压差,即经过该设备,电压会下降多少
解决问题一:上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?
- 输入低电平是一种说法,在单片机内部,可以理解为就是通过接地实现引脚输入低电平的,那么其实内部上拉电阻和外部接地,就形成了一个通路
- 引脚就是导线,电阻忽略不计,那么这个通路中唯一的一个需要承压的器件就是上拉电阻!
- 那么上拉电阻两端的压差就是 VDD,等效电路如下:
上拉电阻自身承压就是位置 1‑位置 2 就是电流经过该设备对应的压降!!!
位置 1 电压 VDD
位置 2 电压 0V (低电压)
✨ 所以上拉输入的时候,输入低电平,上拉电阻不会把电平拉高吗?
- 不会,形成通路之后,位置 2 电压就是 0V,低电平,不受上拉电阻的影响
解决问题二:下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?
- 输入高电平只是一种说法,在单片机内部,你可以理解成为就是通过接电源 VDD 实现引脚输入高电平的,那么其实内部下拉电阻和外部电源 VDD,就形成了一个通路
- 引脚就是导线,电阻忽略不计,那么这个通路中唯一的一个需要承压的器件就是下拉电阻!
- 那么下拉电阻两端的压差就是 VDD
⭐ 下拉输入的时候,输入高电平,下拉电阻不会把电平拉低吗?
- 不会,形成通路之后,位置 1 电压就是 VDD,高电平,不受下拉电阻的影响
输入上拉、输入下拉总结表
| 引脚高电平 | 引脚低电平 | 引脚悬空 (默认输入值) | |
|---|---|---|---|
| 输入上拉 | 1 | 0 | 1 |
| 输入下拉 | 1 | 0 | 0 |
七、弱上拉弱下拉
MCU 内部的上下拉电阻之所以被称为 “弱”,是因为其阻值较大(通常在几十 kΩ),导致其提供的电流非常小,从而对外部信号的控制力比较 “弱”。
八、浮空输入 (Floating Input)
1. 浮空输入是什么?
浮空输入就是 MCU 内部配置上下拉电阻都断开,本质就是:
- 断开下拉电阻开关,断开上拉电阻开关
- 开关在 MCU 内部,可以通过 MCU 提供的配置寄存器选择闭合还是断开某一个开关
后面我们讨论的时候,就省略掉上下拉电阻了
2. 浮空输入的过程
浮空输入就是 MCU 内部没有配置上拉 和下拉电阻,可以等效如下:
⭐ 浮空输入,一共会有三种情况:
- 当引脚输入高电平,GPIO 就收到高电平,输入数据寄存器内部就读入 1
- 当引脚输入低电平,GPIO 就收到低电平,输入数据寄存器内部就读入 0
- 当引脚悬空,干扰信号经过触发器后就会变成随机的高低电平,因此浮空输入模式下电平高、低是不确定的。
电源线、人体、手机、电机、开关电源、甚至手靠近导线都会产生交变电场。
附近的 WiFi、蓝牙、对讲机、电机、继电器等会辐射高频电磁波
浮空输入,引脚断开,引脚就和一个接受天线一样,接受外部的电磁干扰。
九、模拟输入 (Analog Input)
1. 模拟输入是什么?
要谈清楚模拟输入是什么,就必须再回到之前聊的 GPIO 输入的整体结构图
先不管模拟输入中的 “模拟” 二字是什么,先从电路角度,我们可以看到,物理上,模拟输入硬件电路等效于一根导线
当然,我们不能只看到模拟输入的物理电路结构是一根导线,更要看到,模拟输入,没有用 TTL 施密特触发器,即不要给我做信号整形,我就要原汁原味。
⭐ 模拟输入理解第一层:
- 引脚外部是什么,模拟输入就获取什么
2. 模拟信号与模拟信号处理模块
- 模拟信号是什么,我们在之前的内容已经渗透过,后续章节我们会陆续展开深入研究
- 不管怎么样在 MCU 内部,一定会有专门处理模拟信号的片上外设,虽然我们不知道是什么,但是并不妨碍我们进一步完善对 MCU 内部模块构成的进一步认识
常见的未来处理模拟信号的片上外设设有:ADC,DAC 等
💡信号小知识:
模拟信号:在时间与幅度上均连续变化的物理量,物理世界本质是连续的。
数字信号:在时间与幅度上均离散化的信号,将连续的物理量量化为离散的数据量。