2013年4月4日 星期四

Arduino : PWM 輸出


就像類比輸入一樣,在真正的物理世界中我們經常需要輸出除了01之外的其他數值。例如,除了想用微控制器找開或者關閉電燈之外,我們還會想控制燈光的亮度,這時就需要用到類比輸出。

由於Arduino的微控制器只能產生高電壓(5V)或者低電壓(0V),而不能產生變化的電壓,因此必須採用脈寬度調變技術(PWMPulse Width Modulation)來模仿類比電壓。

脈衝寬度調變 (Pulse Width Modulation,PWM) 是將類比訊號轉換為脈波的一種技術,一般轉換後脈波的週期固定,但脈波的占空比會依類比訊號的大小而改變。PWM的使用隨著數位控制邏輯電路的增加而普及,該技術提供簡單的方法,可讓數位控制邏輯電路建立相當於類比的功能。許多微控制器都內建 PWM功能。PWM同時也可用於通訊系統,因為數位訊號比較穩定,也比較不容易受到雜訊干擾。

555  Duty cycle (PWM) 控制馬達


PWM是一種開關式穩壓電源應用,它是借助微處理器的數位輸出來對類比電路進行控制的一種非常用效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。

簡而言之,PWM是一種對模擬信號位準進行數位編碼的方法,它通過對半導體開關元件的導通和關斷進行控制,使輸出端得到一系列幅值相等但寬度不相等的脈衝,而這些脈衝能夠被用來代替正弦波或其它所需要的波形。

Arduino數未I/O接腳 91011上,我們可以通過analogWrite()函數來產生模擬輸出。該函數有兩個參數,其中第一個參數是要產生模擬信號的引腳(910或者11);第二個參數是用於產生模擬信號的脈衝寬度,取值範圍是0255。脈衝寬度的值取0可以產生0V的模擬電壓,取255則可以產生5V的模擬電壓。不難看出,脈衝寬度的取值變化1,產生的模擬電壓將變化0.0196V5V/255 = 0.0196V)。

本實驗中我們將用類比輸出來調暗發光二極管(LED),由於正常情況下LED對電壓的變化非常敏感,因此當脈衝寬度變化時人眼會感覺到LED實際上是在不斷地熄滅和點亮,而不是逐漸變暗。解決這一問題可以採用濾波電路,它能使有用頻率信號通過而同時抑制(或大大衰減)無用頻率信號。  (R/C 低通)

                 cut frequency = 0.16/ (220*10^-5)= 80Hz

實驗中我們採用的是低通濾波器,它的原理非常簡單,只需要一個電阻和一個電容,能夠很好地過濾掉電路中超過某一頻率的信號。此處給出的電路並不能校平所有脈衝,它之所以被稱為低通濾波是因為它只允許頻率低於某個限度的脈衝通過,對於高於這個限度的脈衝則被平衡為偽類比電壓,濾波的頻率範圍由電阻器和電容器的比值決定。








int potPin = 5;
int ledPin = 11;

byte bright_table[] = {  30,  30,  30,  40,  50,  60,  70,  80,  90, 100,110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 250, 240, 230, 220, 210, 200, 190, 180, 170, 160, 150, 140, 130, 120, 110, 100,  90,  80,  70,  60,  50,  40,  30,  30,  30 };
int MAX = 50;
int count = 0;
int val = 0;

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

void loop() {
  analogWrite(ledPin, bright_table[count]);
  count ++;
  if (count > MAX) {
    count = 0;
  }

  val = analogRead(potPin);
  val = val /4;
  delay(val);
}


本實驗用 analogWrite()函數在數位I/O端口的11號接腳上模仿類比輸出,每產生一次輸出後都設置了相應的延時Delay ,而延時的長度由類比輸入端口5號接腳上的電位器來決定。通過調整電位器的位置,我們可以觀察到LED逐漸變亮後再逐漸變暗的效果。

沒有留言:

張貼留言

WOKWI LED + MQTT Node-Red SQLite

WOKWI LED + MQTT Node-Red SQLite const char *mqtt_broker = "broker.mqtt-dashboard.com" ; const char *topic1 = "alex9ufo/e...