Arduino PWM

FROM:http://blog.sina.com.cn/arduino

Pulse Width Modulation就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0或5V的的数字电压值,我们就通过使用高分辨率计数器,利用方波占空比调制方法来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么是5V(ON),要么是0V(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

    输出的电压值是通过通和断的时间进行计算的

输出电压=(接通时间/脉冲时间)*最大电压值

Arduino PWM_第1张图片

    PWM被用在许多地方,调光灯具、电机调速、声音的制作等等。

    下面介绍一下PWM的三个基本参数:

Arduino PWM_第2张图片

1、脉冲宽度变化幅度(最小值/最大值)

2、脉冲周期(1秒内脉冲频率个数的倒数)

3、电压高度(例如:0V-5V)





这次就用Arduino和一组三色灯(红、黄、绿)来实际应用一下PWM吧,首先先观察一下Arduino板子,共有六个PWM接口,他们分别是数字接口3、5、6、9、10、11  ,方便起见我们使用9、10、11这三个连续的PWM接口。在编写程序的过程中,我们会用到模拟写入analogWrite(PWM接口,模拟值)函数,对于模拟写入analogWrite()函数,PWM的调制频率被设置为30KHz

    先按照下图连接号电路

Arduino PWM_第3张图片

 

    这里我使用的电阻阻值是50欧姆,这里并不唯一,需要根据所使用的LED及其亮度选择适合阻值的电阻。

Arduino PWM_第4张图片

    下面就可以编写程序了,我们就让三个小灯依次缓慢亮起再缓慢熄灭,这样往复循环。

   
int redpin=11;//定义LED接口
int yellowpin=10;
int greenpin=9;
int redval;//定义LED变量
int yellowval;
int greenval;
int i=0;
void setup()
{
  pinMode(redpin,OUTPUT);//设置LED接口为输出接口
  pinMode(yellowpin,OUTPUT);
  pinMode(greenpin,OUTPUT);  
  pinMode(redval,INPUT);//设置LED变量为输入值
  pinMode(yellowval,INPUT);
  pinMode(greenval,INPUT);
  Serial.begin(9600);//连接到串行端口,波特率为9600
}
void loop()
{
  i++;
if(i<200)
{

  redval+=1;//红灯变亮
  greenval-=1;//绿灯变暗
  yellowval=1;//黄灯不变
}
else if(i<400)
{
   redval-=1;//红灯变暗
  greenval=1;//绿灯不变
  yellowval+=1;// 黄灯变亮
}
else if(i<600)
{
   redval=1;//红灯不变
  greenval+=1;//绿灯变亮
  yellowval-=1; //黄灯变暗
}
else
{
  i=0;//重新给i赋值进行新循环
}

analogWrite(redpin,redval);//给LED接口付模拟值
analogWrite(yellowpin,yellowval);
analogWrite(greenpin,greenval);
Serial.print(i,DEC);//显示出i的值
Serial.print(   "     R:");//分别显示出各个LED的模拟值
Serial.print(redval,DEC);
Serial.print(    "    Y:");
Serial.print(yellowval,DEC);
Serial.print(    "    G:");
Serial.println(greenval,DEC);

}

Arduino PWM_第5张图片

下载好程序就可以看到最终结果了。

Arduino PWM_第6张图片

你可能感兴趣的:(Arduino)