Arduino学习笔记3--用模拟IO口实现呼吸LED灯

Arduino学习笔记3--用模拟IO口实现呼吸LED灯_第1张图片

Arduino学习笔记3--用模拟IO口实现呼吸LED灯_第2张图片

就像模拟输入一样,在现实的物理世界中我们经常需要输出除了01之外的其他数值。例如,除了想用微控制器找开或者关闭电灯之外,我们还会想控制灯光的亮度,这时就需要用到模拟输出。由于Arduino的微控制器只能产生高电压(5V)或者低电压(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWMPulse Width Modulation)来模仿模拟电压。

PWM是一种开关式稳压电源应用,它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。简而言之,PWM是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。

Arduino数字I/O管脚3,9上,我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数,其中第一个参数是要产生模拟信号的引脚(3,9);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是0255。脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化0.0196V5/255 = 0.0196)。

本实验中我们将用模拟输出来调暗发光二极管(LED).代码如下:

/*
 * Breath LED
 *
 * LED connect to D9
 *
 */

const int pwmPin = 9;                           // use Digital pin D9
 
int cycle        = 1600;                        // Divide output into 9+1 = 10 portions
int sourceClock  = PWM_SOURCE_CLOCK_13MHZ;
int divider      = PWM_CLOCK_DIV8;              // The PWM frequency will be 13MHz / 8 / 10 = 162.5KHz


int offset       = 1;
int brightness   = 0;

// duty: 0-100
void setPwm(unsigned char duty)
{
    int __duty = map(duty, 0, 100, 0, 1600);
    analogWriteAdvance(pwmPin, sourceClock, divider, cycle, __duty);
}


void setup()
{
    pinMode(pwmPin, OUTPUT);
}

void loop()
{
    for(int i=0; i<100; i++)
    {
        setPwm(i);
        delay(10);
    }
   
    delay(200);
   
    for(int i=99; i>=0; i--)
    {
        setPwm(i);
        delay(10); 
    }
   
    delay(500);

}

 

 

 

 

你可能感兴趣的:(Arduino学习笔记3--用模拟IO口实现呼吸LED灯)