第4章:PWM信号生成——用analogWrite()模拟蜜蜂的“持续时间”编码
各位同学,欢迎来到第四章。上一章我们聊了蜜蜂怎么用舞蹈的“角度”传递方向信息,这一章我们聚焦另一个核心参数——持续时间。
蜜蜂跳舞时,腹部摇摆的持续时间越长,代表蜜源越远。在电子世界里,我们用什么来模拟这个“持续时间”呢?答案就是——PWM(脉冲宽度调制)。
4.1 什么是PWM?说白了就是“方波的占空比”
PWM,全称Pulse Width Modulation。名字听着唬人,其实原理很简单:
你有一个方波信号,高电平持续的时间占整个周期的比例,就叫占空比。
举个例子:
一个周期是10ms的方波,如果高电平占了3ms,那占空比就是30%。
如果高电平占了7ms,占空比就是70%。
蜜蜂的“持续时间”编码,说白了就是不同长度的“高电平时间”。
占空比越大,代表蜜蜂腹部摇摆的时间越长,蜜源越远。
占空比 = (高电平时间 / 周期) × 100%
在蜜蜂舞蹈中:占空比 ≈ 蜜源距离(正相关)
4.2 Arduino的analogWrite()——你以为是模拟,其实是PWM
很多初学者第一次看到analogWrite()这个函数,会以为它输出的是真正的模拟电压(比如0~5V连续可调)。
其实不是。它输出的是固定频率、可变占空比的方波。
我个人习惯把analogWrite()叫做“伪模拟输出”。
它真正的能力是:在指定引脚上产生一个频率约490Hz(部分引脚约980Hz)的PWM信号。
函数原型很简单:
analogWrite(pin, value);
其中value的范围是0~255:
analogWrite(pin, 0)→ 占空比0%,一直低电平analogWrite(pin, 127)→ 占空比约50%analogWrite(pin, 255)→ 占空比100%,一直高电平
嗯,这里要注意:analogWrite()只能在支持PWM的引脚上使用。Arduino Uno上,这些引脚通常标记为“~”符号(3、5、6、9、10、11)。
刚学Arduino时,我把
analogWrite()用在了普通数字引脚(比如Pin 2)上,结果什么反应都没有。查了半天手册才发现——不是所有引脚都支持PWM!所以,写代码前先确认引脚编号。
4.3 用PWM模拟蜜蜂舞蹈的“持续时间”编码
蜜蜂舞蹈中,腹部摇摆的持续时间与蜜源距离的关系大致如下:
| 蜜源距离(米) | 摇摆持续时间(秒) | 对应PWM占空比(近似) |
|---|---|---|
| 100 | 0.5 | 20% |
| 500 | 1.0 | 40% |
| 1000 | 1.5 | 60% |
| 2000 | 2.0 | 80% |
| 3000 | 2.5 | 100% |
你想想看,如果我们用LED的亮度来代表“持续时间”,那占空比越大,LED越亮,就代表蜜源越远。是不是很直观?
4.4 实战代码:用PWM控制LED亮度模拟蜜蜂舞蹈
下面这个例子,我会让LED的亮度按照蜜蜂舞蹈的“持续时间”编码变化:
// 蜜蜂舞蹈持续时间编码 - PWM模拟
// 使用Arduino Uno,LED接在Pin 9(PWM引脚)
int ledPin = 9; // PWM引脚
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("蜜蜂舞蹈持续时间编码演示");
}
void loop() {
// 模拟不同距离的蜜源
// 距离越远,占空比越大(LED越亮)
// 蜜源距离100米 → 占空比20%
analogWrite(ledPin, 51); // 255 * 20% ≈ 51
delay(2000); // 保持2秒,模拟舞蹈持续时间
// 蜜源距离500米 → 占空比40%
analogWrite(ledPin, 102); // 255 * 40% ≈ 102
delay(2000);
// 蜜源距离1000米 → 占空比60%
analogWrite(ledPin, 153); // 255 * 60% ≈ 153
delay(2000);
// 蜜源距离2000米 → 占空比80%
analogWrite(ledPin, 204); // 255 * 80% ≈ 204
delay(2000);
// 蜜源距离3000米 → 占空比100%
analogWrite(ledPin, 255); // 255 * 100% = 255
delay(2000);
}
运行这段代码,你会看到LED的亮度从暗到亮循环变化。每个亮度持续2秒,模拟蜜蜂舞蹈中不同持续时间的摇摆。
如果你想让变化更平滑,可以用
for循环让占空比从0逐渐增加到255,再逐渐减小。这样看起来就像蜜蜂在“慢慢加速摇摆”一样,更贴近真实舞蹈。
4.5 用示波器看PWM信号——眼见为实
我在项目中遇到过很多次,代码写好了,LED也亮了,但总觉得“心里没底”。
这时候,我会拿出示波器,直接看引脚上的波形。
把示波器探头接到Pin 9和GND之间,你会看到:
- 频率约490Hz的方波
- 高电平宽度随
analogWrite()的值变化 - 占空比精确对应你设定的数值
没有示波器怎么办?
可以用一个LED加电阻,通过人眼观察亮度变化。虽然不够精确,但足够验证原理。
4.6 本章知识体系图
下面这张SVG图,帮你理清PWM与蜜蜂舞蹈“持续时间”编码的关系:
4.7 避坑指南与个人经验
最后,分享几个我这些年积累的经验:
- 引脚别搞错:不是所有引脚都支持PWM。用之前查一下板子的引脚图。
- 频率是固定的:Arduino的
analogWrite()频率是固定的(490Hz或980Hz),不能通过这个函数调整频率。如果需要调频,得用定时器自己生成PWM。 - 占空比精度:0~255的分辨率对于大多数应用足够了。但如果你需要更精细的控制,可以考虑用16位定时器。
- 负载能力:Arduino引脚输出电流有限(约40mA)。驱动LED没问题,但驱动电机或大功率器件,必须加驱动电路。
PWM信号通过改变占空比,模拟了蜜蜂舞蹈中“持续时间”的变化。
analogWrite()是Arduino上最方便的PWM生成方式,但要注意引脚支持和频率限制。下一章,我们会把“角度”和“持续时间”结合起来,完整模拟蜜蜂的“8字舞”。
公众号:蓝海资料掘金营,微信deep3321