beaglebone_black_學習筆記——(7)ADC實驗


在上一篇筆記的基礎上,完成一個簡單的ADC采樣實驗。

第一步:預備知識

1、先來看一下bb_black的ADC管腳位置。下圖是bb_black的模擬輸入端口的分布。

image

這張圖上有三個重要的信息需要注意:

(1)模擬輸入端口數量:arm芯片共有8個ADC通道,bb_black上引出來的是7個引腳,AIN0~6;

(2)模擬輸入端口的電壓范圍:0~1.8V;

(3)ADC轉換的位數:12位;

2、有了Eclipse開發環境,就能方便的查看開發板的目錄結構。如下圖所示為開發板的目錄結構:

image

BBB板ADC需要用到兩個目錄:

(1)/sys/devices/bone_capemgr.8/  加載ADC設備樹的目錄,有些版本可能為bone_capemgr.9或其他數字,具體根據自己的板來做;

(2)/sys/bus/iio/devices/ 這個目錄是ADC設備加載后的設備數據目錄,讀取ADC數據就是這在主目錄下進行的;

3、要進行ADC采樣,就需要用到一個器件來模擬出一個模擬量,這里筆者采用的是常見的滑動變阻器,如下圖所示:

image

注:

(1)滑動變阻器共有三個引腳,其中中間的引腳是滑動端,也就是說需要將中間的引腳連到開發板的模擬量輸入引腳。然后另外兩個引腳一個接模擬參考電壓引腳和模擬地引腳;

(2)筆者在實驗過程中選用的是100K的3296型滑動變阻器;

第二步:連接硬件

1、本實驗的硬件連接非常簡單,只需要使用三根線將滑動變阻器與bb_black的三個引腳連接好即可。

image

2、連接好的硬件如下圖所示:

image

注:筆者實驗用到的是AIN0端口

第三步:手動查看ADC轉換數據

1、打開字符終端

image

2、加載ADC設備命令為:echo BB-ADC > /sys/devices/bone_capemgr.8/slots

image

3、進入目錄/sys/bus/iio/devices,然后查看文件列表

image

4、進入該目錄:

image

注:其中的in_voltage0_raw、in_voltage1_raw至in_voltage7_raw共8個文件就是BBB板8個ADC引腳的值,這時可以用cat 命令來查看下其中的數值。

5、查看ADC數值:

image

注:

(1)每一次讀取的數值應該偏差不大;

(2)上圖中的3446就是ADC轉換出來的數值;

第四步:通過編程實現ADC數據的讀取

1、新建一個文件,如下圖所示在My Home文件下建一個自己的文件夾,然后右鍵新建一個文件。

image

2、新建遠程文件提示框如下,輸入新建文件的名稱adc.c

image

3、點擊確定之后就能在目錄結構圖中看到筆者添加的文件,然后雙擊打開就可以在Eclipse下進行編輯了

image

image

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、編輯完成一定要記得保存文件,否則編譯的將會是上一次的文件,如下圖所示保存文件

image

6、在字符終端找到新建的文件並編譯該文件,編譯命令為:arm-angstrom-linux-gnueabi-gcc –o adc adc.c

image

7、編譯完成之后就可以運行編譯的結果了:./adc

image

8、通過旋動滑動變阻器來觀察adc數值變化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM