我們生活在一個模擬世界中,其中大多數物理變量都是模擬信號。但是,微控制器只能處理數字格式的可用數據。正是由于這個原因,模數轉換(ADC)在與模擬環境交互的嵌入式系統中是如此重要。在本教程中,我們將討論chipKIT UNO32板的ADC功能,并說明如何從其ADC通道讀取模擬輸入信號。
模擬到數字轉換
理論
許多嵌入式應用程序處理諸如運動,溫度,壓力,相對濕度,光強度和聲音。微控制器無法直接處理這些實體,因為i)它們是非電信號,ii)它們是模擬量,這意味著與數字信號的離散值相比,它們在給定范圍內具有一組連續的值。為了使微控制器能夠處理這些數量,必須以某種方式將它們表示為數字信號。此過程的第一步是將物理信號轉換為電信號,這需要使用換能器。
換能器是一種將物理信號轉換為電信號的機電系統,反之亦然。換能器的最簡單示例是光敏電阻或LDR,可用于測量環境光的強度。 LDR是一種特殊的電阻器,其電阻會隨著落在其表面上的光強度而變化。 LDR的電阻隨著光強度的升高而降低。下圖顯示了在兩種不同強度的光照射下LDR的電阻的測量結果。
在較高的光強度下,LDR的電阻較低(1.31 K?)
當落在其上的光被阻擋時,LDR電阻會升高(6.30 K?)
與固定值電阻器串聯的電阻可用于構建將光強度轉換為電壓的機制。稍后將對此進行更詳細的討論。換能器的另一個示例是電動機,它將電壓轉換為運動。
現在,物理信號已轉換為電信號,但由于其模擬性質,尚未準備好進行計算機處理。因此,下一步需要模數轉換(ADC)系統,該系統采用連續變化的電壓輸入并返回適合微控制器使用的二進制數字表示形式。
如今,許多微控制器都配備了模數轉換系統。 chipKIT UNO32板上的PIC32MX320F128H微控制器具有一個內置ADC,具有16個ADC輸入通道。在Uno32板上,只有12個可通過排針A0至A11進行訪問。 ADC的分辨率為10位,這意味著對于給定范圍的模擬信號,可以進行1024(2 10 )個離散二進制表示形式(0至1023)。 ADC的可接受范圍通過參考電壓(VREF)設置。 chipKIT UNO32板上PIC32MX320F128H微控制器的默認設置參考電壓是其電源電壓(Vcc = 3.3 V)。這也是可以在chipKIT UNO32板上的任何ADC通道上施加的模擬電壓的最大值。假設,如果將ADC的范圍設置為0-3.3V(VREF = 3.3 V),則ADC分辨率也可以用電壓表示為3.3/1024? 3.2毫伏。這是片上模數(A/D)轉換器可檢測到的模擬輸入電壓的最小變化。因此,0到3.2 mV之間的任何值都將由十進制0表示,十進制1則介于3.2 mV和6.4 mV之間,十進制2代表6.4 mV和9.6 mV之間,…,最后是1023介于3.2968 V和3.3 V之間。可以看到,采用這種配置,模擬電壓的數字表示形式中的最大誤差可能為3.2 mV。這也稱為量化誤差。
有時,模擬輸入電壓的范圍與3.3V相比過小,并且變化很小。例如,房間內的空氣溫度變化不大。在這種情況下,您可以提高A/D轉換器的分辨率(從而減少量化誤差)以更精確地跟蹤溫度。假設如果您知道溫度感測傳感器的輸出電壓不能超過1V,則將VREF設置為1V可以提高分辨率為1/1024? 1毫伏。現在,A/D轉換器能夠檢測到輸入信號中很小的變化。外部ADC參考電壓可以通過其AREF引腳(在連接器J5上標記為A)提供給chipKIT UNO32板上的微控制器。可以施加到該引腳的最大電壓為3.3V。
電路設置
在本教程中,一個2.2K電阻與LDR以構建分壓網絡,如下所示。通過Uno32板的ADC通道A0測量電阻兩端的電壓。當光線落在LDR上時,其電阻減小,因此2.2K電阻兩端的電壓升高。如果光線被阻止落到LDR上,則會發生相反的情況。因此,10位ADC輸出與落在LDR上的光強度成正比。評估板已連接到PC,ADC輸出將通過串行端口發送并顯示在串行監視器窗口中。
傳感模擬世界
面包板上的LDR電路設置
書寫草圖
ADC輸出通過串行線路發送,必須在設置功能中初始化串行端口和波特率。 analogRead()函數用于從括號內指定的模擬引腳讀取模擬輸入信號。默認情況下,3.3V的電源電壓用作A/D轉換的參考電壓,這意味著0到3.3伏之間的輸入電壓映射為0到1023之間的整數值。為了使用施加到A引腳的外部參考電壓,請在草圖中使用 analogReference(External)函數。這是完整的chipKIT草圖,可讀取A0 ADC通道上的輸入值并將ADC輸出打印到串行監視器。
/*
Tutorial 4: Analog to digital conversion
Description: Reads an analog signal input to A0 pin and send the
10-bit ADC output to PC to display on the serial monitor.
Board: chipKIT UNO32
*/
int ADC_OUTPUT;
void setup() {
Serial.begin(9600);
}
void loop() {
ADC_OUTPUT = analogRead(A0);
Serial.print(“LDR sensor output = ”);
Serial.println(ADC_OUTPUT, DEC);
delay(1000);
}
下載草圖文件
輸出
將以上草圖上傳到Uno32板上,然后從MPIDE打開串行終端窗口。 ADC樣本(整數ADC輸出)以1秒的間隔打印在窗口上。您可以觀察這些數字如何隨著LDR上光線的變化而變化。如果您將手指放在LDR上并阻擋掉落在LDR上的光,則ADC輸出將突然下降。
chipKIT Uno32板通過串行將ADC輸出發送到PC界面
責任編輯:wv
-
adc
+關注
關注
98文章
6438瀏覽量
544107
發布評論請先 登錄
相關推薦
評論