¿Cómo programar el ADC10 en un MSP430G2553?

3

Actualmente estoy escribiendo mi primera aplicación seria con un controlador MSP430 (específicamente, un MSP430G2553) y estoy un poco confundido por la documentación sobre cómo debo configurar el ADC10. Quiero usarlo así:

  • La señal (proveniente de un potenciómetro de 100 kΩ entre V CC y GND) está conectada a la entrada A4 (pin 6) y está en el rango de GND a V CC
  • De vez en cuando (cuando el usuario presiona un botón) quiero muestrear el voltaje en esa entrada. Una muestra es suficiente.
  • Tengo tiempo suficiente para hacer lo que sea necesario para muestrear la entrada cuando llegue el momento de hacerlo.
  • Preferiría hacer esto sincrónicamente (es decir, sin interrupciones) para no complicar demasiado la lógica del programa.
  • El ADC10 debe estar apagado cuando no lo estoy usando para ahorrar energía.
  • Ni el ADC10 ni el ping 6 se utilizan de ninguna otra manera en esta aplicación.

¿Cómo configuro y uso el ADC10 en este caso de uso? Estoy programando el MSP430 en ensamblador, pero una respuesta en C también es útil.

Aquí es cómo creo que se debe configurar el ADC:

ADC10CTL0:
  SREFx      = 000  (V_CC)
  ADC10SHTx  = 11   (64 clocks, we have enough time)
  ADC10SR    = 1    (50 kbps should be enough)
  REFOUT     = 0
  REFBURST   = don't care
  MSC        = don't care
  REF2_5V    = don't care
  REFON      = 0
  ADC10ON    = 1    (set to 1 after finishing the configuration)
  ADC10IE    = 0    (no interrupts)

ADC10CTL1
  INCHx      = 0100 (A4)
  SHSx       = 00   (sample and hold sourced from ADC10SC)
  ADC10DF    = 0    (no two's complement)
  ISSH       = 0    (no inversion)
  ADC10DIVx  = 000  (not too sure either)
  ADC10SSELx = 0    (is this the right clock?)
  CONSEQx    = 00   (single channel single conversion)

ADC10AE0     = 0x10 (A4 enabled)
ADC10DTC1    = 0    (DTC disabled)

Creo que la secuencia para muestrear datos se ve así:

  1. establezca ADC10ON en 1, ENC y ADC10SC en 0 y configure todos los registros.
  2. establezca ADC10SC y ENC a 10 para iniciar la conversión
  3. espere 64 + 12 + 1 = 77 ciclos para que finalice la conversión
  4. leer el resultado de ADC10MEM

¿Esta secuencia es correcta? ¿Son correctos los ajustes?

    
pregunta FUZxxl

1 respuesta

1

Tu configuración se ve correcta. Sin embargo, tengo la sensación de que no estás seguro de la hora.

En su secuencia de muestreo, mantenga ADC10ON establecido en 0 hasta que se configure el resto de los registros. Luego, cuando esté esperando para muestrear, no espere un número específico de ciclos. En su lugar, sondee ADC10BUSY hasta que sea 0.

Los 64 relojes a los que se hace referencia en la configuración de tiempo de muestra y retención ADC10SHTx no son relojes de CPU (MCLK); son relojes relativos a cualquier fuente de reloj que seleccione con la configuración ADC10SSELx , dividida por el valor ADC10DIVx .

Con su configuración actual, su ADC se ejecuta desde el ADC10OSC (oscilador interno del ADC) que se ejecuta en aproximadamente 5 MHz, y está dividiendo ese reloj por 1. Su tiempo de muestreo se establece en 64 relojes, o 12.8 µs . Puedes multiplicar este tiempo de muestra por 2, 4 u 8 dividiendo el reloj por el mismo valor.

El tiempo de muestra debe ser dependiendo de su hardware, específicamente, cuánto tiempo le tomará a su fuente de voltaje llenar un capacitor en particular. Si no esperas lo suficiente, aún obtendrás una lectura, pero será incorrecta. La Guía del usuario de la familia MSP430 tiene más detalles. Sin embargo, la configuración de "solo funciona; tengo todo el tiempo del mundo" sería utilizar la fuente ACLK (12kHz suponiendo que ACLK se obtenga internamente de VLO) dividida por 8 (= 1.5kHz) con muestras de 64 relojes Por un tiempo de muestra de 42ms. En realidad, tomará 77 relojes como lo calculó anteriormente, por lo que la lectura tardará aproximadamente 51 ms en completarse. Esto es realmente lento y excesivo, pero no es un mal punto de partida para afinar.

    
respondido por el Jander

Lea otras preguntas en las etiquetas

Comentarios Recientes

18/04/2012 El elemento crítico (Bluetooth p-sub DC desechable) en la placa Mini 809 aún no se puede configurar. Depende de los usuarios hacerlo, y tampoco creo que funcione en el 1052G2553.18 / 04/2012 También surgió una sugerencia para la tecnología LCD en un receptor AUX. En el AVR de 805 bits de Adafruit, parecen incluir eso: necesita leer los pines para el rango de TV, etc. De esta manera, debe tener pines de identificación y funciones API que serán atendidas según sea necesario, sospecho que no se necesitan... Lees verder