Lecture 11/14 –
Digital and Analog
FC Tien, YP Liu
Dept. of IE&M, Taipei Tech
數位與類比訊號 之差異
數位信號(Digital signal)是離散時間訊號
(discrete-time signal)的數位化表示,通常可由 類比信號(analog signal)獲得。離散時間訊號是 類比信號的採樣結果:離散訊號的取值只在某些固 定的時間點有意義 (其他地方沒有定義),而不 像類比信號那樣在時間軸上具有連續不斷的取值
類比訊號(Analog signal)主要是與離散的數位訊號 相對的連續訊號。類比訊號經過對時間軸等取樣
(抽樣, 取 sample 的方法可參考採樣定理)之後 成為離散訊號,即可被程式處理。再對資訊內容取 整數後成為數位訊號。類比訊號分佈於自然界的各 個角落,如每天溫度的變化。而數位訊號是人為抽 樣出來的在時間上的不連續訊號
數位訊號
類比訊號
數位與類比訊號 之差異
類比訊號(Analog signal) 數位信號
Pulse-code modulation 脈波編碼調變
數位與類比訊號
使用Arduino的類比訊號須注意下面數點
有許多狀態,並無單單兩狀態(HIGH/LOW)
狀態的數量即解析度
一般電腦使用的解析度
8-bit = 256 states
16-bit = 65,536 states
32-bit = 4,294,967,296 states
What is PWM? -- Pulse Width Modulation
脈衝寬度調變 (Pulse Width Modulation,PWM) 是將類比 訊號轉換為脈波的一種技術,一般轉換後脈波的週期固定,
但脈波的占空比會依類比訊號的大小而改變
PWM的使用隨著數位控制邏輯電路的增加而普及,該技術 提供簡單的方法,可讓數位控制邏輯電路建立相當於類比 的功能
許多微控制器都內建 PWM功能
PWM同時也可用於通訊系統,因為數位訊號比較穩定,也 比較不容易受到雜訊干擾
類比電壓的控制
使用PWM產生類比電壓
在Arduino中可以使用PWM (Pulse Width Modulation, 脈衝寬度調變)訊號產生出類比電壓
輸出的電壓可以由digital 的 On 及 Off 的時間的平均值來得到
𝑂𝑢𝑡𝑝𝑢𝑡 𝑉𝑜𝑡𝑎𝑔𝑒 = On time
𝑜𝑓𝑓 𝑡𝑖𝑚𝑒 ∗ 𝑀𝑎𝑥 𝑉𝑜𝑙𝑡𝑎𝑔𝑒
Arduino 中:
5V analogWrite(255)
3.75V analogWrite(191)
2.5V analogWrite(127)
1.25V analogWrite(64)
0V analogWrite(0)
Rescale 的概念
Rescale data是將一組數值由一個 domain 大小 的數值,轉換到另一個 range 內,使其有相對應 之數值關係
如於Arduino 中analog 所讀入之數值為 0~1023,
digital 輸出之數值為 0~255,故須將其rescale 到相對應之範圍
於程式中處理較方便之方法為將analog 的數值 除以4,但於一般訊號處理時會使用 digit shift之 方式進行 (>>),故只需將所得之數值 right shift 2即可 (>>2)
1024
1
256 1
512
?
256
PWM 控制LED亮度
現在嘗試使用Arduino內建的函數 analogWrit(); 來控制 LED 燈光亮度
Arduino Program
//Fading.pde
int brightness = 0; // brightness 變數用來保存目前的燈光亮度
int fadeAmount = 5; // fadeAmount 變數用來設定每一次燈光亮度的調整值 void setup() {
pinMode(9, OUTPUT); //宣告 pin9 為 output pin, LED 接在 pin9 上 }
void loop() {
analogWrite(9, brightness); //使用 analogWrite(9, brightness) 設定 pin9 上的 LED 燈光亮度 brightness = brightness + fadeAmount;
/*
調整下一次的燈光亮度改變 fadeAmount 燈光亮度調整值,
假如 brightness 已達到最(255),就將 fadeAmount 改成 -5,
讓燈光下一次的變化改成漸漸變暗,假 如 brightness 已達到最暗(0),
就將 fadeAmount 改回 +5,讓燈光下一次的變化改成漸漸變亮。
*/
if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ;
}
delay(30); //延遲 30ms,這樣肉眼才能看得到 LED 調光的效果 }