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
",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数值变化。

原文地址:https://www.cnblogs.com/zhezhe1988/p/4335944.html