¿Cuál es la forma más rápida de leer una señal analógica: Arduino / Raspberry Pi + ADC / Arduino + ADC?

Necesito muestrear señales de voltaje de 50 Hz de cuatro sensores de corriente CT y comparar las formas de onda con una señal de voltaje de la red eléctrica (reducida y compensada para ADC) para medir con precisión el consumo de energía de cuatro dispositivos.

Me gustaría obtener al menos 360 muestras para cada forma de onda por período, lo que significa un total de 1800 muestras por segundo. Dado que la frecuencia de la señal es de 50 Hz, esto significa una velocidad de lectura de 90 kHz .

Tengo disponible un ADC MCP3008 de 10 bits que utiliza una interfaz SPI, una placa Arduino Uno y una Raspberry Pi 2.

El MCP3008 tiene una tasa de muestreo máxima de 200 ksps ( hoja de datos ).

Los pines de entrada analógica de Arduino Uno se pueden leer a 10 kHz ( documentos oficiales ).

El Raspberry Pi puede funcionar con interfaces SPI a 20 kHz usando el controlador estándar de Linux, como se menciona aquí , aunque al pasar por alto el controlador estándar de Linux, supuestamente puede funcionar más rápido (no sé cuánto más rápido, hay muchos números diferentes siendo lanzado en línea).

Arduino Uno puede trabajar con interfaces SPI a velocidades mucho más altas que Raspberry Pi.

Por lo que puedo deducir, hay tres configuraciones para elegir:

  1. Leyendo los 5 valores directamente usando analogRead() del Arduino (claramente no funcionará)
  2. Usando el ADC MCP3008 con Raspberry Pi (¿es posible hacerlo lo suficientemente rápido con algunas modificaciones?)
  3. Usando el MCP3008 ADC con el Arduino

¿Se puede lograr la velocidad requerida utilizando cualquiera de las configuraciones mencionadas anteriormente? Si no, ¿cuál sería probablemente la velocidad máxima que se puede alcanzar?

Su declaración de la tasa de muestreo necesaria es menos que clara, ¿quizás se refiere a 360 muestras por período ? De todos modos, 10 bits a 200 KSPS implican un mínimo de un reloj SPI de 2 MHz. No estoy seguro de que pueda vincular el Arduino al pi más rápido que aproximadamente 1 MBP en serie asíncrona, a menos que descubra alguna forma de hacer una interfaz paralela, por lo que puede ser un cuello de botella. Es posible que desee ver algo como un motor de interfaz USB FT2232 o un MCU ARM Cortex, tal vez el STM32F303 que tiene USB, un ADC mucho más rápido de lo que necesita y más RAM disponible para almacenamiento en búfer.
Lo siento, mi error sobre las muestras por segundo. Además, no necesito monitorear continuamente las formas de onda, solo un conjunto de lecturas cada minuto más o menos, por lo que creo que transferir los datos no será un gran problema.
Muchas partes de ARM Cortex podrían hacer un gran trabajo al capturar sus muestras a través de su ADC y DMA internos, y luego reproducirlas en serie (o USB) a una velocidad más lenta en el pi. Tendrá que ver si el ATMega328p puede registrar las líneas SPI lo suficientemente rápido y almacenar en búfer el resultado completo antes de transmitir (probablemente no si le da a cada resultado 16 bits, apenas si empaqueta completamente 10 bits en bytes)
Hmm... Entonces, ¿interconectar el ADC con Rasbperry Pi es el enfoque preferido? ¿Crees que podrá sincronizar el ADC lo suficientemente rápido, con los ajustes apropiados?
No descartaría el arduino ADC tan rápido. El μC en el uno es el ATmega328 , que tiene un ADC de 10 bits que toma 13 ciclos de reloj ADC para cada muestra en modo de ejecución libre. Si bien la precisión de 10 bits solo es válida cuando la frecuencia de reloj del ADC está entre 50 y 200 kHz, puede sincronizar el ADC a 1 MHz, lo que permite 76,9 kSa/s con aproximadamente 8 bits de precisión. Para cambiar el canal ADC, usaría la interrupción completa de conversión ADC.
@M.Hassaan: no recomendaría intentar adquirir las muestras con el pi, a menos que tenga pruebas sólidas de que es posible y con poca fluctuación de reloj, el muestreo en tiempo real es generalmente una tarea que se adapta mucho mejor a un micro independiente con un motor SPI compatible con DMA o ADC interno.
Reducir el requisito de precisión a 8 bits también simplificaría el problema del almacenamiento en búfer de ATmega. Aún mejor sería si determina que no tiene que muestrear todos los canales intercalados al mismo tiempo, pero si pudiera recopilar un bloque completo de datos para cada uno (o cada uno y la referencia) a la vez, ya que reduciría tanto la frecuencia de muestreo como los requisitos de almacenamiento.
¿Son 360 muestras de corriente por ciclo de red o 360 muestras de corriente y voltaje? IOW, ¿se incluye el muestreo de voltaje en esos 90 kHz?
Sí, las muestras de voltaje están incluidas en los 90kHz. @Chris Stratton: ahora que lo menciona, podría medir el voltaje y solo una de las formas de onda actuales simultáneamente, transferir los datos y luego medir el siguiente par. Esto reduciría el requisito a 36.000 muestras por segundo. Entonces podría probar la idea de jms. ¡Gracias!
Luego, puede configurar el preescalador ADC en 32, lo que le brinda una frecuencia de reloj ADC de 500 kHz desde el reloj de 16 MHz. 500 kHz / 13 = 38,5 kSa/s, pero con mucho menos ruido en los bits menos significativos de lo que obtendría con una frecuencia de reloj ADC de 1 MHz. Si solo necesita los 8 bits más significativos, puede establecer el bit ADLAR (resultado de ajuste izquierdo de ADC) en el registro ADMUX, que desplaza los 8 bits más significativos al registro ADCH, lo que elimina la necesidad de operaciones de enmascaramiento y desplazamiento de bits en su código. .
Gracias. Probaré ambos valores y compararé la precisión.
Parece que puede estar en el camino hacia una solución. Otra cosa a considerar es si el pequeño error de fase de muestrear la corriente y el voltaje a su vez en lugar de en paralelo importará, o si puede cancelarse en gran medida en una forma de onda completa (aunque eso supone una simetría que puede no estar presente para algunas cargas - un turista con un adaptador de voltaje rectificador es un ejemplo extremo)
Estaba pensando en tratar de resolver este problema calculando el tiempo de demora entre dos lecturas y cambiando una de las formas de onda en esa cantidad. Este procesamiento probablemente se realizará en Rasbperry Pi después de obtener cada conjunto de lecturas.
No tendrá que cronometrarlo, a una frecuencia de reloj ADC de 500 kHz y con el ADC en modo de ejecución libre, la hoja de datos garantiza que las muestras se produzcan cada 26 μs. Si alterna entre dos entradas en cada muestra, el retardo siempre será de 26 μs y las muestras sucesivas de cada canal siempre estarán separadas por 52 μs.

