在上一篇笔记的基础上,完成一个简单的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数值变化。