iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

GPIO、TWI和SPI介面通訊僅使用高電壓和低電平兩種狀態,而模擬輸入可以讀取高電平和低電平之間的連續訊號。模擬輸入的常見應用是感應環境引數,例如使用光敏電阻檢測亮度,也可以使用溫度感測器檢測環境溫度。人機互動應用具有許多模擬輸入,包括電位計、操縱桿、電阻式觸控式螢幕等等。

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

測試模擬輸入

BeagleBone® Black的GPIO引腳工作電壓為3。3伏,而模擬輸入引腳最多隻能接受1。8V電壓。P9引腳1和2接地,引腳3和4均為3。3V電源。在處理模擬讀數時,需要模擬地線和模擬電源線。所需引腳都在P9上,並靠近電源輸入插孔。引腳32為VDD_ADC,引腳34為GNDA_ADC。模擬輸入在引腳33、35至40,模擬輸入零(zero)位於引腳39。

為了測試模擬輸入,本文使用10k線性電位計。如果電位計與固定電阻串聯,則它將用作分壓器。電位計連線一個固定電阻,在電位計的輸入端採集電壓樣本。固定電阻器有兩個用途:當電位計設定為最小阻值時,會從VDD_ADC提供的1。8V電壓產生一個小的壓降,併為流過電路的電力提供一定的阻值。

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

從分壓器理論來看,考慮所示的連線圖,R1是一個1k歐姆的固定電阻,R2可以在10k和0k之間變化。白線是取樣點,隨著電位器滑塊移動,電壓將發生變化。當電位計提供最大阻值(10k)時,取樣電壓將約為R2/(R1+R2)*VIN=10,000/(10,000+1,000)*1。8=1。64V。取樣電壓趨向於0V。

使用萬用表可以發現BeagleBone® Black上的VDD_ADC提供的電壓為1。803V。使用的1K電阻略低於其額定值。電位計的最大電阻為10。4k Ohms。當電位計設定為最大值時,取樣點的讀數為1。645V。BeagleBone® Black上的模擬輸入仍低於1。8V的最大值。

可以透過將上圖中的紅線連線到VDD_ADC(引腳32),將綠線連線到GNDA_ADC(引腳34)完成電路板的電源和接地連線。在將取樣點連線到任何模擬輸入之前,驗證其可以提供的電壓範圍。在任一極端情況下,電位器滑塊都使電壓介於20mV和最高1。644V之間。將滑塊20mV端移開大約1/6,即可獲得1V讀數,但從那裡到軌跡的1。644V端的讀數是相當線性的。調整電位器後,用10k電阻代替1k固定電阻,可得到大約2mV至1V的線性讀數。因此,在本文的其餘部分中將保留10k固定電阻。

讀取模擬輸入

取樣點可以連線到任何模擬輸入,選擇模擬輸入0,即P9的引腳39。假設BeagleBone® Black已經完成設定。檢視slots file中的cape-bone-iio line,如下所示。試圖刪除cape-bone-iio,將-7寫入slots file,這導致模擬輸入檔案從/sys中消失,也造成了不穩定,無法再次讀取slots file,直到重新啟動BeagleBone® Black。

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

訪問模擬量輸入的檔案隱藏在/sys中,可能不會在其中找到它們,要注意的是,這些檔案是大寫的。

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

在電位器之前串聯一個10k電阻,將電位器滑塊從最小電阻移到最大電阻時,獲得以下讀數:

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

儘管上面的AIN檔案提供不斷獲取模擬輸入當前值的功能,但是您可能希望使用硬體為輸入值提供緩衝區。這樣就不必擔心特定的時序,可以一次性讀取最後一秒或兩秒中的所有值。

驅動程式/staging/iio/Documentation/generic_buffer。c核心原始碼中的示例檔案經常被引用。德州儀器(TI)有該檔案的補丁,可刪除觸發器,並在控制檯上連續顯示模擬輸入值。實際操作中,Linux核心拒絕在未設定觸發器的情況下,為模擬輸入啟用緩衝區,相關的dmesg如下所示:

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

啟用觸發器可能需要插入iio-trig-sysfs核心模組,如下所示,這將建立新的iio_sysfs_trigger目錄:

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

這裡建立adc-iio-continuous-sampling-userspace儲存庫(repository)的分支,以便可以修改檔案。還將poll()的用法更改為select(),以便保留更準確的觸發事件計數。當讀取較大緩衝區時,對poll()的依賴,並未區分裝置檔案準備好提供資料的情況,因為迴圈尚未完全耗盡資料。上面的分支中generic_buffer。c的核心只是使用select()在/dev/iio:device0上等待新值,並以易於閱讀的形式在控制檯顯示出來。

下面的指令碼將啟動generic_buffer,持續監視模擬輸入0和5。觸發器將為sysfstrig1。執行時,指令碼將輸出啟動訊息,然後暫停。如果下面的第二個命令塊在另一個終端上執行,則script_adc視窗將跳入模擬讀數的實時顯示列。

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

要從另一個終端觸發模擬緩衝器:

iCEasy商城:如何在BeagleBone® Black上獲取模擬輸入?

儘管上面使用觸發器和兩個控制檯有點奇怪,但可以讓主程式使用計時器來連續觸發模擬輸入裝置。

BeagleBone®Black中的模擬轉換器為12位,因此它應該提供0到4096之間的值。這比Arduino板上提供的10位要好一些。由於在本文中提供給模擬引腳的最大電壓為1V,因此這裡不使用太多采樣電壓範圍,並導致損失一半模擬輸入解析度。要注意的主要問題是,絕不能為任何模擬輸入提供超過1。8伏的電壓。提供模擬輸入的介面能夠非常快速地獲取當前值,而緩衝解決方案則能夠連續監視輸入,而不會丟失任何樣本。