Respuestas (2)

Si puede obtener la oscilación de voltaje de la señal escalada dentro de 1Vpp, probablemente pueda usar la tarjeta de sonido de su computadora. Tres tarjetas de sonido USB que admiten una frecuencia de muestreo de 192 kHz y está listo para comenzar.

Inteligente :) ¡Me gusta! Pero es necesario tener 5 canales, no estoy seguro si es fácil encontrar una tarjeta de sonido con capacidad de entrada de 5 canales. Por supuesto, múltiples tarjetas de sonido podrían ser una solución :) Me gusta esta idea ya que la medición de voltaje y corriente está precisamente sincronizada en una entrada estéreo.
@GeeBee Cada tarjeta de sonido tiene 3 canales de entrada, uno en el micrófono, dos en línea. Además, no hay nada que le impida conectar varias tarjetas de sonido USB baratas a una computadora.
Me temo que solo hay un ADC estéreo. Aunque tenga múltiples entradas, no puede ADC todas ellas al mismo tiempo. El problema con varias tarjetas es mantenerlas sincronizadas con prácticamente cero fluctuaciones. Una fluctuación de menos de 55 microsegundos es aceptable. Aunque en el pasado me divertía programando tarjetas de sonido en ensamblaje y configurando los canales DMA, realmente siento que mantener múltiples tarjetas de sonido en esta sincronización dura sería un verdadero desafío. ¿Tienes una solución para eso?
@GeeBee Todavía puede usar más de una tarjeta de sonido USB en una computadora.
@Maxton Chan Estoy de acuerdo en que puedes. El problema es que necesitamos calcular la potencia, y para eso necesitamos multiplicar las formas de onda de corriente y voltaje juntas. Por lo tanto, los 5 canales deben estar realmente sincronizados (como el canal izquierdo y derecho de un ADC estéreo). Su solución podría funcionar bien en tarjetas de sonido de calidad de estudio con ADC de 6 canales, lo que probablemente sea mucho más complicado que usar un chip MCP3909, ¿no? :)
Dado que tiene 4 salidas, puede utilizar las señales de entrada de línea de 4 tarjetas de sonido USB. Todos los canales izquierdos están en paralelo y se usan como señal de detección de voltaje; y los canales derechos se utilizan como sentido de corriente para cada salida. Esto le proporciona 4 conjuntos de lecturas digitales de fase coincidente independientes. Por cierto, dado que ya está usando una computadora, puede dejar que la GPU haga la multiplicación (y FFT si es necesario) ya que es masivamente paralela y no tiene ramificación.
Ahora estamos hablando :) Votó a favor de su comentario. ¡Con 4 ADC de voltaje + corriente separados funcionará de maravilla! No hay necesidad de ninguna magia de GPU, FFT es tan fácil que la CPU puede hacerlo antes del desayuno :) (Los datos no se procesan en tiempo real en la PC, los obtuvimos como bloques de, digamos, 20 ms desde el controlador, así que hay mucho tiempo para hacer cualquier cálculo.)

