增加Beaglebone Black ADC采样率?

use*_*524 2 sampling adc cloud9-ide beagleboneblack

我正在开发一个需要使用微控制器的项目,因此我决定使用Beaglebone Black.我还是Beaglebone世界的新手,我面临一些问题,希望你们能帮助我.

在我的项目中,我将不得不连续读取所有7个模拟读取引脚并进行相应的处理.我的问题是,最快的编程语言是什么(我必须在很短的时间内尽可能多地读取样本!)以及如何将采样率从KHz提高到MHz?

我尝试了以下代码:

Javascript代码:

var b = require('bonescript');//this variable is to refer to my beaglebone
time = new Date();
b.analogRead("P9_39");
console.log(new Date() - time);
Run Code Online (Sandbox Code Playgroud)

此代码将只执行一次模拟读取,并将打印出执行读取所需的时间.令人惊讶的是,结果是111ms !! 这意味着如果我没错,我的采样率是10.

另一种方法是使用pyhton:

import Adafruit_BBIO.ADC as ADC
import time

ADC.setup()
millis = int(round(time.time() * 1000))
ADC.read_raw("P9_39")
millis = millis = int(round(time.time() * 1000)) - millis
print millis
Run Code Online (Sandbox Code Playgroud)

这段代码花费的时间较少(4ms)但是,如果我想从7个模拟输入引脚读取,我将只能读取每个35个样本.

使用终端:

echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots
time cat /sys/devices/ocp.3/helper.15/AIN0
############OR############
time cat /sys/devices/ocp.3/44e0d000.tscadc/tiadc/iio\:device0/in_voltage0_raw 
Run Code Online (Sandbox Code Playgroud)

这耗时50ms.

我希望我的采样率是MHz.我怎么能这样做?我知道Beaglebone Black能够做到这一点,但我找不到明确的方法.任何帮助表示赞赏.提前致谢.

sev*_*tov 7

AM335x ADC的采样率为200K(链路).这意味着您不会使用BeagleBone Black ADC进入MHz范围.

要在像Linux这样的非实时操作系统中使用5μs的延迟工作是不可能的.您将受操作系统的怜悯来安排您的执行线程.其他内核线程将优先使用并抢占您的线程,即使您为其分配了最高的调度优先级.

根据我在BeagleBone Black上使用数字IO的经验,我说看到错过的帧每秒开始大约1K样本.现在,它将取决于您对丢失样本的容忍程度 - 如果您只需要半可靠地工作,您可以通过切换到C/C++并通过nice --10 ...命令提高过程的优先级来每秒挤出10 K样本.但是,如果您无法容忍错过的帧,则必须执行以下操作之一:

  1. 完全绕过OS并为裸AM335x处理器(无操作系统)编写C程序.
  2. 使用另一个硬件 - 带有缓冲区的ADC,在程序被抢占时累积样本.
  3. 在BBB上使用PRUSS处理器.它们以200 MHz的频率运行,因此如果您有一个紧凑的环路,例如20个汇编指令,您将获得10 MHz的可靠采样率.也就是说,如果您首先使用更快的ADC,当然它可以轻松处理200 KHz ADC.

我个人选择了#3选项,很高兴看到我的设备非常可靠地执行亚毫秒GPIO操作.

  • TI的最新文档(http://www.ti.com/lit/ug/spruh73p/spruh73p.pdf#page=1827)声称ADC的时钟为24MHz,这将理论上的最大读取速度提高到1.6 M个样本/秒 (2认同)