增加Beaglebone Black ADC采样率?

时间:2014-09-11 21:03:38

标签: sampling beagleboneblack cloud9-ide adc

我正在开发一个需要使用微控制器的项目,因此我决定使用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);

此代码只执行一次模拟读取,并打印出执行读取所需的时间。令人惊讶的是,结果是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

这段代码花费的时间较少(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 

这需要50ms。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

  1. 完全绕过OS并为裸AM335x处理器(无操作系统)编写C程序。
  2. 使用另一个硬件 - 带有缓冲区的ADC,在程序被抢占时累积样本。
  3. 在BBB上使用PRUSS处理器。它们以200 MHz运行,所以如果你有一个紧密的循环,例如20个装配说明,您将获得10 MHz的可靠采样率。也就是说,如果您首先使用更快的ADC,当然它可以轻松处理200 KHz ADC。
  4. 我个人选择了#3选项,很高兴看到我的设备非常可靠地执行亚毫秒级GPIO操作。

答案 1 :(得分:0)

使用插入 127 个 USB 集线器端口的 127 个 beaglebone blacks 和 breakout visual basic 并编写一个 USB 程序,以自动顺序触发 127 个 beagle bone 一个接一个并读取文本框中的数据......你将获得大约 16 mhz / msps 连续 adc 每个快速 cpu 与说 windows 10 ....lyj2021 你可能有重叠的数据......但是你可以用每个小猎犬骨黑的每次火来跟踪这个......连续......