Arduino系列教程之 – PWM 的秘密(上)

由  动力老男孩 发表于 2011/03/08 21:56:02

今天是3.8妇女节,我也沾了点光,提早开溜了(公司的mm们都放假了,你们工做没动力啊)。呵呵,在此祝福全部的美女们节日快乐! git

前几天在微博上看到了flamingoeda小盆友提到了PWM,毕竟微博只能有一百多字,无法详细的介绍清楚,特此补充一下 算法

PWM是啥玩意儿?
PWM是“怕玩命”的缩写,英文写法是“Pulse-width modulation”,也有些外行人士把它翻译成“脉冲宽度调制”Arduino有不少种版本,这篇文章里是以ATmega168为例,有用过其余型号的兄弟请补充。
对于没有据说过PWM的同窗,请先参考一下个人另外一篇博客Arduino的模拟输入和输出  oop

PWM是用占空比不一样的方波,来模拟“模拟输出”的一种方式。靠,这个太拗口了,简而言之就是电脑只会输出0和1,那么想输出0.5怎么办呢?因而输出01010101….,平均以后的效果就是0.5了。早这么说就了然了嘛。 ui

pwm

PWM有神马做用?
举几个例子说明:
1.经过简单的滤波电路,就能够生成真正的模拟输出量;
2.控制灯光亮度,调节电机转速;请注意这和1不是重复的,由于不须要滤波就能够实现
3.控制舵机角度,这个请参考 Arduino开发板实验三:舵机控制 
4.输出信号,例如接喇叭的时候能够发声 spa

如何产生PWM?
Arduino有三种方式能够产生PWM第一种: 翻译

用analogWrite(pin, val)命令
其中pin是腿的编号,传说中只能用3,5,6,9,10,11这几条;val是0~255的整数值,对应电压从0到+5V注意,那几个脚的编号,指的是ATmega168的pin编号,Arduino的板子会用这几个管脚支持更多路的PWM输出,例如个人Arduino Mega168就支持0~13共14个PWM输出
具体的使用能够看下面的示例代码: code

  1. int pin = 8; //0~13  
  2. void setup()  
  3.     pinMode(pin, OUTPUT);  
  4. void loop()  
  5.     analogWrite(pin, 128);  
  6.     delay(500);  
int pin = 8; //0~13

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

void loop()
{
    analogWrite(pin, 128);
    delay(500);
}

这种方式产生的方波周期大概是20ms左右(50Hz),不须要占用额外的cpu命令时间听说99%的同窗看到这里就能够下课了,技术宅请继续看第二种方式: 教程

手动用代码实现PWM 开发

  1. int pin = 38;  //这个能够随意点  
  2. void setup()  
  3.     pinMode(pin, OUTPUT);  
  4. void loop()  
  5.   digitalWrite(pin, HIGH);  
  6.   delayMicroseconds(100);  
  7.   digitalWrite(pin, LOW);  
  8.   delayMicroseconds(1000 - 100);  
int pin = 38;  //这个能够随意点

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

void loop()
{
  digitalWrite(pin, HIGH);
  delayMicroseconds(100);
  digitalWrite(pin, LOW);
  delayMicroseconds(1000 - 100);
}

上面这段代码会产生一个PWM=0.1的,周期为1ms的方波(1000Hz),这种方式的优缺点很明显:
1,PWM的比例能够更精确;
2,周期和频率可控制;
3,全部的pin脚均可以输出,不局限于那几个脚;
4,缺点:CPU干不了其余事情了;
好吧,缺点只有一个,却很是致命,以致于上面这些基本都是废话可是对于周期比较大的PWM,能够用算法模拟CPU的多任务系统,从而在输出PWM的同时作点兼职。 get

那么能不能既调节PWM的频率和周期,又不要占用额外的CPU时间呢?请看第三种方式:

使用PWM寄存器

ATmega168有三个时钟,名字分别叫Timer0, Timer1和Timer2每一个时钟都使用了两个寄存器,其中一个是设定值例如128,另外一个则从0开始不断递增,到1024以后溢出回到0那么当两个值相同的时候,Timer就会把某个管脚反相。不一样的Timer之间频率是相同的,占空比则根据设置值不一样
占空比有了,那么周期怎么控制呢?有一种叫作时钟控制器的东东,这个控制器能够设置周期为CPU周期的某个倍数,例如1,8,64,256,1024等等,Timer0和Timer1共用一个控制器,Timer2和它们是独立的

今天先写这些,明天继续…..
本文内容基本都是参考自Arduino官网教程,心急的同窗请看英文原版:
http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

相关文章
相关标签/搜索