前面幾節講的都是數位的處理,也就是只有 0 和 1 兩種訊號,但我們的世界並不是只有 0 和 1 兩種訊號而已,我們還有更複雜的類比訊號。
諸如電壓、聲音、光亮、溫度等等的,都無法單純的由 0 和 1 構成。
那當我們需要處理這些訊號的時候該怎麼辦呢?
這時候就是 ADC (Analog to Digital Convert, ADC) 出場的時候啦!
Arduino 所採用的 AVR 微控制器內建有一組可多通道輸入多 ADC,根據型號的不同,其通道數目與效能也有所不同。
以我們常用的 Arduino UNO 為例,其所採用的 ATmega328p 微控制器內建有一組 6 通道 10 位元解析度的 A/D 轉換器,這 6 個通道的輸入腳位分別為 A0 ~ A5。
在 Arduino 中要讀取 ADC 的輸入很簡單,但一樣要先在 setup()
中加入的設定。
pinMode(腳位, INPUT); // Arduino UNO: A0~A5
讀值的語法也很簡單,就這樣:
int val = analogRead(腳位); // Arduino UNO: A0~A5
在這個範例中,我們將直接把可變電阻的電壓值透過 Arduino UNO 讀取後直接回傳到電腦上顯示。
void setup()
{
// 設定 RS232
Serial.begin(9600);
// 設定 A0 輸入
pinMode(A0, INPUT);
}
void loop()
{
// 讀值
int val = analogRead(A0);
// 傳送資料至電腦
Serial.println( val );
}
透過可變電阻來改變 LED 的亮度。
int led = 9; // LED 腳位
int analogPin = A0; // 可變電阻腳位
int val = 0; // 讀到的數值
void setup()
{
// 設定 led 為輸出
pinMode(led, OUTPUT);
// 設定 A0 輸入
pinMode(A0, INPUT);
}
void loop()
{
// 讀值
val = analogRead(analogPin);
// 將 0 ~ 1023 的 ADC 值轉成可被接收的 0 ~ 255
analogWrite(led, val / 4);
}
int BASE = 10; // 從腳位 10 開始
int NUM = 4; // LED 的總數
int analogPin = A0;
int val = 0; // 存放 ADC 數值
void setup()
{
// 用迴圈設定腳位
for (int i = BASE; i < BASE + NUM; i ++)
{
pinMode(i, OUTPUT);
}
// 設定 A0 為輸入
pinMode(analogPin, INPUT);
}
void loop()
{
for (int i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, LOW);
val = analogRead(analogPin);
delay(val);
}
for (int i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, HIGH);
val = analogRead(analogPin);
delay(val);
}
}
到這邊,類比輸入的部分就算介紹完了,希望這篇文章的內容對你有所幫助~
View Comments
請問如何把監控視窗中的ADC數值顯示在LCD上呢? 有程式嗎?
我記得有相關的套件可以使用,挺方便的