电子入门教程[02]—会呼吸的光

电子入门教程[02]—会呼吸的光

在浏览此文之前,可能你需要先康康这个:

电子入门教程[01]—我的代码流成了灯

这期我们来讲讲我们最常见的———— 呼吸灯

前言

上一节 里我们学会了控制一串流水灯,学会了单片机中最基础,也是最重要的 "逻辑控制"
这一期,我们来学习基于 PWM(脉冲宽度调制) 的呼吸灯,让LED“平滑地”从明到暗变化。
其实大家都见过呼吸灯,有的手机有这么一个功能:当有未读通知时屏幕某处的灯会忽闪忽灭的。

Step1: 光的积分(喵喵喵???)

我们先来做个思想实验。

我们在日常生活中所使用的光源多数看起来是亮度不变或者变化不大的。现假想有一盏灯,它亮1秒,灭1秒,如此反复循环,持续5个周期(10s),那么它周围的环境接收到的光照,应该就等于这盏灯一直亮5s的光照。

现在我们让这盏灯的亮灭转换频率高一点,让它每1毫秒(1ms)转换一次状态,由于此时它的亮灭状态变化非常之快,以至于人眼无法分辨出它每时每刻的状态,看上去就像是一直亮着,但是没有它应该有的那么亮(视觉暂留效应),那么这盏灯在我们的认知里表现出来的就是 “变暗了” ,这个现象就像数学里的积分一样。

说到这里,你能猜出呼吸灯的原理了吗?

Step2: 亮灭信号的表现形式

没猜出来也不要紧( •̀ ω •́ )✧

一个方方正正的波

我们来画个图8


nBmede.jpg

我们用1来表示灯亮,0表示灯灭,这是最简单的数字逻辑。

现在我们把它转换成电平信号,LED灯有正负极,负极接电源负极(接电路参考地,以后简称接地),LED正极接高电平(电源正极)时(1),灯亮,而LED正极接地(0)时,灯两端没有电压,则LED没有足够的电压使它导通,灯不会亮。

上图所表现的是灯在1和0两个状态不断地切换,并且每一个状态的持续时间相同,对应的,这个电信号叫做 方波 ,同时它也是一个 占空比(Duty Ratio/Duty Cycle) 为50%的方波。

Step3: 占空比的魔法

占空比 是指在一串理想的脉冲序列中(如方波),代表1的正脉冲的持续时间与脉冲总周期的比值

观察以下的动图,是不是很easy易懂?(/▽\)


nBut8s.gif

  • 当占空比为0%时,高电平所占整个周期的时间为0%,体现为永恒的低电平信号(相当于接地)。
  • 当占空比为50%时,就成了上上图的标准方波。
  • 当占空比为100%时,体现为永恒的高电平信号(相当于接电源正极)。

现在假设我们用一个占空比为10%的信号A和占空比为90%的信号B 来控制LED的亮度 ,想必你应该知道实验结果了o( ̄▽ ̄)o

Step4: 二营长,你tnd Arduino给lz拉上来!

在Arduino语言体系里,想要输出PWM信号,需使用analogWrite()函数。

以Arduino UNO为例,PWM精度为8位,意思就是把0%-100% 除以 2^8=256,100 / 256 = 0.391,意思就是说PWM的占空比控制步进是0.391%,它可以有以下取值:0%, 0.391%, 0.782%, 1.173%, … ,39.1%, … ,100%……
而这些取值对应的参数分别为 0, 1, 2, 3, … , 100, … , 255……


nBmEqO.gif

上图表示的是PWM参数决定PWM信号占空比的4种情况。绿色的竖线表示每个周期的分割线,并不代表信号qwq

以下是Arduino 自带的示例 "Digital->Fading.ino"

int ledPin = 9;    // LED connected to digital pin 9

void setup() {
  // nothing happens in setup
}

void loop() {
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
}

我们来解读一下上面的程序,LED的正极被连接在9号数字端口,负极串联一个限流电阻接到了GND(地,也就是开发板上的电源负极)。

setup()函数里不需要写任何内容。主循环loop()函数里使用了2个for循环来连续改变PWM信号的占空比值。

第一个for里,PWM信号的参数从0开始,以5为步进,每隔30ms增加一次,直到255为止。

第一个for循环运行到PWM参数为255时结束,进入第二个for循环。第二个for是递减过程,PWM参数从255以5为步进递减到0。

第二个for运行结束之后,loop()函数运行完成一次,从头再次运行。

这个程序运行之后,就素这样的效果~

nBGJc4.gif

下节预告

下节我们学习电子技术中的 "显微镜"~,请看

电子入门教程[03]—带上它的眼睛

发表评论