第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与蜜蜂舞蹈“持续时间”编码的关系:

PWM信号生成与蜜蜂舞蹈“持续时间”编码 蜜蜂舞蹈 腹部摇摆持续时间 ↓ 编码 蜜源距离信息 模拟 PWM信号 analogWrite(pin, value) 占空比 0% ~ 100% 频率约490Hz 输入参数 蜜源距离 → 占空比 100m → 20% 硬件实现 Arduino PWM引脚 LED亮度变化 验证工具 示波器看波形 人眼观察亮度 核心逻辑:蜜蜂摇摆持续时间 → 占空比 → LED亮度 → 蜜源距离

4.7 避坑指南与个人经验

最后,分享几个我这些年积累的经验:

  • 引脚别搞错:不是所有引脚都支持PWM。用之前查一下板子的引脚图。
  • 频率是固定的:Arduino的analogWrite()频率是固定的(490Hz或980Hz),不能通过这个函数调整频率。如果需要调频,得用定时器自己生成PWM。
  • 占空比精度:0~255的分辨率对于大多数应用足够了。但如果你需要更精细的控制,可以考虑用16位定时器。
  • 负载能力:Arduino引脚输出电流有限(约40mA)。驱动LED没问题,但驱动电机或大功率器件,必须加驱动电路。
本章小结:
PWM信号通过改变占空比,模拟了蜜蜂舞蹈中“持续时间”的变化。
analogWrite()是Arduino上最方便的PWM生成方式,但要注意引脚支持和频率限制。
下一章,我们会把“角度”和“持续时间”结合起来,完整模拟蜜蜂的“8字舞”。

公众号:蓝海资料掘金营,微信deep3321