在上一篇筆記的基礎上,完成一個簡單的ADC采樣實驗。
第一步:預備知識
1、先來看一下bb_black的ADC管腳位置。下圖是bb_black的模擬輸入端口的分布。
這張圖上有三個重要的信息需要注意:
(1)模擬輸入端口數量:arm芯片共有8個ADC通道,bb_black上引出來的是7個引腳,AIN0~6;
(2)模擬輸入端口的電壓范圍:0~1.8V;
(3)ADC轉換的位數:12位;
2、有了Eclipse開發環境,就能方便的查看開發板的目錄結構。如下圖所示為開發板的目錄結構:
BBB板ADC需要用到兩個目錄:
(1)/sys/devices/bone_capemgr.8/ 加載ADC設備樹的目錄,有些版本可能為bone_capemgr.9或其他數字,具體根據自己的板來做;
(2)/sys/bus/iio/devices/ 這個目錄是ADC設備加載后的設備數據目錄,讀取ADC數據就是這在主目錄下進行的;
3、要進行ADC采樣,就需要用到一個器件來模擬出一個模擬量,這里筆者采用的是常見的滑動變阻器,如下圖所示:
注:
(1)滑動變阻器共有三個引腳,其中中間的引腳是滑動端,也就是說需要將中間的引腳連到開發板的模擬量輸入引腳。然后另外兩個引腳一個接模擬參考電壓引腳和模擬地引腳;
(2)筆者在實驗過程中選用的是100K的3296型滑動變阻器;
第二步:連接硬件
1、本實驗的硬件連接非常簡單,只需要使用三根線將滑動變阻器與bb_black的三個引腳連接好即可。
2、連接好的硬件如下圖所示:
注:筆者實驗用到的是AIN0端口
第三步:手動查看ADC轉換數據
1、打開字符終端
2、加載ADC設備命令為:echo BB-ADC > /sys/devices/bone_capemgr.8/slots
3、進入目錄/sys/bus/iio/devices,然后查看文件列表
4、進入該目錄:
注:其中的in_voltage0_raw、in_voltage1_raw至in_voltage7_raw共8個文件就是BBB板8個ADC引腳的值,這時可以用cat 命令來查看下其中的數值。
5、查看ADC數值:
注:
(1)每一次讀取的數值應該偏差不大;
(2)上圖中的3446就是ADC轉換出來的數值;
第四步:通過編程實現ADC數據的讀取
1、新建一個文件,如下圖所示在My Home文件下建一個自己的文件夾,然后右鍵新建一個文件。
2、新建遠程文件提示框如下,輸入新建文件的名稱adc.c
3、點擊確定之后就能在目錄結構圖中看到筆者添加的文件,然后雙擊打開就可以在Eclipse下進行編輯了
4、輸入下面的代碼
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 #define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0/in_voltage0_raw" 7 #define SYSFS_ADC_DEV "/sys/devices/bone_capemgr.8/slots" 8 #define MAX_BUF 64 9 int main() 10 { 11 FILE *fd=NULL; 12 char a[10]; 13 int x; 14 float adc; 15 16 fd=fopen(SYSFS_ADC_DIR,"w"); 17 if (fd==NULL) /*假如沒有文件就執行加載ADC*/ 18 { 19 fd=fopen(SYSFS_ADC_DEV,"w"); 20 fwrite("BB-ADC",sizeof(int),6,fd); /*BB-ADC有6個字符*/ 21 fclose(fd); 22 } 23 for(;;) 24 { 25 fd=fopen(SYSFS_ADC_DIR,"r+"); 26 fscanf(fd,"%s",a); 27 printf("%s",a); 28 if(strlen(a)==4) 29 { 30 x=((int)a[0]-48)*1000+((int)a[1]-48)*100+((int)a[2]-48)*10+((int)a[3]-48); 31 } 32 else if(strlen(a)==3) 33 { 34 x=((int)a[0]-48)*100+((int)a[1]-48)*10+((int)a[2]-48); 35 } 36 else if(strlen(a)==2) 37 { 38 x=((int)a[0]-48)*10+((int)a[1]-48); 39 } 40 else 41 { 42 x=((int)a[0]-48); 43 } 44 adc=((float)x/4095.0)*1.8; 45 printf(" adc=%4f\n",adc); 46 fclose(fd); 47 sleep(1); 48 } 49 return 0; 50 }
注:
(1)Linux下對設備的操作全部轉換問對文件的操作,所以本次ADC實驗也是對相應的文件進行操作;
(2)strlen(a)獲取a數組中的字符個數;
(3)關於fopen,fwrite,fread,fclose的用法參照筆者的另外一篇筆記http://www.cnblogs.com/zhezhe1988/p/4264482.html;
5、編輯完成一定要記得保存文件,否則編譯的將會是上一次的文件,如下圖所示保存文件
6、在字符終端找到新建的文件並編譯該文件,編譯命令為:arm-angstrom-linux-gnueabi-gcc –o adc adc.c
7、編譯完成之后就可以運行編譯的結果了:./adc
8、通過旋動滑動變阻器來觀察adc數值變化。