應用機器人/微控制器/讀取感測器
簡單的 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