Voy a dejarte trabajar en los detalles para tu caso en particular, pero me gustaría añadir un poco más de claridad.
En primer lugar, he abierto un informe de errata sobre RM0410 (el manual de referencia para mi chip) aquí.
Haré referencia al Manual de Referencia RM0410 Rev 4, que es el Manual de Referencia que necesito para mi caso. Esto no es para tu chip. Tendrás que encontrar el adecuado para tu chip.
Los chips de ST te permiten elegir un tiempo de muestreo del ADC y una resolución.
RM0410 p473. Aquí tienes algunas opciones de tiempo de muestreo para mí. Van desde 3 hasta 480 ciclos de ADCCLK. Los he destacado a continuación:
son:
3 ciclos
15 ciclos
28 ciclos
56 ciclos
84 ciclos
112 ciclos
144 ciclos
480 ciclos
Puedes ver estos en el menú desplegable de STM32CubeMX:
Cada ciclo de reloj es igual a un ciclo de reloj ADC, llamado ADCCLK
en el RM. La ecuación para la frecuencia de ADCCLK es:
ADCCLK = PCLK2 / prescaler
Donde prescaler
puede ser 2, 4, 6 o 8.
Utiliza STM32CubeMX para ver estos valores de prescaler desde el menú desplegable también. Notarás que PCLK2 dividido por 2
está en gris para mí, lo que significa que es un valor inválido para mi configuración, probablemente porque resultaría en un reloj ADC demasiado rápido.
El tiempo de conversión se basa en la resolución de bits que has establecido para tu ADC. Las opciones son 12 bits, 10 bits, 8 bits o 6 bits.
El tiempo de conversión basado en la resolución del ADC es el siguiente:
12 bits --> 12 ciclos de ADCCLK
10 bits --> 10 ciclos de ADCCLK
8 bits --> 8 ciclos de ADCCLK
6 bits --> 6 ciclos de ADCCLK
Como puedes ver en los cuatro casos anteriores, dividir los ciclos de reloj por los bits de resolución resulta exactamente en 1 ciclo_de_reloj_ADC/bit_de_resolución
, lo cual tiene sentido intuitivo para mí. Lo usaré en mi ecuación a continuación.
El RM es un poco confuso (de ahí mi informe de errata arriba) pero aquí tienes lo que muestra el RM en p452. Echa un vistazo a mis notas para más claridad y correcciones:
Poniéndolo todo junto, la ecuación es:
tiempo_total_de_muestreo_ADC = tiempo_de_muestreo_elegido_por_el_usuario + tiempo_de_conversión_basado_en_la_resolución
donde
tiempo_de_conversión_basado_en_la_resolución = 1 ciclo_de_reloj_ADC/bit_de_resolución x bits_de_resolución
Y de nuevo, como se muestra arriba,
ADCCLK = PCLK2 / prescaler
Ejemplos:
Ejemplo 1: Digamos que estoy utilizando una resolución de 12 bits y 480 ciclos de reloj de muestreo
Mi tiempo de muestreo total es:
tiempo_total_de_muestreo = 480 + 12-bits x 1/bit = 480 + 12 = 492 ciclos de ADCCLK.
Suponiendo que PCLK2 es de 108 MHz (ver pestaña "Configuración de reloj" en STM32CubeMX), y el prescaler es 8, sabemos que:
ADCCLK = 108/8 = 21 MHz.
1/21 Mhz = ~47.619ns/ciclo de reloj
Por lo tanto, el tiempo de muestreo total es:
492 ciclos de ADCCLK x 47.619ns/ciclo de reloj = 23.429us
La tasa de muestreo es
tasa_de_muestreo = 1/23.429us = 42.682 kHz.
Ejemplo 2: ¿Cuál es mi tasa de muestreo máxima absoluta posible en resolución de 10 bits?
Para mi caso, STM32CubeMX desactiva la opción PCLK2 dividido por 2
, por lo que lo más rápido que puedo elegir es un prescaler de 4. El tiempo de muestreo seleccionable más rápido posible es de 3 ciclos, y la resolución de 10 bits agrega 10 ciclos más, para un
tiempo total de muestra = 10 + 3 = 13 ciclos.
ADCCLK = 108/4 = 42 MHz.
1/42 Mhz = ~23.8095ns/ciclo de reloj
Por lo tanto, el tiempo de muestreo total es:
13 ciclos de ADCCLK x 23.8095ns/ciclo de reloj = 309.5235 ns
La tasa de muestreo es
tasa_de_muestreo = 1/309.5235 ns = 3.230772 MHz! <=== ¡muy rápido para un mcu!
¿Qué tiempo de muestreo de ADC debería elegir?
Es decir, ¿por qué todas las opciones?
Aquí tienes los tiempos de muestreo disponibles para elegir:
3 ciclos
15 ciclos
28 ciclos
56 ciclos
84 ciclos
112 ciclos
144 ciclos
480 ciclos
Respuesta: realmente no hay mucha información al respecto en el Manual de Referencia de ST que pueda encontrar, pero en esencia, muestrear una señal analógica más lentamente reduce la "parásita" acumulación de corriente en la línea analógica como resultado del proceso de muestreo en sí, que tanto extrae una pequeña corriente de la línea analógica como tarda tiempo. Si la línea analógica tiene una capacidad de fuente de corriente extremadamente pequeña (piensa en: la fuente analógica "recargando" la capacitancia de la línea analógica solo puede producir una corriente muy pequeña para recargar esa línea analógica), entonces no puede manejar una alta tasa de muestreo en ella. Esto se debe, una vez más, a que el propio proceso de muestreo extraerá corriente, haciendo que la señal analógica caiga (distorsionándola de su valor real) e introduciendo ruido en la señal analógica. En tales casos es sabio elegir una velocidad de muestreo lenta ajustando tu tiempo de muestreo a un valor muy largo, como por ejemplo, 480 ciclos de reloj de ADC, que es lo más largo que puedes elegir.
Regla general:
En resumen, elige el tiempo de muestreo más largo que puedas, para estar seguro, que cumpla con tus requisitos de tasa de muestreo. Si debes muestrear lo más rápido posible, hazlo, aumentando el tiempo de muestra (y por lo tanto disminuyendo la tasa de muestreo), según sea necesario, hasta que tu señal analógica permanezca estable y deje de fluctuar debido al ruido que estás añadiendo a la línea analógica como resultado de tu muestreo.
¿Tiene sentido? Ve despacio a menos que necesites ir rápido. Si necesitas ir rápido, asegúrate de no ir demasiado rápido. Si vas demasiado rápido, reduce la velocidad hasta que ya no estés yendo demasiado rápido.
Listo.