STM32F107 SPI - Velocidad de transferencia máxima de UART

0

Estoy diseñando una placa con STM32F107 microcontrolador y AD7680 ADC. Lo que necesito es leer los datos de ADC, aumentar el número de secuencia después de leer cada muestra y enviar los valores de ADC a través de UART o USB OTG (dispositivo USB CDC) a una computadora. También necesito capturar el flanco ascendente en un solo pin de activación GPIO y recordar el número de secuencia en el momento de la activación.

La principal limitación es la velocidad, necesito hacerlo lo más rápido posible. Como no tengo mucha experiencia con Cortex MCU, tengo dos preguntas:

  • ¿Es posible lograr este escenario utilizando DMA (es decir, sin algún bucle que consumirá todo el tiempo de CPU)?

  • Lo sé, es difícil, pero ¿alguien puede estimar la tasa de muestreo máxima alcanzable (5 kHz, 20 kHz, 50 kHz ...)?

Gracias de antemano, cualquier sugerencia es bienvenida.

Klasyc

    
pregunta klasyc

1 respuesta

3

Se puede usar DMA, pero tiene sentido solo si reúne las muestras en "bloques". Por ejemplo, DMA toma 100 muestras de ADC y las coloca en alguna área de la memoria. Una vez hecho esto, envía el bloque completo a través del UART, utilizando otro canal DMA y, simultáneamente, el primer canal DMA toma otras 100 muestras de ADC a otra área de la memoria. Repetir.

Sin embargo, no funciona igual con la interfaz USB en STM32F107. DMA no interactúa directamente con USB, porque USB tiene un búfer de paquetes dedicado. Sin embargo, podría usar DMA para transferir datos a este paquete de búfer.

Sin embargo, todavía debes tener un bucle principal, obviamente. Solo se llamará cada 100 muestras en lugar de para cada muestra, lo que liberará algo de potencia de CPU. Pero el compromiso es que hay una latencia adicional para obtener las muestras.

Ahora, para estimar la velocidad de datos máxima, hay tres factores limitantes: la CPU, el ADC y la interfaz de comunicación de salida. Creo que la CPU, a menos que la ejecute a una frecuencia muy baja, no será el cuello de botella. El cuello de botella serán los periféricos. El ADC realiza la conversión en aproximadamente 1µS, por lo que está bien para las tasas que menciona en su pregunta. Ahora, el periférico de salida: si es el UART, todo depende de la velocidad en baudios que se pretenda utilizar, y la matemática se realiza rápidamente: a 4,5 Mbit / s (velocidad máxima para USART1), con 16 bits por muestra (ADC es de 12 bits, pero tiene que redondear el tamaño de la muestra a un byte completo), hace aproximadamente 280 ksamples / segundos. Tal vez tengas algo de sobrecarga debido al protocolo, así que hazlo un poco menos. Para USB, la matemática es la misma, excepto que la velocidad de comunicación es de 12 MBit / s, pero la sobrecarga del protocolo será mayor. Al final, podrás ir al menos tan rápido como con el USART.

Editar : Lo siento, me acabo de dar cuenta de que el ADC es externo. Pero no cambia lo que dije, excepto que las muestras provienen de SPI (y DMA debería interactuar con SPI, entonces). Entonces, el factor limitante aquí será el ADC en sí, a 100kps.

    
respondido por el dim

Lea otras preguntas en las etiquetas