- 引言 —— 把 LED 直接插到 5V 上,究竟会发生什么
- LED 是二极管,不是电阻
- 正向电压因颜色而异
- 计算电阻值 —— 分别在 5V 和 3.3V 下
- 为什么要向上取整 —— E24 系列与标准电阻值
- 电阻上消耗的功率与额定值
- 多颗 LED —— 为什么并联共用一个电阻是个坏主意
- 引脚扛不住时 —— 晶体管与驱动 IC
- 结语 —— 计算的起点永远是余量电压
引言 —— 把 LED 直接插到 5V 上,究竟会发生什么
「LED 要接电阻」这句话随处可见。但为什么要接、为什么是 220 欧姆、蓝色 LED 是不是也用 220 欧姆,这些解释却很少见到。结果就是照抄一张写着 220 欧姆的电路图。
问题就出在这里。在 5V 的 Arduino 上用 220 欧姆好好工作的电路,搬到 3.3V 的树莓派上就变暗了。把红色 LED 换成蓝色 LED,直接就不亮了。因为只是照抄,根本不知道该改什么。
这篇文章的目标,是让你能够算出 220 欧姆这个数字究竟是怎么来的。这样一来,不管电源变了还是颜色变了,都能自己求出对应的值。
先精确地看看不接电阻会发生什么。把一颗红色 LED 直接接在 5V 和 GND 之间,LED 两端就承受 5V。这颗 LED 正常工作时两端的电压大约是 2.0V,剩下 3.0V。这 3.0V 会落在 LED 内部那一点点电阻成分上,其阻值大约是 10 欧姆。
电流 = 3.0V / 10欧姆 = 0.3A = 300mA
300mA。这颗 LED 被设计成能承受的电流是 20mA。多了 15 倍。LED 芯片本身边长大约 0.3mm,其内部消耗的功率是:
P = 5V × 0.3A = 1.5W
1.5W。比火柴头还小的一片半导体承受着 1.5W。结温瞬间飙升到几百摄氏度,连接芯片和引脚的金线要么熔化,要么结区本身受损。这就是「亮一下就灭了」背后的物理真相。它不像软件那样可以撤销。
LED 是二极管,不是电阻
要理解为什么会这样,得先明白 LED 和电阻是本质完全不同的两种元件。
电阻的电压和电流成正比。加 5V 就会流过 1V 时的五倍电流。画成图是一条直线。
LED 是二极管,二极管的电流随电压呈指数增长。这个关系被称为肖克利二极管方程,但实务中要掌握的不是方程本身,而是它带来的结果。
实测一颗典型的 5mm 红色 LED,大致会得到这样的数值:
| 施加的电压 | 流过的电流 | 相对上一档 |
|---|---|---|
| 1.7V | 约0.5mA | 基准 |
| 1.8V | 约2mA | 4倍 |
| 1.9V | 约6mA | 3倍 |
| 2.0V | 约20mA | 3.3倍 |
| 2.1V | 约60mA | 3倍 |
| 2.2V | 约150mA | 2.5倍 |
电压只提高了 0.1V,也就是 5%,电流却变成了三倍。这就是指数函数的性质。
从这张表能得出两个结论。
第一,直接给 LED 指定电压几乎是不可能的。要把目标电流精确定在 20mA,就必须把电压精确定在 2.00V,可只要变成 2.05V,电流就几乎翻倍。电源的误差、温度的变化、个体之间的差异,全都在这个量级上。想用电压去控制 LED,这个思路从一开始就不成立。
第二点更危险:LED 无法保护自己。温度每升高 1 摄氏度,正向电压大约下降 2mV。也就是说,越热,同样的电压下流过的电流就越多。电流越多,又会更热。这个反馈回路没有任何东西能踩下刹车。
所以解法是换个方向。不去指定电压,而是指定电流。设定电流最简单、最可靠的元件就是串联电阻。因为电阻是电压和电流成正比的线性元件,一旦电流想要增大,电阻两端的电压就会跟着变大,LED 分到的电压随之减小,电流又被压回去。电阻既是限流器件,同时也是负反馈器件。
正向电压因颜色而异
LED 要发光,电压必须超过半导体的带隙能量,而这个能量恰恰决定了发出光的颜色。波长更短的光——也就是蓝光——需要更大的能量,所以正向电压更高。颜色和电压不是各自独立的两件事,而是同一个物理量的两面。
实务中常用的代表值如下。个体之间存在差异,有数据手册就优先参考手册;没有的话,用这些值来计算通常也是安全的。
| 颜色 | 代表正向电压 | 实际分布范围 | 半导体材料 |
|---|---|---|---|
| 红色 | 2.0V | 1.8~2.2V | AlGaAs、GaAsP |
| 黄色 | 2.1V | 2.0~2.4V | AlGaInP |
| 黄绿色(旧款) | 2.2V | 2.0~2.4V | GaP |
| 纯绿色(高亮度) | 3.2V | 2.9~3.6V | InGaN |
| 蓝色 | 3.2V | 2.9~3.6V | InGaN |
| 白色 | 3.2V | 2.9~3.6V | InGaN + 荧光粉 |
| 红外(IR) | 1.3V | 1.2~1.5V | GaAs |
这里有一个实务上最重要的分界。绿色 LED 其实有两种。老款的黄绿色系是 2.2V,而现在常见的高亮度纯绿色和蓝色一样是 InGaN 材料,所以是 3.2V。两者外观相近,如果用同一个值去算,结果会严重偏离。拿不准的时候,最快的办法是用万用表的二极管测试功能直接测量——表上显示的值就是那颗 LED 的正向电压。
把 3.2V 这个数字和 3.3V 的板子放在一起看,问题马上就浮现出来了。这一点会在下一节用计算来验证。
计算电阻值 —— 分别在 5V 和 3.3V 下
公式就是上一篇文章里欧姆定律的原样套用:用电阻两端的电压除以目标电流。
电阻 = (电源电压 - LED正向电压) / 目标电流
把分子称为余量电压。LED 拿走属于自己的那一份,也就是正向电压,剩下的才是电阻的份额。
目标电流该定多少?常见 5mm LED 的最大额定值是 20mA。按最大额定值设计意味着余量是 0,实务中把目标定在 15mA 左右更安全,亮度上的差异肉眼几乎分辨不出来。本站的接线验证工具也是以 15mA 为基准来建议电阻值的。
5V 电源、红色 LED
余量电压 = 5V - 2.0V = 3.0V
电阻 = 3.0V / 0.015A = 200欧姆
正好算出 200 欧姆——这个值就在后面要讲的标准值列表里。
按 20mA 计算则是:
电阻 = 3.0V / 0.02A = 150欧姆
150 欧姆同样是标准值。而常用的 220 欧姆,就落在这两者之间某个比较宽裕的位置。用 220 欧姆时,实际电流是:
电流 = 3.0V / 220欧姆 = 0.0136A = 13.6mA
13.6mA,足够亮,也非常安全。这就是新手套件里塞满 220 欧姆电阻的原因——它不是错误的值,而是偏向安全一侧的值。
3.3V 电源、红色 LED
余量电压 = 3.3V - 2.0V = 1.3V
电阻 = 1.3V / 0.015A = 86.7欧姆
86.7 欧姆,跟 5V 时的 200 欧姆完全不是一回事。原因是余量电压从 3.0V 降到了 1.3V。电源电压只降低了 34%,电阻值却降低了 57%。正是这种非线性,造成了「同一个电路搬到树莓派上就变暗了」的现象。如果继续沿用为 5V 算出来的 200 欧姆,
电流 = 1.3V / 200欧姆 = 0.0065A = 6.5mA
只有 6.5mA,不到目标的一半。不是电阻错了,而是电源变了,就必须重新计算。
3.3V 电源、蓝色 LED —— 计算结果不成立的情形
余量电压 = 3.3V - 3.2V = 0.1V
电阻 = 0.1V / 0.015A = 6.67欧姆
数字是算出来了,但这个电路不该使用。原因是余量电压只有 0.1V。
前面提到过,正向电压的个体差异范围是 2.9V 到 3.6V。如果这颗 LED 恰好是 3.4V,余量电压就会变成负数,根本不会亮。如果恰好是 3.0V,余量电压就变成 0.3V,电流会跳到三倍。哪怕 3.3V 电源轨只是略微跌到 3.25V,亮度也会减半。也就是说,这个电路完全受制于元件个体差异和电源波动。
解决方案有三选一:改用 5V 电源轨驱动 LED、只用 3.3V 控制信号;换一种正向电压更低的颜色;或者使用能主动维持电流恒定的恒流驱动器。原则是,一旦余量电压跌破电源电压的 20%,就应该重新考虑用单个电阻来处理这件事。
计算结果汇总
| 电源 | 颜色 | 正向电压 | 余量电压 | 按15mA算出的值 | 应选的标准值 | 实际电流 |
|---|---|---|---|---|---|---|
| 5V | 红色 | 2.0V | 3.0V | 200欧姆 | 200欧姆 | 15.0mA |
| 5V | 黄色 | 2.1V | 2.9V | 193.3欧姆 | 200欧姆 | 14.5mA |
| 5V | 黄绿色 | 2.2V | 2.8V | 186.7欧姆 | 200欧姆 | 14.0mA |
| 5V | 蓝色/白色 | 3.2V | 1.8V | 120欧姆 | 120欧姆 | 15.0mA |
| 3.3V | 红色 | 2.0V | 1.3V | 86.7欧姆 | 91欧姆 | 14.3mA |
| 3.3V | 黄色 | 2.1V | 1.2V | 80.0欧姆 | 82欧姆 | 14.6mA |
| 3.3V | 黄绿色 | 2.2V | 1.1V | 73.3欧姆 | 75欧姆 | 14.7mA |
| 3.3V | 蓝色/白色 | 3.2V | 0.1V | 6.67欧姆 | 不适用 | 不稳定 |
表格最后两列是这篇文章的另一半内容。需要弄清楚计算值和实际能买到的电阻值为什么不同,以及为什么永远要往大的那个方向靠。
为什么要向上取整 —— E24 系列与标准电阻值
没有人卖 86.7 欧姆的电阻。电阻不是任意阻值都会生产,只有落在一份固定列表上的值才会真正被制造出来。这份列表叫做 E 系列。
E24 系列把一个数量级分成 24 档,由以下数值及其 10 倍、100 倍、1000 倍构成:
1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0
3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1
所以实际存在的值是 82 欧姆、91 欧姆、100 欧姆、110 欧姆这类数字,86.7 欧姆并不在其中。
这个间距为什么这样定,原因很有意思。相邻数值之间的比例大约是 1.1 倍,也就是相差约 10%。而 E24 电阻的标准误差是 5%。也就是说,这是一个精心设计的等比数列,让每个值的误差范围既不与相邻值重叠,也不留下空隙。更细密的 E96 系列对应的是误差 1% 的元件。在对数刻度上均匀切分,这和确定音频音量档位或图像缩放级别时用的是同一个原理。
现在是关键问题了:当计算值不在列表上时,应该向上取整还是向下取整?
必须向上取整。 原因是电阻越大,电流就越小。把 86.7 欧姆向下调到 82 欧姆,
电流 = 1.3V / 82欧姆 = 0.0159A = 15.9mA
流过的是比目标更大的 15.9mA。向上调到 91 欧姆,
电流 = 1.3V / 91欧姆 = 0.0143A = 14.3mA
是比目标更小的 14.3mA。亮度上的差异看不出来,而电流落在了安全的一侧。
这个原则在引脚电流上限那里会变得至关重要。树莓派一个 GPIO 引脚允许的电流是 16mA。用 82 欧姆算出来是 15.9mA,离上限只剩 0.1mA 的余量。如果再叠加元件个体差异——比如这颗 LED 的正向电压恰好是 1.9V,余量电压就变成 1.4V,
电流 = 1.4V / 82欧姆 = 0.0171A = 17.1mA
就超限了。换成 91 欧姆,同样条件下是 15.4mA,依然在范围之内。向上取整的这一步,创造出的正是这份余量。
如果电路已经接好,想快速确认这笔计算对不对,可以把板子、元件和电阻值输入本站的接线验证工具。它遵循同样的规则,从 E24 系列里选择偏大的那个值来建议,并且会告诉你所选电阻下实际流过的电流是否超过了引脚上限。
电阻上消耗的功率与额定值
电阻会把相当于余量电压那部分能量以热的形式扔掉。算清楚扔掉多少,就知道该买哪种电阻了。
5V、红色 LED、200 欧姆的情形:
电阻两端的电压 = 3.0V
流过的电流 = 15mA
消耗的功率 = 3.0V × 0.015A = 0.045W = 45mW
45mW。就算是最常见的 1/4W(250mW)电阻,也只用到额定值的 18%,非常宽裕。
3.3V、红色 LED、91 欧姆的情形:
消耗的功率 = 1.3V × 0.0143A = 0.0186W = 18.6mW
更少了。这就是 3.3V 电路在散热上更占优势的原因。
那是不是 LED 电阻永远用 1/4W 就够了?一旦电源电压升高,情况就不一样了。假设在 12V 的照明电路里,用 20mA 点亮一颗红色 LED:
余量电压 = 12V - 2.0V = 10.0V
电阻 = 10.0V / 0.02A = 500欧姆 → E24 标准值 510欧姆
消耗功率 = 10.0V × 0.02A = 0.2W = 200mW
200mW。这已经占到 1/4W 电阻 250mW 额定值的 80%。前一篇文章提到过要控制在额定值一半以下的标准,这里已经超过了,所以正确做法是用 1/2W 的电阻。
而这个计算也会改变 12V 电路的整体设计思路。把 10V 以热的形式扔在电阻上,意味着浪费了所供电力的 83%。所以在 12V 下,通常会把多颗 LED 串联起来,以缩小余量电压。把五颗红色 LED 串联:
LED电压合计 = 2.0V × 5 = 10.0V
余量电压 = 12V - 10.0V = 2.0V
电阻 = 2.0V / 0.02A = 100欧姆
消耗功率 = 2.0V × 0.02A = 0.04W = 40mW
同样是 20mA,点亮了五颗 LED,电阻的损耗却只有原来的五分之一。串联时电流是共用的,所以五颗灯的亮度完全一致。处理多颗 LED 时优先考虑串联,原因就在这里。
多颗 LED —— 为什么并联共用一个电阻是个坏主意
如果串联好,那并联呢?电路图里经常能看到三颗 LED 并排、共用一个电阻的接法。因为用的元件更少,看上去很诱人。但绝对不能这样接。
原因就是前面看到的那条指数曲线。三颗并联的 LED,两端电压会被强制拉成相同的值。但三颗 LED 的正向电压永远不会真正相等——哪怕是同一袋里出来的元件,也可能相差 0.05V 左右。
用数字确认一下。5V 电源接一个 150 欧姆电阻,三颗 LED 并联,正向电压分别恰好是 1.95V、2.00V、2.05V:
三颗 LED 两端的电压必须相等,而这个值大致会落在最低的 1.95V 附近。电阻两端的电压就是:
5V - 1.95V = 3.05V
总电流 = 3.05V / 150欧姆 = 0.0203A = 20.3mA
这 20.3mA 的总电流由三颗灯分摊,再回头看前面的指数表:1.95V 时流过的电流大约只有 2.00V 时的三分之一。反过来说,正向电压最低的那颗 LED 会独占电流。实测下来,大致会得到这样的分配:
| LED | 正向电压 | 实际流过的电流 | 占比 |
|---|---|---|---|
| A | 1.95V | 约15mA | 74% |
| B | 2.00V | 约4mA | 20% |
| C | 2.05V | 约1mA | 5% |
三颗灯的亮度肉眼可见地不一样。这已经算失败了,但更糟的还在后面。
独占了电流的 A 会变得最热。温度每升高 1 度,正向电压就下降约 2mV。A 的温度升高 25 度,正向电压就会再降低 0.05V,于是 A 又抢走更多电流。越热,电压越低,又抢走更多电流。这就是热失控。最终 A 会先烧毁,A 一死,剩下的全部电流就会涌向 B,B 也随之陷入危险。
正确的接法是每颗 LED 各配一个电阻。三个电阻各自独立决定每条支路的电流,即使存在个体差异,电流也不会被拉得太开。有了电阻,一旦 A 试图多抢电流,A 那一侧电阻两端的电压就会变大,自动踩下刹车。为了省一个电阻而搭上一颗 LED,这笔交易无论怎么看都是亏的。
引脚扛不住时 —— 晶体管与驱动 IC
LED 数量一多,就会撞上和电阻计算不同的另一堵墙:引脚能输出的电流上限。
这个上限分两层:单个引脚的上限,以及所有引脚加起来的总上限。两者都必须遵守。
| 板子 | 逻辑电压 | 单引脚上限 | GPIO 总上限 | 能带多少颗15mA的LED |
|---|---|---|---|---|
| Arduino Uno R3 | 5V | 20mA(绝对最大40mA) | 200mA | 13颗 |
| 树莓派40针 | 3.3V | 16mA | 50mA | 3颗 |
| ESP32 DevKit v1 | 3.3V | 12mA | 120mA | 10颗(单颗目标电流降到12mA) |
最后一列是只按总上限算出的数量。因为 ESP32 单引脚上限是 12mA,所以每颗 LED 的目标电流要降到 12mA,这样总量 120mA 才能分给十颗灯。单引脚上限和总上限,哪个先被触发,哪个就是真正的上限。
再看一遍树莓派的数字。单引脚 16mA 对一颗 LED 绰绰有余,但总量只有 50mA。点亮四颗 15mA 的 LED,总电流就已经是 60mA,超限了。引脚有 40 个,但 LED 只能带三颗。
总上限之所以存在,是有物理原因的。每个引脚的输出晶体管都连接到芯片内部的公共电源走线上,这条走线连同芯片的键合线、封装引脚,必须共同承受总电流。即便每个引脚单独看都在规格之内,一旦总量超标,这条公共通路就会过热。而且芯片内部电源走线的电阻会造成压降,让同一块芯片上的其他电路变得不稳定。
一旦超过上限,就必须放弃用引脚直接驱动 LED。这时有三个选择。
用晶体管来开关
引脚只负责发信号,电流则直接从电源轨获取。用逻辑电平 MOSFET 或小信号晶体管来做开关。
如果用 BJT,就需要计算基极电阻。假设要开关八颗 LED,每颗 15mA,总共 120mA。要让 2N3904 这类小信号晶体管进入饱和区,电流放大倍数留出充足余量,按大约 10 来估算。
所需基极电流 = 120mA / 10 = 12mA
基极电阻 = (5V - 0.7V) / 0.012A = 358欧姆
从 E24 系列中选偏小的那个值,330 欧姆:
实际基极电流 = (5V - 0.7V) / 330欧姆 = 0.013A = 13mA
13mA,在引脚 20mA 的上限之内。这里要注意,基极电阻的取整方向和 LED 电阻正好相反,是向下取整。基极电流不够,晶体管就无法完全导通,会在自身上消耗功率并发热。目的不同,取整方向也就不同。
0.7V 是基极与发射极之间的压降,是硅结的特性值,计算时必须减去,才能得到实际落在电阻上的电压。
使用驱动 IC
像 ULN2803 这样的驱动阵列,把八个通道的达林顿晶体管封装进一块芯片。每个通道能处理到 500mA,输入端只需要从单片机引脚吸取大约 1mA。搭配 74HC595 移位寄存器,三个引脚就能控制八个或十六个输出。
这里要注意方向。ULN2803 是只灌电流(sink-only)的:它的输出引脚只会把电流拉向 GND,不会向外推送。所以 LED 的正极要接到电源轨,负极接到驱动器的输出端。如果按拉电流的方式接线,代码怎么改都不会亮。
换成专用 LED 驱动器
当 LED 数量达到几十颗以上,或者需要单独控制亮度时,恒流驱动器才是答案。像 WS2812B 这种在每颗 LED 里都内置了控制器的元件是典型代表,这时电流计算的性质会发生变化。一颗 WS2812B 把三色都点到最亮时耗电 60mA。对于 30 颗的灯带来说,
60mA × 30 = 1800mA = 1.8A
1.8A。Arduino 的 5V 电源轨上限是 450mA,直接从板子取电根本不可能,必须用单独的电源,这个话题会引到讲电机和感性负载的那篇文章。
PWM 不是减小电流的方法
如果目的是调光,该用的是 PWM,而不是加大电阻。但 PWM 并不会减小 LED 导通瞬间的电流,它只是通过改变通断的比例来调节平均亮度。
// 让LED的亮度平滑地升高和降低。
// 电阻依然是200欧姆,导通瞬间的电流依然是15mA不变。
// PWM只改变导通时间所占的比例。
const int LED_PIN = 9; // Uno上支持PWM的引脚
const int STEP_DELAY_MS = 8;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// 占空比从0到255。255表示一直导通。
for (int duty = 0; duty <= 255; duty++) {
analogWrite(LED_PIN, duty);
delay(STEP_DELAY_MS);
}
for (int duty = 255; duty >= 0; duty--) {
analogWrite(LED_PIN, duty);
delay(STEP_DELAY_MS);
}
}
计算引脚电流预算时,必须按最大瞬时电流来算,而不是按 PWM 占空比。不能因为占空比是 50%,就按 7.5mA 来算。导通的那一瞬间,15mA 会照样流过,引脚输出晶体管必须承受的正是那个瞬时值。
结语 —— 计算的起点永远是余量电压
LED 电阻计算要记住的其实只有一句话:用电源电压减去 LED 的正向电压,再用剩下的部分除以想要的电流。
这一句话不管电源电压怎么变、颜色怎么变都始终成立。与其死记 220 欧姆,不如记住这个减法和除法。
而且每次看到这个减法的结果,也就是余量电压时,最好养成顺手确认一件事的习惯:这个值相对于电源电压是不是太小了。就像 3.3V 接蓝色 LED 那种情况,余量只剩 0.1V 时,不管电阻值算得多精确,电路都会完全暴露在元件个体差异和电源波动之下。余量电压既是计算所需的原料,也是这个设计是否稳健的一个指标。
下一篇文章会转向输入这一侧:按钮接到引脚上、数值却随意变化的现象——也就是悬空输入和上拉电阻的话题。
현재 단락 (1/171)
「LED 要接电阻」这句话随处可见。但为什么要接、为什么是 220 欧姆、蓝色 LED 是不是也用 220 欧姆,这些解释却很少见到。结果就是照抄一张写着 220 欧姆的电路图。