7 votos

¿Por qué varía el tiempo de la conversión ADC?

Estoy utilizando TI Tiva C TM4C123GH6PM en un Launchpad combinado con un ANUNCIO 9850 DDS para crear frecuencia del modulador.

Actualmente tengo un muy sencillo programa que básicamente establece periféricos del microcontrolador y el AD9850 y luego entra en un bucle en el que las muestras de audio de las señales al microcontrolador del ADC y con base en los resultados ajusta la frecuencia de salida del DDS.

Mi problema es que el bucle del tiempo de ejecución no es constante.

El ciclo está dividido en tres partes: En la primera parte, que obtener una muestra de la ADC, en la segunda parte, los ajustes necesarios para el AD9850 se calculan y en la tercera parte, los valores se envían a la AD9850.

Después de hacer algunas ciclo de conteo, resulta que la segunda y tercera parte siempre la última para 2670 ciclos de reloj. Esto me deja con el único sospechoso de ser la primera parte.

Después de medir el tiempo de ejecución de la primera parte por si solo, me he dado cuenta de que varía desde un mínimo de 100 ciclos hasta 8000 ciclos.

He aquí una bonita gráfica que tengo de el depurador muestra cómo el número de ciclos de cambios con el tiempo:

Graph showing on its Y axis number of cycles it took for the ADC to provide a sample and on its X axis number of samples taken

Me puse a pensar en la hoja de datos de la pieza y en el Tivaware controladores de Periféricos manual del Usuario de Biblioteca y yo no podía encontrar una razón por la que el muestreo tendría tan drásticas fluctuaciones. El ADC de muestreo más tiempo de conversión aparece como 1 microsegundo, que es de alrededor de 80 ciclos de procesador, ya estoy corriendo a 80 MHz, la frecuencia de reloj. Esto hace que la duración del bucle en la zona de alrededor de 100 a 200 ciclos ven bien, pero no tengo absolutamente ninguna idea de lo que está sucediendo en el caso cuando el tiempo está en los miles de ciclos.

También he leído la fe de erratas para el ADC y por lo que puedo ver, ninguno de los numerosos problemas que se aplican a mi caso. También la parte que tengo es un real TM4 parte, no experimental XM4 parte.

He aquí la problemática es la parte del código:

c_start = HWREG(DWT_BASE + DWT_O_CYCCNT); // starts cycle counting
ROM_ADCIntClear(ADC0_BASE, 3);//clears interrupt flag
ADCProcessorTrigger(ADC0_BASE, 1);//Triggering sequence 1
while(!ROM_ADCIntStatus(ADC0_BASE, 3, false))//Waits for ADC to finish converting
{//Busy wait to be replaced with an ISR at some point
}
ROM_ADCSequenceDataGet(ADC0_BASE, 3, adcData);//adcData pointer to memory location 
//used to store results
c_stop = HWREG(DWT_BASE + DWT_O_CYCCNT); // Ends cycle count
c_dur=c_stop-c_start;//Provides number of cycles, refresh breakpoint goes here

Aquí está la instalación de ADC código:

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);//Pin is PD1=>channel AIN6
ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64);
//Averages 64 samples and stores them in one FIFO slot,
//has apparently no effect on the conversion time, same results when disabled

HWREG(ADC0_BASE+ 0x038) = 0x40;//This enables hardware dithering


ADCSequenceConfigure(ADC0_BASE,3,ADC_TRIGGER_PROCESSOR,0);
//Uses ADC0, sequence 3=>FIFO with length of one, highest prioroty
ADCSequenceStepConfigure(ADC0_BASE,3,0,ADC_CTL_CH6|ADC_CTL_IE|ADC_CTL_END);
//First and last step, selects ADC0, sequence 3, step zero, channel 6,
// enables interrupt and ends sequence
ADCSequenceEnable(ADC0_BASE,3);
//Enables sequence

ACTUALIZACIÓN: Me fui por delante y hice la prueba con el pin retorciéndose y tengo relativamente similares resultados. En esta imagen, un pin va alto y luego inmediatamente a la baja tan pronto como ADC está hecho. Esto es tomado con difuminado y hardware de sobremuestreo de movilidad, con una frecuencia de muestreo de 1 MSa/s y de búfer FIFO de profundidad de 1. enter image description here

4voto

shash Puntos 668

Si bien hay razones descritas por otros con respecto a donde su jitter puede venir de, dependiente de cosas como el tiempo de conversión (o incluso ocultos ramas en función de las bibliotecas donde cada rama se lleva a tiempos diferentes) es sólo una mala práctica para sistemas en tiempo real.

Si usted necesita de baja fluctuación de bucle de tiempo, usted necesita para HACER por la creación de un temporizador de interrupción para darle a usted. Si necesita velocidad, el temporizador debe ser fijado en el máximo de su tiempo a través de los bucles, además de un poco de espacio para la cabeza. En un temporizador de interrupción debe de servicio de todo lo que se debe hacer basándose en su último ADC leer, para luego hacer la siguiente ADC leer.

2voto

Joe Puntos 113

