呼吸灯真的改变了输出电压吗?|单片机动画课 05

课程插图

上一课让灯按时间翻转。现在把变化做得很快,灯就能看起来一直亮;再慢慢调整每次亮着的时间,就能形成呼吸效果。

这时,输出引脚是不是从 1V 平滑升到 2V、3V?对于本课讨论的普通数字 PWM 输出,答案是否定的。它主要改变的是高电平占用的时间比例。

本课以 Uno R3 的 PWM 引脚为例,采用高电平点亮的限流 LED 电路。GIF 是放慢的理想波形示意,非芯片仿真、非示波器实测;灯的颜色深浅只表达相对亮度。

先把一次重复看清楚

PWM 是脉冲宽度调制。我们把一个不断重复的时间片叫周期 T。周期内,高电平持续的时间叫高电平时间,通常记作 Ton。

同一个周期内,高电平和低电平分别占用时间

看橙色游标:先经过高电平段,再经过低电平段,然后进入下一周期。波形的上下高度没变,改变宽度才是今天的重点。

占空比 D 等于 Ton 除以 T。一个周期中有四分之一时间为高,就是 25%;一半时间为高,就是 50%。频率则是每秒重复多少个周期,等于 1/T。两个概念相关,却不能互相替代。

这张图的纵轴只标 HIGH 和 LOW,因为真实电压要由芯片供电、输出级和负载决定。它们也不是永远精确等于电源电压与零,理想方波省略了上升下降过程。

高电平变宽,灯为什么更亮?

保持周期不变,把高电平段从 25% 加到 50%,再加到 75%。在合适的电路和频率下,LED 每周期发光的时间增加,人眼感受到的亮度通常也随之增加。

频率固定,占空比从小到大再回落

注意动画里的灯并没有按照放慢后的方波一闪一闪。它展示的是快速重复时的相对视觉效果;波形则特意放慢给你看,两者不是同一播放时间尺度。

在理想高低电平模型里,平均电压可以写成:D×高电平电压+(1−D)×低电平电压。但“平均约一半”不等于引脚时时刻刻都输出一半电压。接示波器和接万用表,也可能看到不同意义的读数。

LED 亮度感知、器件特性都不是严格线性的。所以占空比从 25% 变为 50%,不能直接保证你感觉“亮了整整一倍”。本课用颜色明暗表示趋势,不把它当作光学测量结果。

频率和占空比可以分别改变

再看第三张:两条波形都是 50%,下面那条在同样时间里重复了更多次。占空比相同,频率不同。

同样是百分之五十,高低电平可以切换得更快

频率过低时可能看出闪烁;频率很高也不代表任何负载都适合。电机、蜂鸣器、照明电路对频率有不同要求,不能从呼吸灯直接推导所有应用。真实效果还可能受到相机快门和观察方式影响。

在 Uno R3 上,可以对支持 PWM 的 D9 使用这个示意调用:

analogWrite(9, 128);  // 请求大约一半占空比

这里不是“输出 128 伏”,也不是调用一次只发出一个脉冲。配置完成后,相关硬件持续产生 PWM,直到设置被改变或停止。0~255 是这个 Arduino API 在该板上的常用数值范围,不是所有芯片外设的统一规格。

ESP32 常用 LEDC 外设产生 PWM,配置方式、分辨率以及可达到的频率组合都有自己的约束。换板时,应查对应版本的核心文档,不能只把引脚数字换一下。

一个常见误区

函数名字叫 analogWrite,并不保证底层一定有真正的数模转换器。有的板子在特定引脚支持 DAC,有的通过 PWM 实现;本课说的是 Uno R3 的普通 PWM 输出。

看完再猜

如果周期固定,把高电平宽度也固定住,灯还会自己“呼吸”吗?

不会。呼吸需要程序随时间调整占空比,PWM 只是负责快速重复当前设置。下一课把方向反过来:外面送进来一个电压,单片机怎样把它变成数字?

资料:Arduino PWM 基础、Arduino AVR 模拟输出实现、Espressif LEDC 文档。

发现更多好玩的开源项目

专注 Arduino、开源硬件、端侧 AI 和值得收藏的开发者工具。

课程插图

长按二维码关注「GitStar」

所有动画为教学原理示意,非芯片仿真、非硬件实测。网页发布:2026-09-21。