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

  • 相关阅读:
    Linux下的”锁“事儿
    拿得起,放得下,想得开
    关于TCP协议握手的那些事儿

    C++中的RTTI机制解析
    C/C++中产生随机数
    数据库-事务和锁
    JS 数组Array常用方法
    C# 压缩 SharpZipLib
    正则表达式学习3-负向零宽断言
  • 原文地址:https://www.cnblogs.com/zhezhe1988/p/4335944.html
Copyright © 2020-2023  润新知