Adquisición de datos con Python en un Beaglebone Black - Aumento de la velocidad de muestreo

0

Esta es mi primera incursión en la programación y el uso de un BeagleBone Black. Tengo algo de experiencia limitada en Python, y lo he utilizado dentro del IDE de Cloud9 proporcionado para capturar datos y escribirlos en un marco de datos de pandas, consulte el código a continuación.

Mientras el código funciona, he probado utilizando los pines P9_32 y P9_34 con un par de resistencias para generar ~ 1.29 voltios, y luego leo este voltaje como una entrada ADC en el pin P9_40. La frecuencia de muestreo es muy lenta, 113 - 116 muestras por segundo. El mínimo que necesito para la tarea que tengo a mano es de aproximadamente 400Hz por canal. Si bien puedo muestrear canales de forma secuencial, prefiero tener 4 canales operativos para un total de 1600Hz de frecuencia de muestreo.

¿Es posible un aumento significativo en la frecuencia de muestreo al optimizar o alterar el Código Python que tengo? Si no es así, ¿cuál es el método recomendado para la adquisición de datos a través del ADC en el Beaglebone Black?

import Adafruit_BBIO.ADC as ADC
import pandas as pd
import numpy as np
import time
import matplotlib.pyplot as plt

ADC.setup()
value = ADC.read("P9_40")
voltage = value * 1.8 #1.8V
value2 = ADC.read_raw("P9_40")

print(voltage)
print(value2)

df_ = pd.DataFrame()

timeout_start = time.time()
timeout = 5 #seconds
print(timeout_start)

def DAQ():
    d = []
    count = 0
    while  time.time() < timeout_start + timeout:
        value = ADC.read("P9_40")
        voltage = value * 1.8
        d.append((count, time.time(), voltage))
        count = count+1
        out1 = {'count': count, 'df': pd.DataFrame(d, columns=('count', 'Time', 'Signal Amplitude'))}
    return out1

x = DAQ()
count = x['count']
df = x['df']

print('end loop')
print(count, 'number of iterations', count/(time.time()-timeout_start), 'samples per second')
print(df)

print(df['Time'])
print(df['Signal Amplitude'])

#plt.plot([df['Time']],[df['Signal Amplitude']])
#plt.show()

#plt.figure()
#for count in df:
#    plt.plot(n[0], n[1], label=n[2])
#    plt.axis([0,count,0,60])
#plt.legend(loc=0, frameon=False)

Gracias,

P.S. Si alguien puede proporcionar orientación sobre cómo trazar gráficos en el BBB, lo apreciaría.

    
pregunta chopboy

1 respuesta

2

La biblioteca que está utilizando no es capaz de hacer lo que quiere. Solo puede entregar valores únicos tan rápido como su bucle pueda leerlos.

Necesita una biblioteca diferente que pueda acceder mejor al hardware.

El Beaglebone Black tiene lo que se llama una unidad de tiempo real programable (PRU). Se pueden programar para hacer cosas que se deben hacer rápidamente, como muestrear el ADC a alta velocidad.

PyPRUSS da acceso a todas las funciones de PRU con una API de Python. Puede ser una exageración para lo que necesitas.

También hay beaglebone_pru_adc que envuelve solo el acceso a las funciones PRU ADC. Puede entregar valores individuales a pedido, pero también tiene lo que el desarrollador llama el modo "osciloscopio", en el que toma un montón de muestras y las devuelve en un solo paquete.

Uno u otro de esos dos debería hacer el truco.

    
respondido por el JRE

Lea otras preguntas en las etiquetas