完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的。所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充。 ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC。 以下的所有操作均在上一节新建立好的Eclipse 环境下。 BBB板ADC需要用到两个目录: 1、/sys/devices/bone_capemgr.9/ 加载ADC设备树的目录,有些版本可能为bone_capemgr.8或其他数字,具体根据自己的板来做; 2、/sys/bus/iio/devices/ 这个目录是ADC设备加载后的设备数据目录,读取ADC数据就是这在主目录下进行的; 通过Eclipse工作界面,分别打开这两个目录,可以用dir 或 ls –all 命令查看下缺省状态下都有什么文件,可以同时打开多个字符终端,而且不用反复输入CD命令来切换目录,这个远程资源管理器是非常方便的。
1、加载ADC设备 命令为:# echo BB-ADC > /sys/devices/bone_capemgr.9/slots 其实和之前打开GPIO类似,都是用echo命令实现的,具体的这个加载变量名称:BB-ADC是如何来的,我也不太清楚,但有可能是从/lib/firmware/下的设备树(device tree)相应dtbo文件名来的,我的BBB板这个目录下没有一个dts文件,都需要反编译回来才行。 在左下方打开的字符终端,因为我直接进入相应目录,命令路径不用那么长,直接执行:echo BB-ADC > slots 就行了。 然后打开另一个设备数据的字符终端,直接执行:dir 增加了一个目录:iio:device0,之前是没有的,执行了echo BB-ADC > slots 才加载出来的。
2、查看相应的ADC数据 利用Eclipse工作界面的远程文件系统再打开相应的iio:device0 ,再开多一个Terminals窗口,充分利用这个无缝功能,可以省去输入“ cd iio:device0”这类切换目录的手工输入操作,查看下iio:device0的文件: 其中的in_voltage0_raw、in_voltage1_raw至in_voltage7_raw共8个文件就是BBB板8个ADC引脚的值,这时可以用cat 命令来查看下其中的数值:
可以看到in_voltage0_raw 数据值为3959 in_voltage1_raw数据值为3462 in_voltage2_raw数据值为3821
这些数值每次读取的都会不一样,在一个很小的范围内波动,这个是正常的。 BBB板的ADC是12位的,所以这个数值是0---4095之间的数值,对应着0—1.8V的输入电压(注:BBB板ADC管脚最大只能输入1.8V,以后真正用的时候得注意传感器放大后的输入电压量,否则就弄烧板了)。 3、编程实现ADC数据读取 直接在右侧文件系统中通过右键菜单建立新文件,我固定使用/home/binc目录,之前说过,你可以根据自己喜欢来做,这里新建abc1.cpp,点击完成就可以了。就像在XP下操作硬盘一样操作BBB板的文件系统,真的无缝连接。
然后在文件代码窗口中输入以下代码并保存 #include #include #define ADC_DIR"/sys/bus/iio/devices/" main() { FILE *stream=NULL; int i=0; char a[10]; /*字符串数组,10位,那些ADC值3959之类其实有4位就够了*/ stream=fopen(ADC_DIR"iio:device0/in_voltage0_raw","r+"); if (stream==NULL) /*假如没有文件就执行加载ADC*/ { stream=fopen("/sys/devices/bone_capemgr.9/slots","w"); fwrite("BB-ADC",sizeof(int),6,stream); /*BB-ADC有6个字符*/ fclose(stream); stream=fopen(ADC_DIR"iio:device0/in_voltage0_raw","r+"); } fscanf(stream,"%s",a); printf("in_voltage0_raw:%s n",a); /*0号ADC*/ fclose(stream); stream=fopen(ADC_DIR"iio:device0/in_voltage1_raw","r+"); fscanf(stream,"%s",a); printf("in_voltage1_raw:%s n",a); /*1号ADC*/ fclose(stream); stream=fopen(ADC_DIR"iio:device0/in_voltage2_raw","r+"); fscanf(stream,"%s",a); printf("in_voltage2_raw:%s n",a); /*2号ADC*/ fclose(stream); } 4、编译执行 进入文件目录编译,就不用写那么长的路径名称,执行:g++ -o abc1abc1.cpp 生成abc1 执行:./adc1 ,三个数值显示就出来了。全OK吧!
可以手动执行cat 命令比较下编程得到的数值,有一点点波动的,数值不会完全一样:
网上一高手说,他把采样速度增大10倍,每0.1毫秒采样一次,就会出现连续重复的数值,所以他指出BBB板的ADC刷新速度是毫秒级的,足够应用了! 小试ADC读取数值就讲到这。休息一会! |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
164个成员聚集在这个小组
加入小组BBB通过sd卡启动ubuntu16.04后不能升级下载联网的问题
4371 浏览 2 评论
3144 浏览 0 评论
7429 浏览 5 评论
294浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-2 09:35 , Processed in 0.637665 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号