4 votos

STM32F20x tiempo/tasa de muestreo del ADC

Necesito calcular el tiempo de muestreo exacto o la tasa de muestreo para mi configuración en un STM32F205. Tengo la configuración del ADC de la siguiente manera:

ADC_DeInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);

Obtuve esto del manual de referencia del STM32F20x

Tiempo de muestreo programable por canal El ADC muestrea el voltaje de entrada durante un número de ciclos ADCCLK que pueden modificar con los bits SMP[2:0] en los registros ADC_SMPR1 y ADC_SMPR2. Cada canal puede ser muestreado con un tiempo de muestreo diferente. El tiempo total de conversión se calcula de la siguiente manera: Tconv = Tiempo de muestreo + 12 ciclos Ejemplo: Con ADCCLK = 38 MHz y tiempo de muestreo = 3 ciclos: Tconv = 3 + 12 = 15 ciclos = 0,5 s con APB2 a 60 MHz

Pero realmente no entiendo cómo usarlo en mi configuración.

Cualquier ayuda es bienvenida y proporcionaré información adicional si es necesario.

10voto

Gabriel Staples Puntos 163

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:

enter image description here

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:

enter image description here

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.

enter image description here

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:

enter image description here

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.

4voto

Chris Puntos 214

Eso depende de la fuente de la señal medida. Se requiere algún tiempo para cargar la capacitancia de entrada del ADC, por lo que si tu circuito de señal no puede absorber / suministrar suficiente corriente, el tiempo de muestreo deberá ser más largo. Cuanto más largo sea el tiempo de muestreo, más lenta será la tasa de muestreo del ADC. En algunos microcontroladores STM puedes usar amplificadores operacionales incorporados como buffers de entrada. También puedes usar externos para realizar lecturas más rápidas y precisas.

Cuando calculas el tiempo de conversión, debes:

  • Conocer la velocidad del reloj del ADC
  • Desde el RM (Manual de Referencia RM0033 para STM32F205) sabes que el tiempo total de conversión es igual a 12 ciclos de reloj del ADC + tu tiempo de muestreo. Por ejemplo, si el reloj del ADC es de 12MHz y el tiempo de muestreo es de 84 ciclos de reloj, entonces el tiempo total de conversión será de 84 + 12 ciclos de ADC = 8us, y la velocidad máxima de muestreo del ADC = 1/8us = 125kSPS.

0 votos

Para la velocidad ADC máxima en mi configuración, el cálculo sería: Reloj ADC 60MHz RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); / 4 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;. Y luego Tconv = 3 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); + 12 = 15 Velocidad ADC máxima = 15MHz / 15 = 1MSPS ??

0 votos

Para ser honesto, no uso bibliotecas HAL y solo programo con registros en bruto. Pero un par de notas. 60MHz es la frecuencia de reloj APB2. El reloj del ADC es después del divisor de frecuencia del ADC y esta velocidad puede ser de un máximo de 30MHz. Tu cálculo es correcto. Esa es la velocidad máxima alcanzable cuando usas DMA. De lo contrario

0 votos

Bueno.. ¿Pero necesito agregar ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; al Tconv? Luego, la velocidad máxima del ADC = 15MHz / (3 + 5 + 12) = 750kSPS

2voto

Rolando S. Puntos 41

Forma rápida y sencilla de verificar el tiempo de muestreo; elevar un GPIO de MCU justo antes de que comience una secuencia de muestras y bajarlo justo después de bloquear para que la conversión finalice. Verifica el tiempo de pulso del pin GPIO con un osciloscopio y divide por el número de muestras tomadas. Esto está limitado a conversiones activadas manualmente, por supuesto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X