打印

使用BBB的ADC

[复制链接]
333|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Flower1|  楼主 | 2017-10-10 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用BBB的ADC

Beaglebone Black的处理器芯片AM3359上的8个ADC脚同时也是触摸屏控制器(TSC),我们知道一般的电阻屏分为4线、5线或8线的,除去触摸屏以外的ADC接口可以作为普通的ADC使用。(我们在查询TI公司的4000页AM33xx手册时需要到Touchscreen Controller这一章去找有关ADC的内容。)
特别注意:Beaglebone Black的ADC管脚最大只能输入1.8V!!!
基本使用方法:

因为这个路径太常用,我们先把它存成环境变量
  • export SLOTS=/sys/devices/bone_capemgr.8/slots

复制代码
加载Beaglebone自带的device tree文件
  • echo BB-ADC > $SLOTS

复制代码
这时/sys/bus/iio/devices目录下会出现一个iio:device0目录(原本是没有的)。里面有如下内容
  • -r--r--r-- 1 root root 4096 Jan  1 01:25 dev  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage0_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage1_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage2_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage3_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage4_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage5_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage6_raw  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:25 in_voltage7_raw  
  • -r--r--r-- 1 root root 4096 Jan  1 01:25 name  
  • drwxr-xr-x 2 root root    0 Jan  1 01:25 power  
  • lrwxrwxrwx 1 root root    0 Jan  1 01:25 subsystem -> ../../../../../bus/iio  
  • -rw-r--r-- 1 root root 4096 Jan  1 01:19 uevent  

复制代码
里面的in_voltage*_raw文件便是8个ADC引脚的值。可以用cat命令查看其数值
  • cat in_voltage1_raw
  • 2965

复制代码
beaglebone的ADC是12位的,所以这个数值是0到4095之间的某个数,对应着0到1.8V电压。另外beaglebone black只有0到6这7个ADC是可被外部使用的,第7个可能是连到板子上的某处了。
如果想在c语言程序中使用ADC值,目前的办法是用read()函数读取文件中的数值。经过不严谨的测试,发现系统刷新in_voltage*_raw文件的速度还是挺快的。我如果每毫秒采一次样,输出数值是在一个小范围内波动的,而且相邻两次的数值很少有相同的。但如果我把采样速度增大10倍,每0.1毫秒采样一次,就会出现连续重复的数值。可见它的刷新速度是毫秒级的,这应当够一般使用了。

源代码:
  • #include <stdlib.h>  
  • #include <stdio.h>  
  • #include <string.h>  
  • #include <fcntl.h> //define O_WRONLY and O_RDONLY  
  •   
  •   
  • #define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0/in_voltage3_raw"  
  • #define MAX_BUF 64  
  •   
  •   
  • void main()  
  • {  
  •     int fd, len;  
  •     char buf[MAX_BUF];  
  •     int ch[5];  
  •     int i;  
  •   
  •   
  •     for(i=0;i<50;i++)  
  •     {  
  •         snprintf(buf,sizeof(buf),SYSFS_ADC_DIR);  
  •         fd = open(buf, O_RDONLY);  
  •         read(fd,ch,4);  
  •         printf("%s\n",ch);  
  •         close(fd);  
  •         usleep(1000);//pause for 1 ms  
  •     }  
  • }  

复制代码
这里只是读取了in_voltage*_raw文件中的字符串并输出,没有转变成整型数字,实际使用时肯定还得做转化。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

623

主题

887

帖子

6

粉丝