AVR開發 Arduino方法(五) 模數轉換子系統

  模數轉換子系統用於將傳感器採集的模擬信號轉換爲數字信號。Arduino UNO R3主處理器ATMega328P的模數轉換子系統採用逐次逼近的方式完成模數轉換。函數

  使用Arduino庫函數進行模數轉換十分簡單,下面的示例能夠將A0引腳上的模擬信號轉換爲數字信號,並將轉換結果打印到串口0上: oop

 1 // ReadAnalogVoltage.ino
 2 void setup() {
 3   Serial.begin(9600);
 4 }
 5 
 6 void loop() {
 7   int sensorValue = analogRead(A0);
 8   float voltage = sensorValue * (5.0 / 1023.0);
 9   Serial.println(voltage);
10 }

   與模數轉換相關的Arduino庫函數有:ui

 

  analogRead(pin):將指定引腳上的模擬信號轉換爲數字信號spa

  pin:指定模擬引腳code

  函數返回轉換結果,是一個無符號整數,取值爲0~1023blog

 

  ATMega328P的模數轉換子系統由2個相關寄存器控制。模數轉換多路選擇寄存器ADMUX的結構以下圖所示:開發

REFS1table

REFS0class

ADLARfloat

 

MUX3

MUX2

MUX1

MUX0

輸入通道選擇MUX[3:0]位用於指定模擬信號輸入的引腳,Arduino UNO R3開發板上有6個模擬信號輸入引腳,它們分別是A0A5,在ANALOG IN組中。

  模數轉換控制和狀態寄存器ADCSRA的結構以下圖所示:

ADEN

ADSC

ADATE

ADIF

ADIE

ADPS2

ADPS1

ADPS0

向模數轉換使能位ADEN寫入1則啓用模數轉換,寫入0則禁用;向模數轉換啓動轉換位ADSC寫入1則啓動模數轉換,寫入0則不啓動;模數轉換中斷標誌位ADIF在被置1時模數轉換完成,能夠向它寫10;模數轉換預分頻選擇位ADPS[2:0]用於設置模數轉換的時鐘源,它的設置以下表所示:

ADPS[2:0]

時鐘源

000

系統時鐘2分頻

001

系統時鐘2分頻

010

系統時鐘4分頻

011

系統時鐘8分頻

100

系統時鐘16分頻

101

系統時鐘32分頻

110

系統時鐘64分頻

111

系統時鐘128分頻

  模數轉換的結果保存在模數轉換數據寄存器ADCHADCL中。經過直接訪問寄存器改寫以上程序爲:

 1 // ReadAnalogVoltage_reg.ino
 2 void setup() {
 3   ADMUX = 0x00;
 4   ADCSRA |= (1 << ADEN);
 5 
 6   Serial.begin(9600);
 7 }
 8 
 9 void loop() {
10   ADCSRA |= (1 << ADSC);
11   while (!(ADCSRA & (1 << ADIF)));
12 
13   int sensorValue = (ADCH << 8) | ADCL;
14   float voltage = sensorValue * (5.0 / 1023.0);
15   Serial.println(voltage);
16   ADCSRA |= (1 << ADIF);
17 }
相關文章
相關標籤/搜索