¿Qué pasa con el uso de un chip meterig como MCP3909?

Hay un buen conjunto de información sobre este tema en http://www.microchip.com/design-centers/utility-metering-solutions/electric-meter/overview

La medición adecuada de la potencia no es un tema fácil. No solo necesita medir tanto la potencia como la corriente a una frecuencia de muestreo y una resolución muy altas, sino que también necesita hacer las multiplicaciones en tiempo real. Estos chips de medición de servicios públicos dedicados harán todo esto por usted, y algunos de ellos también brindan información de energía adicional, como el factor de potencia.

Desafortunadamente no tengo tiempo para pedirlos en este momento. Tardará demasiado en enviarse a los Emiratos Árabes Unidos.
De hecho, podría valer la pena considerar un chip dedicado sin ese problema de envío (especialmente porque la posibilidad de un pi apunta a que se trata de un proyecto único o de bajo volumen en lugar de un proyecto optimizado en costos). Sin embargo, el comentario sobre la multiplicación en tiempo real es incorrecto. Lo que se necesita es multiplicar las lecturas de tensión y corriente desde el mismo punto en el tiempo; sin embargo, el cálculo real se puede realizar de forma asincrónica en un punto posterior, siempre que los valores se recopilen, almacenen y multipliquen de forma que mantengan su correspondencia temporal.
Bueno... el problema es a la vez . No puede medir la corriente y el voltaje al mismo tiempo con los ADC de entrada multiplexados; esto en sí mismo puede producir algunos errores de medición (mínimos). Almacenar las medidas puede ser más problemático que hacer la multiplicación. Se necesitan 10 kilobytes para 1 segundo de datos, y si necesitamos más datos, tenemos que ir a algún flash o ram externo (escribir eso en serie es en realidad más lento que hacer la multiplicación, ¿no?)
@M.Hassaan, ¿puedes renunciar a algo de las especificaciones? Por ejemplo, si la carga es resistiva (o tiene una corrección del factor de potencia), verá buenas ondas sinusoidales tanto en la corriente como en el voltaje. A continuación, puede realizar mediciones aceptables con una tasa de reducción mucho menor, por ejemplo, 100 muestras por período de 20 mS, o incluso menos. De hecho, si tiene ondas sinusoidales, está bien encontrar el cruce por cero en la corriente y el voltaje para calcular un factor de potencia. Luego, puede leer solo el sensor de corriente durante unos 20 mS para obtener un máximo, lo mismo con el sensor de voltaje. Entonces puedes hacer una aproximación matemática de la...
No estoy seguro de cuál será la carga, ya que quiero que el usuario pueda conectar cualquier dispositivo <10A y medir el consumo de energía. Sin embargo, no creo que necesite almacenar 1 segundo de información. 1 o 2 períodos serán suficientes, y cambiaré una de las formas de onda en el tiempo después de calcular el tiempo que lleva completar una lectura. Con suerte, eso reducirá el error de fase y ayudará a aproximar una lectura paralela.
...consumo. Si su carga es realmente resistiva, puede dar una buena estimación simplemente leyendo el máximo de los sensores de corriente. Esto es lo que hacen los medidores de potencia baratos "clip it to your cable", ya que asumen un voltaje de CA fijo y no hay cambio de fase entre la corriente y el voltaje.
Usar una Raspberry no es una buena opción, ya que tiene que jugar con los desafíos del software (la fluctuación de lectura debido al manejo de interrupciones). Sugiero ir con Arduino. Si aún necesita la frecuencia de muestreo alta, intente "entrelazar" sus lecturas. Primero, obtenga 180 muestras en 20 ms (muestras "pares"), luego, después de 55 microsegundos, comience otra lectura: muestras "impares". Esto reduce a la mitad su tasa de muestreo ADC real. Es posible que necesite varios segundos de datos para calcular buenos resultados. La mayoría de las cargas tienen un comportamiento transitorio extraño al momento del encendido.
¡Idea interesante! La referencia de Arduino establece que la función delayMicroseconds() produce resultados precisos para retrasos superiores a 3us: arduino.cc/en/Reference/DelayMicroseconds . Aún así, podría retrasar un período adicional: 20ms + 55us solo para estar seguro...
He trabajado en un circuito de medición. Usé BL0921. El circuito es bastante simple. Una vez que haya hecho el circuito completo, necesita calibrarlo contra algún medidor estándar. Usé otro medidor de energía del mercado ya que no necesitaba una precisión muy alta. Puede obtener el IC de China dentro de una semana si selecciona un servicio de mensajería rápido. Usé DHL. Usé Alibaba para buscar proveedores.