2014-09-11 3 views
2

저는 마이크로 컨트롤러를 사용해야하는 프로젝트를 진행하고 있습니다. 따라서이 Beaglebone Black을 사용하기로 결정했습니다. 나는 아직도 Beaglebone 세계에 새로운 사람이고 나는 너희들이 나를 도울 수 있기를 바라는 몇 가지 문제에 직면하고있다.Beaglebone Black ADC 샘플링 속도가 증가합니까?

내 프로젝트에서 필자는 7 개의 아날로그 읽기 핀을 모두 지속적으로 읽고 그에 따라 처리해야 할 것입니다. 제 질문은, 가장 빠른 프로그래밍 언어가 될 것입니다 (가능한 한 많은 샘플을 아주 짧은 시간에 읽어야합니다!) 그리고 KHz에서 MHz로 샘플링 속도를 높이는 방법은 무엇입니까?

자바 스크립트 코드 :

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임을 의미합니다. 나는 7 아날로그 입력 핀을 형성 읽고 싶다면

이 코드는 여전히 적은 시간 (4ms의)하지만했다
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 

, 난 단지 약 35를 읽을 수 있습니다 :

대안

은 pyhton 사용했다 각각의 샘플.

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이 가능하다는 것을 알고 있지만 명확한 방법을 찾지 못했습니다. 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

답변

4

AM335x ADC의 샘플링 속도는 200K (link)입니다. 즉 BeagleBone Black ADC를 사용하면 MHz 범위에 들어 가지 않습니다.

Linux와 같이 비 실시간 OS에서 5μs의 대기 시간을 갖는 무언가를 얻으려면 불가능합니다. 실행 스레드를 예약하려면 OS가 필요합니다. 가장 높은 스케줄링 우선 순위를 할당하더라도 다른 커널 스레드가 우선 순위를 가지며 스레드를 선점합니다.

BeagleBone Black의 디지털 IO에 대한 필자의 경험에 비추어 볼 때, 1 초당 약 1K 샘플을 시작하는 부재 중 프레임을 보았습니다. 이제는 누락 된 샘플에 대한 내결함성 수준에 따라 달라집니다. 반 안정적으로 작업해야하는 경우 C/C++로 전환하고 nice --10 ... 명령을 사용하여 프로세스의 우선 순위를 높이면 초당 10 K 샘플을 압축 할 수 있습니다. 알몸 AM335x 프로세서 (NO OS)에 대한 C 프로그램을 완전히

  1. 바이 패스 OS 및 쓰기 : 당신이 놓친 프레임을 용인 할 수 없다 그러나, 당신은 다음 중 하나를 수행해야합니다.
  2. 다른 하드웨어 - 프로그램이 선점되는 동안 샘플을 누적하는 버퍼가있는 ADC를 사용하십시오.
  3. BBB에서 PRUSS 프로세서를 사용하십시오. 그들은 200 MHz에서 실행되므로, 예를 들어 20 개의 어셈블리 명령을 사용하면 10 MHz의 안정적인 샘플링 속도를 얻을 수 있습니다. 첫 번째 장소에서 더 빠른 ADC를 사용하면 물론 200kHz ADC를 쉽게 처리 할 수 ​​있습니다.

저는 개인적으로 옵션 # 3을 사용했으며 내 장치가 밀리 초 GPIO 작업을 매우 안정적으로 수행하는 것을 보았습니다.

+0

고맙습니다. ANY 코드와 기쁘게하는 방법? 감사. – user3787524

+0

@ user3787524, 나는 기존 PRUSS 라이브러리를 검색하는 것으로 시작합니다. [Libpruio] (http://beagleboard.org/project/libpruio/)는 유망한 것으로 들리지만 결코 사용하지 않았습니다. 요구 사항에 맞는 것을 찾을 수 없다면 PRUSS 어셈블러에서 모든 것을 코딩해야합니다. 나는 PRUSS 어셈블러 코드를 디버깅하는 것이 고통 스럽긴했지만 C++을 사용하는 어셈블러에서 이것을 수행했다. [TI의 prussdrv 사용자 모드 라이브러리] (http://processors.wiki.ti.com/index.php/PRU_Linux_Application_Loader_API_Guide)는 비교적 간단했다. –

+0

자습서 사용법 또는 그렇게하는 방법을 알기위한 단계? – user3787524

관련 문제