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


这段代码花费的时间更少(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可以做到,但我找不到明确的方法。任何帮助表示赞赏。
提前致谢。

最佳答案

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

在像Linux这样的非实时操作系统中,要以5 µs的延迟工作是不可能的。您将无法使用OS来计划执行线程。其他内核线程将具有优先级,并会抢占您的线程,即使您为其分配了最高的调度优先级也是如此。

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


完全绕过OS并为裸露的AM335x处理器(无OS)编写C程序。
使用另一种硬件-带有缓冲区的ADC可在程序被抢占时累加样本。
在BBB上使用PRUSS处理器。它们以200 MHz的频率运行,因此,如果您遇到一个紧密循环,例如20条装配说明,您将获得10 MHz的可靠采样率。就是说,如果您首先拥有一个更快的ADC,那么它当然可以轻松处理普通的200 KHz ADC。


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

关于sampling - 增加Beaglebone Black ADC采样率?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25796901/

10-16 21:02