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

相關文章
相關標籤/搜索