Cuando esto sucede, el microcontrolador no se restablecerá. Si lo hiciera, me gustaría ver que en el depurador.

Sospecho que la ejecución de este en el depurador y un reloj en adcData porque es interesante los datos. El IDE es provechoso preservar que entre pistas. Voy a seguir a adivinar que la TI procesador es compatible con el hardware de puntos de observación en la memoria escribe, y el depurador es el uso de aquellos a coger las actualizaciones adcData. Cada vez que a través de su bucle el depurador del observatorio y se detiene durante el tiempo que sea necesario para que el depurador externo para leer los datos y reanudar el chip.

Si mantiene el bit se sacude y se quedó sin el depurador usted podría poner a prueba esta teoría.

2voto

Whistle1560 Puntos 196

Como una nota, el tiempo de la adquisición de ADC se supone que es finito, pero he visto alguna variación en la caracterización de los componentes. La hoja de datos probabilidad da un típico o un "garantizado por el diseño". También, la validez de cada adquisición no está garantizada debido al ruido, ya sea de diseño o de otra manera.

2voto

user52676 Puntos 16

No mencionar las interrupciones, pero veo que usted está limpiando un indicador de interrupción en el código. Si no lo has hecho todavía, pruebe a deshabilitar las interrupciones a nivel mundial. Si alguna de las otras interrupciones se van fuera, pueden ser la causa de esta fluctuación.

Con un software basado en bucle, hay muchas cosas que pueden causar irregularidades en la ejecución. La forma más confiable para obtener con precisión los datos muestreados es para activar el ADC el uso de una fuente confiable, como un temporizador (que yo creo que se puede hacer con ningún hardware externo en este dispositivo). El mismo temporizador de señal podría desencadenar una ISR, donde puede recopilar y utilizar el resultado en un mayor placer, o podría desencadenar DMA para copiar las muestras en un búfer de algún tipo.

Sugiero precaución con las bibliotecas como TivaWare. Generalmente están escritos por conveniencia, no de alta eficiencia. Si usted puede localizar el código fuente, usted probablemente encontrará que están haciendo un notable cantidad de orden y limpieza en las rutinas. Muy a menudo, usted obtendrá un rendimiento mucho mejor por golpear directamente los registros.

2voto

wgpubs Puntos 2652

Hay 3 la mayoría de los tipos utilizados de analógico a digital de convertidores.

  • Tipo de contador de ADC.
  • Aproximación sucesiva tipo de ADC.
  • Flash tipo de ADC.

    1. Tipo de contador ADC:

      En este tipo de entrada se compara con un voltaje de referencia generados digitalmente.la tensión de referencia se incrementa paso a paso hasta que la tensión de referencia es mayor que el voltaje de entrada.Así que para diferentes tensiones de entrada el tiempo que toma para la conversión es diferente.

    2. Aproximación sucesiva tipo de ADC:

      En este tipo se usa el mismo principio, pero de manera inteligente. primero el voltaje de entrada es comparado con Va/2 (donde Va es el límite superior de tensión de entrada) para encontrar en la cual la mitad es mentira . si es mayor de Va/2 se compara con 3Va/4 persona se compara con Va/4 a encontrar en el trimestre que se encuentra.Algo así como una búsqueda binaria en los programas de ordenador.

    3. Flash tipo ADC:

      En este tipo de la tensión de entrada es comparado con todos los niveles de tensión al mismo tiempo y de salida correspondiente está dado . El tiempo en este tipo de conversión es constante y no depende de la tensión de entrada.

Para más información sobre el ADC de leer archivos en formato pdf: http://www.physics.arizona.edu/~haar/ADV_LAB/ADC.pdf

Sugiero un Flash ADC que sería mejor para su circuito. Si quieres trabajar en el mismo hardware hay dos cosas que se pueden hacer.

  1. encontrar el tiempo máximo (Ta) el ADC toma para la conversión . Establecer un temporizador de interrupción para cualquier valor de más de Ta. Cada vez que usted solicite una conversión de iniciar el temporizador, y ejecutar el resto del código, sólo después de la interrupción que se ha producido . esta no es la mejor manera, pero usted va a obtener de conversión ADC en un tiempo constante. la estructura del código se verá algo como esto:

    • (parte 1):
    • Solicitud de conversión.
    • Configurar el temporizador de interrupción.
    • i=0;
    • mientras (i==0){} //no hay necesidad de votación
    • almacenar datos de ADC
    • ejecutar la parte 2 y la parte 3 del mismo como antes

      Rutina de servicio de interrupción de temporizador de interrupción

      • {i=1;}

    Nota:configurar el temporizador de interrupción significa establecer el temporizador a 0 y habilitar las interrupciones.

O

  1. el uso de la ADC en el modo de ejecución libre (ADC realiza la conversión no importa una conversión que se solicita o no). Cada vez que usted desea tomar una muestra ,simplemente cargar sin necesidad de conversión ADC . no hay necesidad de bucle while. (Pero para que este método sea utilizado su ADC deben apoyar la libertad en el modo de ejecución)

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