天天看點

Arduino模拟輸入

  Arduino的優勢在于對數字信号的識别和處理,但我們所生活的真實世界并不是數字(digital)化的,簡單到隻要用0和1就能夠表示所有的現象。例如溫度這一我們已經司空見慣的概念,它隻能在一個範圍之内連續變化,而不可能發生像從0到1這樣的瞬時跳變,類似這樣的實體量被人們稱為是模拟(analog)的。Arduino是無法了解這些模拟量的,它們必須在經過模數轉換後變成數字量後,才能被Arduino進一步處理。

  像溫度這樣的資料必須先被轉換成微處理器能夠處理的形式(比如電壓),才能被Arduino處理,這一任務通常由各類傳感器(sensor)來完成的。例如,電路中的溫度傳感器能夠将溫度值轉換成0V到5V間的某個電壓,比如0.3V、3.27V、4.99V等。由于傳感器表達的是模拟信号,它不會像數字信号那樣隻有簡單的高電平和低電平,而有可能是在這兩者之間的任何一個數值。至于到底有多少可能的值則取決于模數轉換的精度,精度越高能夠得到的值就會越多。

  Arduino所采用的ATmega8微處理器一其有6個模數轉換器(ADC,Analog to Digital Converter),每一個模數轉換器的精度都是10bit,也就是說能夠讀取1024(2^10 = 1024)個狀态。在Arduino的每一個模拟輸入管腳上,電壓的變化範疇是從0V到5V,是以Arduino能夠感覺到的最小電壓變化是4.8毫伏(5/1024 = 4.8mV)。

  電位計(potentiometer)是一種最簡單的模拟輸入裝置,它實際上就是一個可變電阻箱,通過控制滑塊所在的位置我們可以得到不同的電壓值,而輸入信号正是從滑塊所在的位置接入到電路中的。

Arduino模拟輸入
Arduino模拟輸入

2013-4-19 16:31 上傳

  這一實驗我們将通過改變電位計的值來控制發光二極管閃爍的頻率。電位計上一共有三個管腳,分别連接配接到Arduino的電源、地和模拟輸入的5号管腳上,發光二極管則連接配接到數字I/O的13号管腳上,原理圖如下所示:

Arduino模拟輸入

相應的代碼為:

int ledPin = ;
int potPin = ;
int value = ;

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

void loop() {
value = analogRead(potPin);
digitalWrite(ledPin, HIGH);
delay(value);
digitalWrite(ledPin, LOW);
delay(value);
}
           

  在Arduino中,對模拟輸入端口不需要調用pinMode()函數将其指定為輸入或者是輸出模式,這點同數字I/O端口是有所不同的。

通過旋轉電位計的軸,我們能改變電位計中間那根連線同地之間的電阻量,進而也就能改變從模拟輸入的5号管腳上所讀入的模拟量的值。當電位計完全旋轉到頭時,輸入到模拟輸入管腳上的電壓為0V,用analogRead()函數讀出的值為0;當電位計完全旋轉到另一頭時,輸入到模拟I/O管腳上的電壓為5V,此時用analogRead()函數讀出的值為1023;當電位計旋轉到中間的某個位置時,輸入到模拟輸入管腳上的電壓是0V到5V之間的某個值,而用analogRead()函數讀出的則是位于0到1023之間的某個對應值。讀出的模拟量在我們的實驗中被用來确定發光二極管點亮和熄滅的時間,以反映模拟量的變化。

Arduino模拟輸入

  電位計運用的是分壓原理,通過旋轉到不同的位置來得到不同的電壓值。從這種意義上講,它能夠被用來對目前旋轉到的位置進行度量,是以可以被用在轉向輪等旋轉裝置中。

Arduino模拟輸入

  今天發現PCB闆上另外一個錯誤,就是将模拟輸入對應管腳号标反了,試了好久才意識到是這一問題。加上之前電源設計上的兩個小缺陷, 一共有三個需要修改的地方。如果有機會再做PCB闆的話,試着将這些問題解決一下:-)

相應的代碼為:

int ledPin = ;
int switchPin = ;
int value = ;

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

void loop() {
value = digitalRead(switchPin);
if (HIGH == value) {
// turn LED off
digitalWrite(ledPin, LOW);
} else {
// turn LED on
digitalWrite(ledPin, HIGH);
}
}
           

  由于采用的是負邏輯電路,開關按下時用digitalRead()函數讀取到的值為LOW,此時再用digitalWrite()函數将發光二極管所在的管腳置為高,點亮發光二極管。同理,當開關擡起時,發光二極管将被熄滅,這樣我們就實作了用開關來控制發光二極管的功能。

Arduino模拟輸入

繼續閱讀