提高 Beaglebone Black ADC 采样率?

Posted

技术标签:

【中文标题】提高 Beaglebone Black ADC 采样率?【英文标题】:Increase Beaglebone Black ADC sampling rate? 【发布时间】:2014-11-05 23:03:23 【问题描述】:

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

此代码将仅执行一次模拟读取,并打印出执行读取所需的时间。令人惊讶的是,结果是 111 毫秒!!这意味着如果我没记错的话,我的采样率为 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

这段代码花费的时间更少(4 毫秒),但如果我想从 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 

这需要 50 毫秒。

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

【问题讨论】:

【参考方案1】:

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

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

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

    完全绕过操作系统并为裸 AM335x 处理器(无操作系统)编写 C 程序。 在您的程序被抢占时,使用另一个硬件 - 一个带有缓冲器的 ADC 来累积样本。 在 BBB 上使用 PRUSS 处理器。它们以 200 MHz 运行,所以如果你有一个紧密的循环,例如20 条组装说明,您将获得 10 MHz 的可靠采样率。也就是说,如果您首先拥有一个更快的 ADC,那么它当然可以轻松处理现有的 200 KHz ADC。

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

【讨论】:

谢谢先生。任何代码和如何取悦?谢谢。 @user3787524,我将从搜索任何现有的 PRUSS 库开始。 Libpruio 听起来很有希望,但我从未使用过它。如果您找不到适合您要求的东西,则必须在 PRUSS 汇编器中对其进行编码。我在 C++ 汇编程序中使用 prussdrv user mode library from TI 进行了此操作,虽然调试 PRUSS 汇编程序代码很痛苦,但相对简单。 任何如何教程?或知道如何操作的步骤? @user3787524,我找不到我正在使用的链接(那是一年前的),但谷歌搜索“prussdrv 编程”得到的教程很少,包含分步说明。 最新的 documentation from TI 声称 ADC 的时钟频率为 24MHz,这将理论最大读取速度提高到 1.6M 样本/秒。【参考方案2】:

使用插入 127 个 USB 集线器端口的 127 个 beaglebone blacks 并突破 Visual Basic 并编写一个 USB 程序以自动顺序触发 127 个 beaglebone 1 一个接一个并读取文本框中的数据...您将获得大约 16 mhz /每个快速 cpu 的 msps 连续 adc,比如 windows 10 ....lyj2021 您可能有重叠数据...但是您可以通过每只比格犬骨黑的每次火灾来跟踪这一点...连续...

【讨论】:

要获得 mhz 频率,您需要与 fcc 争论,因为它们限制了 adc 通信……主要的操作系统创建者和芯片制造商也是如此……您需要重新设计所有这些东西然后你就可以破解信号了……你也许可以用 USB 和大内存深度安装示波器来记录快速样本……直到你能真正从头开始构建这些东西,他们不会让你有一个大的带宽......它全部加密并锁定......lyj2021

以上是关于提高 Beaglebone Black ADC 采样率?的主要内容,如果未能解决你的问题,请参考以下文章

Beaglebone Black教程Beaglebone Black的引脚分配

BeagleBone Black教程之BeagleBone Black设备的连接

Beaglebone Black扩展板开发(零):缘起

Barebox 如何为 Beaglebone Black 启动?

BeagleBone Black–ESP8266 UDP 服务

为 Beaglebone Black 构建 DAHDI