Quiero medir la señal ADC
y enviar las medidas 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 lo más rápido 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 ahí es UART
la transmisión.
Y mis preguntas adicionales son: ¿Es la medición en tiempo real con este código? ¿Cómo se debe hacer si quiero medir en tiempo real?
Si bien sería necesario un código más elaborado basado en interrupciones o DMA para lograr el mejor rendimiento, mejoras relativamente menores en su código ya mejorarían la situación. Comenzaría transmitiendo 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 UART requerido en al menos 2-3 veces (2 bytes por muestra frente a hasta 6 en 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 ser compatible con el extremo receptor. Suponiendo una arquitectura STM32F2 estándar, podría subir hasta 7,5 Mbps, pero necesitaría verificar el soporte para eso en el extremo receptor.
Con 2 bytes por muestra y 921,6 kbps, obtendrá un rendimiento de alrededor de 46 000 muestras/s. A 7,5 Mbps, obtendría 370 000 muestras/s. Si su aplicación lo permite, puede reducir la resolución a 8 bits y, por lo tanto, usar un solo byte por muestra, duplicando efectivamente el rendimiento en muestras/s.
Si bien 370 kmuestras/s no está mal, todavía está bastante lejos de los 6 Mmuestras/s teóricos (asumiendo STM32F2, conversión de 12 bits y usando el 3 ADC en modo triple intercalado). Esto se traduce en 12 MB/s de datos para transferir desde la MCU a la computadora, que no es una cantidad trivial. UART no servirá. SPI, a un máximo de 30Mbps (2-3MB/s) tampoco lo hará. Escribir en una tarjeta microSD a través de SDIO estaría cerca. USB 2.0 lo haría, pero es mucho más complicado en cuanto al 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 implementarse 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.
Probablemente también valga la pena mencionar que la sprintf
llamada probablemente sea bastante lenta y (si es la única vez que la usa) extrae una gran cantidad de código de biblioteca. Incluso si desea mantener un ascii legible por humanos, probablemente podría serializar el número mucho más rápido que sprintf. Mientras está en eso, puede incluir el punto y coma en la cadena y hacer solo una llamada a USART2_SendText
.
yippie
krzych
yippie
fm_andreas
lior bilia
scott seidman