4. 电路设计基础:二极管在矩阵中的作用(防串扰)、上拉电阻的选择与计算
好,咱们接着聊。上一节我们把矩阵扫描的基本原理讲清楚了,这一节要深入一点,聊聊两个非常关键的细节:二极管和上拉电阻。
说实话,这两个东西看着不起眼,但要是没处理好,你的游戏机按键就会出各种“灵异事件”。我当年做第一版掌机时,就吃过这个亏。
4.1 为什么需要二极管?—— 防串扰
先问一个问题:如果没有二极管,矩阵扫描会怎样?
你想想看,矩阵扫描的本质是“分时选通行,同时读列”。正常情况下,只有被选中的那一行有电流路径。但如果没有二极管,电流可能会“抄近路”——通过其他按键、其他行,形成意想不到的回路。
这种现象就叫串扰(Crosstalk)。
举个具体例子:
假设一个 4×4 的矩阵,用户同时按下 (Row1, Col1) 和 (Row2, Col2) 两个键。当你扫描 Row1 时,按理说只有 Col1 应该被拉低。但电流可能这样走:
Row1 → (Row1, Col1) 按键 → Col1 → (Row2, Col1) 按键(未按下,但二极管?没有!)→ Row2 → (Row2, Col2) 按键 → Col2
结果呢?Col2 也被拉低了。你的单片机就会误以为 (Row1, Col2) 也被按下了。
这就是典型的“鬼键”问题。我在项目中遇到过,当时调试了整整一个下午,最后发现就是少了几个二极管。
4.2 二极管怎么接?
解决串扰的方法很简单:在每个按键上串联一个二极管。
二极管的特性是单向导电。电流只能从阳极流向阴极。我们把它接在按键和列线之间,方向是:
- 阳极 → 接按键(行线侧)
- 阴极 → 接列线
这样,电流只能从行线 → 按键 → 二极管 → 列线,不能反向流回去。串扰路径就被切断了。
关键点: 二极管必须每个按键一个,不能共用。共用的话,防串扰效果会大打折扣。
选什么型号?我个人习惯用 1N4148。它开关速度快、正向压降小(约0.7V),非常适合这种数字电路场景。如果你做的是低功耗手持设备,也可以选 BAT54 这类肖特基管,压降更低(约0.3V)。
4.3 上拉电阻的作用
说完二极管,咱们聊聊上拉电阻。
上拉电阻接在列线上,一端接列线,另一端接 VCC(通常是 3.3V 或 5V)。它的作用有两个:
- 默认拉高电平:当没有按键按下时,列线被上拉到高电平,单片机读到的是 1。
- 提供放电回路:当按键按下时,列线通过按键和二极管被拉到 GND,单片机读到的是 0。
说白了,上拉电阻就是给列线一个“默认状态”。没有它,列线会悬空,电平不确定,读到的数据就是乱的。
4.4 上拉电阻怎么选?—— 计算与权衡
电阻值选多大?这需要算一算。我一般从两个角度考虑:
4.4.1 从功耗角度
当按键按下时,电流从 VCC 经过上拉电阻、按键、二极管流到 GND。这个电流不能太大,否则浪费电,而且可能烧坏 IO 口。
公式很简单:
I = (VCC - V_diode) / R_pullup
假设 VCC = 3.3V,V_diode = 0.7V,我们希望电流不超过 1mA:
R_pullup > (3.3 - 0.7) / 0.001 = 2600 Ω
所以,上拉电阻至少 2.7kΩ。我常用 4.7kΩ 或 10kΩ,功耗更小。
4.4.2 从响应速度角度
上拉电阻和列线的寄生电容会形成一个 RC 低通滤波器。电阻越大,上升时间越长,按键响应就越慢。
上升时间公式:
t_rise ≈ 2.2 × R × C
假设列线寄生电容 C = 20pF,R = 10kΩ:
t_rise ≈ 2.2 × 10k × 20p = 440 ns
这个速度对于按键扫描(通常几毫秒一次)来说绰绰有余。但如果你的扫描频率很高(比如 1MHz),那就要选小一点的电阻,比如 1kΩ。
我的经验值: 对于大多数游戏机按键应用,4.7kΩ 或 10kΩ 是最稳妥的选择。功耗低、响应快、兼容性好。
4.5 避坑指南
我曾经犯过的错:
- 上拉电阻选太大(100kΩ以上):结果按键按下后,电平下降很慢,单片机误判为“长按”。
- 二极管方向接反:电流根本流不过去,按键完全没反应。检查了半天才发现是二极管装反了。
- 忘记加二极管:出现鬼键,按一个键触发三个键。加了二极管后一切正常。
4.6 完整电路示例
下面是一个 2×2 矩阵的完整电路图(文字描述版):
VCC (3.3V)
│
├─[R_pullup 4.7kΩ]─── Col1
├─[R_pullup 4.7kΩ]─── Col2
│
Row1 ──┬── [按键] ── [二极管] ── Col1
└── [按键] ── [二极管] ── Col2
Row2 ──┬── [按键] ── [二极管] ── Col1
└── [按键] ── [二极管] ── Col2
注意:二极管的方向是阳极接按键侧,阴极接列线侧。
4.7 小结
嗯,这一节内容不少,但核心就两句话:
- 二极管:防串扰,每个按键一个,用 1N4148 就行。
- 上拉电阻:默认拉高电平,选 4.7kΩ 或 10kΩ,兼顾功耗和速度。
下一节我们会讲如何用单片机实际驱动这个矩阵,包括 IO 口的配置和扫描时序的编写。到时候你会看到,硬件设计好了,软件写起来就特别顺畅。