跳轉到內容

應用機器人/微控制器/讀取感測器

來自華夏公益教科書,開放的書籍,開放的世界

讀取數字輸入

[編輯 | 編輯原始碼]

簡單的 1 位數字感測器是微控制器上最簡單的輸入型別。微控制器上的大多數引腳可用作通用 I/O,這允許連線許多 1 位數字感測器。這些感測器的示例可能是限位開關、紅外接近感測器、高增益光電探測器(光感測器)或按鈕。

二進位制開關型別感測器非常容易整合,只需將一個上拉或下拉電阻連線到開關輸出即可。

要在 AVR 微控制器上讀取感測器,必須使用兩個暫存器來處理引腳設定和讀取。這兩個暫存器是

  • DDRx
  • PINx

其中 x 表示任意的 I/O 埠(例如 A、B、C、D 等)。

DDR(資料方向暫存器)用於將指定引腳配置為給定埠的輸入或輸出。每個位置的“1”位指定該埠引腳設定為輸出,每個位置的“0”位指定該引腳配置為輸入。

PIN 暫存器用於讀取每個埠上所有 8 個引腳的數字狀態,對於每個位的邏輯高返回 1,對於邏輯低返回 0。請注意,這不是 PORTx 暫存器。PORTx 用於設定輸出值,而 PINx 用於讀取輸入。

要使用數字輸入,必須將引腳配置為輸入,然後從 PINx 暫存器讀取相應的位。從 PINx 中提取單個位的最簡單方法是使用位掩碼。

DDRA = 0b00000000; // All PORTA pins configured as inputs

if (PINA & 0b00000100) {
  // if PA2 is high
}
else {
 // if PA2 is low
}

if ((PINA & 0b00001000) == 0) {
 // if PA 3 is low
}

在這些示例中,位掩碼用於從條件中刪除埠上所有其他引腳的狀態。與數字輸出一樣,可以使用 AVR-GCC 宏使程式碼更易於閱讀

if ((PINA & 1<<PIN3) == 0) {
 // if PA 3 is low
}

讀取模擬輸入

[編輯 | 編輯原始碼]

許多感測器測量連續訊號,例如旋鈕的位置、房間的光照水平或物體與感測器之間的距離。通常,這些感測器的輸出電壓與測量的訊號線性相關。要與這些感測器介面,必須使用模數轉換器 (ADC)。大多數微處理器包含幾個 ADC。ADC 將電壓轉換為整數,整數的大小取決於 ADC 的精度。大多數 ADC 是 8 位或 10 位,這意味著它們使用 8 位或 10 位來表示整個範圍(從 0 到 Vcc)。10 位 ADC 將模擬電壓離散化為值,範圍從 0(0 V)到 1023(Vcc)。

AVR 的 ADC 需要幾個步驟來配置和讀取模擬訊號。此外,只有微控制器上的引腳可用作模擬輸入。請參閱微控制器的規格說明書,以查詢哪些引腳可與 ADC 一起使用(它們通常標記為 ADCn,其中 n 是一個數字)。與 ADC 相關的暫存器是

  • PINx:將引腳配置為輸入
  • ADMUX:選擇正在讀取的 ADC 輸入
  • ADCSRA:ADC 控制暫存器
  • ADCL:ADC 轉換的低 8 位
  • ADCH:ADC 轉換的高位

由於 ADC 引腳也可以用作數字輸入/輸出,因此必須將其配置為輸入才能由 ADC 讀取。ADMUX 暫存器用於選擇哪個 ADC 正在轉換,對於單端輸入,它只是一個介於 0..N 之間的數字,其中 N 是 MCU 上的最後一個 ADC 引腳。ADCSRA 代表 ADC 控制和狀態暫存器 A,用於開始轉換並檢查轉換何時完成。ADCL 和 ADCH 包含轉換的結果。

// Configuration:
DDRF &= ~(1<<PIN0); // Configure PF0 as an input (connected to ADC0 on AT90USB64)

// Reading ADC:
ADMUX = 0; // Read ADC0
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADPS0); // Enable ADC (ADEN), Start a Conversion (ADSC), Fast conversion (ADPS0)
while ((ADCSRA & (1<<ADIF))==0); // Wait for Conversion to Complete
unsigned short value = (ADCL) | (ADCH<<8); // Combine low and high portions of result
華夏公益教科書