• 浅浅的分析LED呼吸灯的实现和PWM的关系


    前言

     在本周,我们在python课上做了一个实验,用ARDUINO使小LED灯模仿出呼吸灯的效果,实验进行的很成功,但是机器当仅输出高/低电平的时候是怎么样才能做到渐亮渐暗(输出电压)的变化呢?在这里就用到了PWM(脉冲宽度调制)的技术.这篇博文里介绍的就是我对本周的实验LED呼吸灯的原理通过学习进行的浅层次的理解分享.

    理解PWM需要知道的知识

    (1)脉冲
      解释:
             电子设备中电平状态发生的突变,通常突变时间很短,突变后极短时间后重新变为为原来的电平状态.(突变状态很短,两次突变间的时间相对较长)

    (2)脉冲循环
      解释:
             可以理解为一次突变到下一次突变所花的时间如下图:

      脉冲循环/周期

    3)*(重点)占空比
      解释:
             一个脉冲循环内通电时间所占的比例.,如下图:

      占空比

      举个例子:脉冲宽度1μs,信号周期5μs的脉冲序列即t=1,T=5,经过公式-占空比=t/T可以得到占空比为0.2.

      (4)滤波器
      解释:
          滤波器的组成为电感,电容,电阻等元器件.虽然PWM能通过通过改变占空比的方法.使电压的平均值达到稳压值,但输出稳定电压是靠PWM之后接的的滤波器来实现的.

      (5)平均电压/输出电压
      解释:
        平均电压电压在一个周期T内积分之后再除以T.
        也可以等同于写成:
        输出电压 = (接通时间 / 脉冲时间)* 最大电压值

            计算方式(平均电压)的示意图如下:

     平均电压/输出电压计算方式

    PWM的定义

    PWN(Pulse-width modulation)的中文名是脉冲宽度调制.那么我们来看一下wikipedia对它的定义:

    脉冲宽度调制(英语:Pulse Width Modulation,缩写:PWM),简称脉宽调制,是将模拟信号变换为脉冲的一种技术,一般变换后脉冲的周期固定,但脉冲的占空比会依模拟信号的大小而改变.在模拟电路中,模拟信号的值可以连续进行变化,在时间和值的幅度上都几乎没有限制,基本上可以取任何实数值,输入与输出也呈线性变化。所以在模拟电路中,电压和电流可直接用来进行控制对象,例如家用电器设备中的音量开关控制、采用卤素灯泡灯具的亮度控制等等  

    计算PWN等效电压

    PWM的等效电压计算公式为:

    (此处我认为因为是方波所以可以将其视作平均电压)

    U =(T1*Umax)/(T1+T2)
    T1:导通时间
    T2:断流时间
    T1+T2 脉冲周期
    Umax:电压幅值

    所以根据公式可知,由于T1/(T1+T2)正是空占比,所以改变空占比就等于改变了等效电压,所以使得灯泡的亮度发生了变化

    为什么Analogwrite的值是0-255?

    LED亮度通过调节LED驱动器的PWM占空比来对亮度控制,一个PWM周期可以划分成2的控制位的次方个时钟周期而对大部分LED而言,控制位通常是8位,所以8位PWM能够提供256个亮度级的电平,因此PWM周期由256个时钟周期组成.

    脉冲周期/频率和人眼的关系

     LED的典型时钟频率是32kHz,那么根据公式PWM周期为256/32kHz=8ms.那么这样对于人眼而言这个闪烁频率很安全的避免了人眼能够觉察的闪烁.

     

    在ARDUINO中使用PWM控制LED灯模拟呼吸灯的实验

    实验准备:

    实验主设备: Arduino UNO R3(图片来自NRIOBOT)
    Arduino UNO R3

    其他:
    LED灯(若干)
    面包板(一块)
    杜邦线(双头公若干)
    电阻(若干)(可选择/非必需)

    连接图示意(通过Fritzing软件制作的简易电路图)

    修改后的电路图

    实验代码:

    /*先要介绍一下analogwrite的用法
    将模拟值(PWM波)输出到管脚。可用于在不同的光线亮度调节发光二极管亮度或以不同的速度驱动马达。调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())
    
    这种方法也叫快速PWM方式*/

    需要上传到ARDUINO中的代码:

    //设定使用9号口
    void setup (){
    pinMode(9,OUTPUT);
    }
    void loop(){
    //由于上文中提到的所以为256种亮度
    for (int a=0; a<=255;a++) //控制PWM亮度的增加 
    {
    analogWrite(9,a); 
    delay(8); 
    } 
    for (int a=255; a>=0;a--) //控制PWM亮度减小 
    { 
    analogWrite(9,a); 
    delay(8); 
    } 
    delay(300); //完成一个循环
    }

    Analogwrite和占空比的关系

    analogwrite(x,y) 

    X是管脚,而y(value)就是亮度级(在LED中)
    占空比的计算方法就是:
                     占空比=y/256

    对于Analogwrite占空比的一个特殊之处的解释

    对于快速PWM模式,如果我们代码用了analogWrite(9, 0)即Y(value)=0,实际上应该有1/256的占空比,然而实际输出的电平为0.这是因为在Arduino的强制设定,当检测到AnalogWrite的value为0,那么就等于关闭了PWM.所以带来的问题是,如果我们设置analogWrite(9, 1),那么占空比2/256,所以在0到1之间产生了一个跳跃,丢弃了占空比为1/256的情况.

    总结

    这次的python实验中,让我们尝试了怎么使用Arduino和LED灯做出呼吸灯的效果,因为对于机器是怎么输出高电平(5v)和低电平(0v)之间的电压好奇,所以探究了一下原理,总结来说就是机器通过pwm在管脚产生了一定占空比的方波,改变空占比就等同于改变了等效电压,所以使得灯泡的亮度发生了变化.

  • 相关阅读:
    082、Java数组之数组传递之简化理解
    081、Java数组之数组传递
    080、Java数组之二维数组的定义及使用
    079、Java数组之数组的静态初始化
    078、Java数组之数组的引用传递
    077、Java数组之分步实现数组操作
    076、Java数组之定义数组
    075、Java面向对象之定义匿名对象
    074、Java面向对象之构造方法重载
    073、Java面向对象之利用构造方法为属性赋值
  • 原文地址:https://www.cnblogs.com/lzxwalex/p/6738094.html
Copyright © 2020-2023  润新知