Enviando mediciones de ADC con UART

1

Quiero medir la señal con ADC y enviar mediciones a la PC para generar gráficos.

Mi código:

ADC_SoftwareStartConv(ADC3);
while(1)
{
    ADC3ConvertedVoltage = ADC3ConvertedValue * 3300/0xFFF;
    ADCresultsTab[i] = ADC3ConvertedVoltage;
    sprintf(str,"%u",ADC3ConvertedVoltage);
    USART2_SendText(str);
    USART2_SendText(";");
}

El problema es que quiero muestrear la señal tan rápido como sea posible. Aquí estoy usando baud rate = 256000 (solo Windows). ¿Cuál es la posibilidad de muestrear señales más rápido? ¿Cuál es el código más óptimo para la medición de muestras y envíos?

Veo que el problema allí es UART de transmisión.

Y mis preguntas adicionales son: ¿Es la medición en tiempo real con este código? ¿Cómo debería hacerse si quiero una medición en tiempo real?

    
pregunta krzych

2 respuestas

6

Si bien sería necesario un código basado en interrupciones o DMA más elaborado para lograr el mejor rendimiento, las mejoras relativamente menores en su código ya mejorarían la situación. Empezaría por transmitir muestras en binario en lugar de en texto. Esto requiere un poco más de trabajo en el extremo receptor, pero reducirá el ancho de banda de UART requerido en al menos 2-3x (2 bytes por muestra frente a 6 en el texto con separador). También puede aumentar fácilmente la velocidad en baudios a, por ejemplo, 921.6 kbps, que es estándar y debería estar bien apoyado en el extremo receptor. Suponiendo una arquitectura STM32F2 estándar, podría subir a 7,5 Mbps, pero tendría que verificar el soporte en el extremo receptor.

Con 2 bytes por muestra y 921.6 kbps, obtendría un rendimiento de aproximadamente 46'000 muestras / s. A 7.5Mbps, obtendrías 370'000 muestras / s. Si su aplicación lo permite, puede reducir la resolución a 8 bits y, por lo tanto, utilizar un solo byte por muestra, duplicando efectivamente el rendimiento en muestras / s.

Si bien 370ksamples / s no es malo, aún está bastante lejos de los 6Msamples / s teóricos (suponiendo STM32F2, conversión de 12 bits y uso de los 3 ADC en modo de triple intercalación). Esto se traduce en 12 MB / s de datos para transferir desde la MCU a la computadora, lo cual no es una cantidad trivial. UART no lo hará. SPI, a un máximo de 30Mbps (2-3MB / s) tampoco lo hará. Escribir en una tarjeta microSD a través de SDIO se acercaría. USB 2.0 lo haría, pero es mucho más complicado en cuanto a software y requiere componentes externos para el PHY. ETH también funcionaría bien, pero requeriría componentes adicionales y una pila de red para ser implementada en la MCU. Esta complejidad explica por qué, en la mayoría de las aplicaciones, las muestras se almacenan en la memoria y se transfieren de forma asíncrona.

    
respondido por el abey
1

Probablemente también vale la pena mencionar que la llamada sprintf es probablemente bastante lenta y (si es la única vez que la usa) extrae una gran cantidad de código de biblioteca. Incluso si quieres mantener el ascii legible para los humanos, probablemente podrías serializar el número mucho más rápido que el sprintf. Mientras lo hace, puede incluir el punto y coma en la cadena y hacer solo una llamada a USART2_SendText .

    
respondido por el Rob Starling

Lea otras preguntas en las etiquetas