Seminario de Computadores I, 1er Semestre 2004 ADC12 Conversor Análogo Digital de 12 bits Francisco Blancaire Eduardo González Michael Kusch Diego Valencia ADC12 ÍNDICE GENERAL Índice General 1 Introducción 3 1.1 Caracterı́sticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Diagrama de bloques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3 Requerimientos para la operación . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3.1 Reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3.2 Canales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3.3 Voltajes de referencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3.4 Muestreo y tiempos de conversión . . . . . . . . . . . . . . . . . . . . . . 6 1.3.5 Consideraciones del tiempo de captura . . . . . . . . . . . . . . . . . . . . 8 2 Registros 2.1 2.2 2.3 2.4 9 Registros de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.1 ADC12CTL0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.2 ADC12CTL1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Registros de almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2.1 ADC12MEMx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Registros de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1 ADC12MCTLx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Registros de interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4.1 ADC12IFG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4.2 ADC12IE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4.3 ADC12IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3 Funcionamiento 3.1 3.2 16 Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.1.1 Memoria de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.1.2 Modos de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.1.3 Sensor integrado de temperatura . . . . . . . . . . . . . . . . . . . . . . . 20 Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2.1 Interrupciones del ADC12 . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2.2 Vector Generador de Interrupciones, ADC12IV . . . . . . . . . . . . . . . 21 Seminario de Computadores I, 2004 1 ADC12 ÍNDICE GENERAL 4 Ejemplo de implementación 22 4.1 Proceso de Inicialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.2 Ejemplo: Conversión única, canal único . . . . . . . . . . . . . . . . . . . . . . . 23 4.3 Ejemplo: Conversión única, secuencia de canales . . . . . . . . . . . . . . . . . . 24 Seminario de Computadores I, 2004 2 ADC12 1 Introducción Introducción En este documento se detalla la configuración y funcionamiento del módulo ADC12, que es un conversor análogo digital de 12 bits que trae incorporado el microcontrolador MSP430F149. Su función es convertir voltajes analógicos que se introducen por distintas entradas disponibles a palabras binarias de 12 bits. Esto lo realiza utilizando recursos propios de módulo, es decir sin interferir en el procesamiento principal del microcontrolador. En los microcontroladores con DMA se puede utilizar esta propiedad para tener una conversión fluida y continua sin interrumpir ningún otro proceso. 1.1 Caracterı́sticas • Conversión de 12 bits. • Tasa de muestreo programable, con una máxima de 200k Muestras por segundo. • Inicio de la conversión por software o por temporizadores . • Término de cada conversión puede generar interrupciones. • Fuente de reloj, perı́odo de captura y frecuencia de muestreo programables. • Generación de referencias configurable por software. • 8 canales de entrada, más 4 señales internas. • 4 modos de adquisición. • Hasta 16 conversiones almacenadas independientemente. Seminario de Computadores I, 2004 3 ADC12 1.2 Diagrama de bloques Diagrama de bloques El diagrama de bloques se muestra a continuación Se destaca el hecho de que aunque se puedan adquirir varias señales distintas, sólo existe un modulo conversor. 1.3 Requerimientos para la operación Se muestran a continuación las opciones básicas que deben configurarse para utilizar el ADC. Cada sección muestra su parte en el diagrama de bloques para tener una idea del flujo de las señales. Seminario de Computadores I, 2004 4 ADC12 1.3.1 Requerimientos para la operación Reloj (ADC12CLK) Se utiliza sólo un reloj para la conversión y para generar el perı́odo de muestreo. Con ADC12SSEL se efectúa la selección de este reloj. Las fuentes posibles de reloj son: SMCLK, MCLK, ACLK, ADC12OSC. EL ADC12OSC es un oscilador interno del módulo de 5[M hz], pero varı́a según microcontrolador, voltaje de alimentación y temperatura. Existe además la posibilidad de dividir el reloj de 1 a 8 configurando los bits ADC12DIVx. 1.3.2 Canales La elección del canal que se convierte se realiza mediante un multiplexor analógico, diseñado hecho de manera de minimizar el crosstalk y el ruido. Los canales que no se están convirtiendo quedan puestos a tierra para evitar aún más ruido. Los canales externos de entrada corresponden a los pines del puerto 6 del microcontrolador, por lo que se deben configurar como entradas y en modo entrada/salida para eliminar el buffer que podrı́a crear problemas con corrientes parásitas. 1.3.3 Voltajes de referencia Existen varias fuentes disponibles para los voltajes de referencia que ocupa el conversor. Existe la opción de utilizar voltajes de referencia internos del módulo, que pueden ser 1.5 o 2.5 [V]. Se puede utilizar también un voltaje de referencia externa que se aplica al pin V eREF + Seminario de Computadores I, 2004 5 ADC12 Requerimientos para la operación del puerto 6. Por último, se puede utilizar el voltaje de alimentacion del microcontrolador. Para VREF − se puede elegir AVSS o introducir un voltaje de referencia por el pin V eREF − Se recomienda que los voltajes aplicados externos (o de alimentación) estén filtrados con un condensador de 10[µF ] y otro de 0.1[µF ] en paralelo, entre la fuente y tierra. 1.3.4 Muestreo y tiempos de conversión La conversión completa implica dos fases: muestreo (o captura) y conversión. La primera fase se inicia con el canto de subida de una señal interna SHI. Una vez concluida esta fase, comienza la fase de conversión. Las fuentes de la señal SHI se seleccionan mediante los bits SHSx y son las siguientes: • Bit ADC12SC. • Etapa de salida 1 del Timer A. • Etapa de salida 0 del Timer B. • Etapa de salida 1 del Timer B. La polaridad de esta señal puede ser invertida utilizando el bit ISSH. La señal SAMPCON controla el perı́odo de muestreo y el comienzo de la conversión. Mientras ésta esté alta, está activo el proceso de captura. En el canto de bajada de SAMPCON se comienza la conversión que dura 13 cantos del reloj (ADC12CLK). La relación que existe entre la señal SHI y SAMPCON esta determinada por el bit de control SHP, que determina dos modos distintos de captura: Seminario de Computadores I, 2004 6 ADC12 Requerimientos para la operación A. Captura Extendida (SHP=0) En este modo la señal SHI controla directamente la señal SAMPCON, por lo que define directamente el perı́odo de muestreo tsample . Una vez que se baja SHI (y por ende SAMPCON) existe un tiempo de sincronismo hasta el primer canto de subida de ADC12CLK, el cual comienza la conversión. B. Captura por pulso (SHP=1) En este modo la subida de SHI determina la subida de SAMPCON, pero el tiempo tsample que permanece en alto se configura utilizando los bits SHT0x y SHT1x. Luego de que sube SHI, se tiene un tiempo de sincronismo con el canto de subida de ADC12CLK y luego permanece alto SAMPCON durante tsample . El perı́odo de muestreo real corresponde entonces a tsample + tsync , este último correspondiendo al tiempo de sincronismo. La conversion se inicia inmediatamente con el canto de bajada de SAMPCON. Seminario de Computadores I, 2004 7 ADC12 1.3.5 Requerimientos para la operación Consideraciones del tiempo de captura Una consideración importante que debe realizarse al convertir es la caracterı́stica de filtro pasabajos que tiene el canal durante la fase de muestreo (ver Figura). Vi =Voltaje en el pin. Vs =Voltaje de la fuente análoga por muestrear. Rs =Resistencia externa de la fuente análoga. Ri =Resistencia interna del multiplexor. Ci =Capacidad del condensador de captura. Vc =Voltaje del condensador. Dado que el valor que se convierte es VC , se debe esperar un tiempo prudente para que este valor sea igual a Vs . La relación entre el tiempo de captura y estas variables responde al tiempo de carga del condensador: tsample > (Rs + Ri ) × ln(213 ) × Ci Reemplazando los valores tı́picos de Ri = 2[kΩ] y Ci = 40[pF ] se obtiene tsample en función de la resistencia de la fuente de voltaje: tsample > (Rs + 2k) × ln(213 ) × 40p[s] Si se tiene una resistencia de salida Rs = 10[kΩ], se obtiene un perı́odo de captura mı́nimo de 4, 33[µs]. Seminario de Computadores I, 2004 8 ADC12 2 Registros Registros Los registros del Conversor Análogo-Digital se pueden catalogar de la siguiente manera: dos registros de configuración, tres para el manejo de interrupciones, dieciséis para el control de conversion y otros dieciséis para almacenar los resultados de la conversion. 2.1 Registros de configuración 2.1.1 ADC12 Control Register 0, ADC12CTL0. Este registro es el primer registro de control. Los campos SHT1x y SHT0x son para definir la cantidad de ciclos de reloj que va a durar el muestreo de los canales por convertir según los registros ADC12MEM8 al ADC12MEM15, y ADC12MEM0 al ADC12MEM7 respectivamente. El bit MSC es empleado para muestreos y conversiones múltiples automáticas. REFON es el bit que habilita el generador de voltaje de referencia interno del conversión, si no se desea usar, es recomendable mantenerlo apagado (en cero) para ahorrar consumo. Para seleccionar el nivel del voltaje de referencia interna está el bit REF2 5V, el cual selecciona el voltaje en 2.5[V] o 1.5[V], asignando un 1 ó 0 respectivamente. Con el bit ADC12ON podemos encender el conversor si se va a utilizar. En caso contrario se debe mantener en cero (apagado) para ahorro de consumo. Los bits mencionados sólo pueden ser modificados cuando el bit que habilita la conversión ENC está en 0. Para habilitar la interrupción por overflow (desbordamiento) en el resultado, se debe poner en bit ADC12OVIE en uno. A su vez, si también se quiere que esté la interrupción por Time Overflow, el bit ADC12TOVIE debe estar en uno. También es condición necesaria que estén habilitadas las interrupciones globales (GIE). Para iniciar una conversion se debe levantar el bit ADC12SC. Ésta es la tabla que muestra cómo configurar los campos SHTxx, para elegir el número de ciclos de reloj deseados. Seminario de Computadores I, 2004 9 ADC12 2.1.2 Registros de configuración ADC12 Control Register 1, ADC12CTL1. Este es el segundo registro de control del conversor. Con los bits CSTARTADDx definimos en qué registro de memoria ADC12MEMx iniciar la conversión. Realmente lo que definimos es con cual de los registros de control ADC12MCTLx (aquı́ se define el canal de entrada y VREF ) comenzar la conversión, y cuyo resultado será guardado en su respectivo ADC12MEMx. Los bits SHSx son para elegir la fuente de reloj que inicia todo el ciclo de conversion. Se configuran de la siguiente forma: 00 01 ADC12SC TIMER A.OUT1 10 11 TIMER B.OUT0 TIMER B.OUT1 El bit ISSH sirve para invertir la señal de Sample&Hold (bit en 1). El bit SHP es para ajustar el modo de captura, ya sea por pulso (bit en 1) o extendida (en cero). Para elegir el reloj por utilizar por el conversor están los bits ADC12SSELx, los bits se ajustan de la siguiente forma: Seminario de Computadores I, 2004 10 ADC12 Registros de almacenamiento 00 01 ADC12OSC ACLK 10 11 MCLK SMCLK Para dividir la frecuencia del reloj elegido, en caso que sea necesario, es posible ajustar los bits de ADC12DIVx. La configuración de estos bits es la siguiente: 000 100 1 5 001 101 2 6 010 110 3 7 011 111 4 8 Es importante tener en cuenta que para modificar los campos anteriores se debe tener el bit ENC en cero. Para elegir el modo de conversión se deben ajustar los bits del campo CONSEQx de la siguiente manera: 00 01 Único canal Secuencia de canales 10 11 Repetir único canal Repetir secuencia de canales El último bit de este registro, el ADC12BUSY, indica si el conversor está ocupado realizando una conversión. 2.2 2.2.1 Registros de almacenamiento ADC12 Conversion Memory Registers, ADC12MEMx. En estos registros se almacenan los resultados de las conversiones. Se emplean solo 12 bits, del 0 al 11, porque es un conversor de 12 bits. Los otros bits están siempre en 0 y son de solo lectura. En total son 16 de estos registros, y cada uno esta relacionado con su respectivo registro de control ADC12MCTLx Seminario de Computadores I, 2004 11 ADC12 2.3 Registros de control Registros de control 2.3.1 ADC12 Memory Control, ADC12MCTLx. Este registro es el que define qué canal será convertido. Para seleccionar un canal se debe ajustar INCHx según la siguiente tabla: INCHx 0000 0001 0010 0011 0100 0101 0110 0111 Canal A0 A1 A2 A3 A4 A5 A6 A7 INCHx 1000 1001 1010 1011 1100 1101 1110 1111 Canal V eREF + VREF − /V eREF − Temperature Diode (AVCC − AVSS )/2 (AVCC − AVSS )/2 (AVCC − AVSS )/2 (AVCC − AVSS )/2 (AVCC − AVSS )/2 El campo SREFx se emplea para seleccionar los voltajes de referencia. El resultado que se obtiene luego de una conversión esta dado por: NADC = 4095 VIN − VR− VR+ − VR− En este campo se eligen los VR+ y VR− a utilizar, según la siguiente tabla. SREFx 000 001 010 011 100 101 110 111 Seminario de Computadores I, 2004 VR+ AVCC VREF + V eREF + V eREF + AVCC VREF + V eREF + V eREF + VR− AVSS AVSS AVSS AVSS VREF − /V eREF − VREF − /V eREF − VREF − /V eREF − VREF − /V eREF − 12 ADC12 2.4 2.4.1 Registros de interrupción Registros de interrupción ADC12 Interrupt Flag Register, ADC12IFG. Cada vez que un resultado se almacena en memoria ADC12MEMx, se levanta la bandera de este registro, en el bit correspondiente al número del registro. Poe ejemplo, si una conversión finaliza y se almacena un resultado en ADC12MEM5, entonces se levantará una bandera en ADC12IFG5. 2.4.2 ADC12 Interrupt Enable Register, ADC12IE. Habilita las interrupciones provocadas por ADC12IFG. Esto se puede hacer de manera especı́fica, habilitando las interrupciones para algunos ADC12IFG, manteniendo las demás deshabilitadas. Cada vez que se levante una bandera en ADC12IFG, se comprueba si está habilitada la mascara de interrupción correspondiente. Si es ası́ se generará una interrupción, en caso contrario nada pasa. Seminario de Computadores I, 2004 13 ADC12 2.4.3 Registros de interrupción ADC12 Interrupt Vector Register, ADC12IV. Este registro se utiliza para combinar y priorizar las interrupciones del conversor análogo digital. Una vez que el ADC ha producido una interrupción, en vez de estar comprobando una a una las banderas de ADC12IFG, basta con leer este registro para saber qué canal produjo la interrupción. En este registro sólo está el campo ADC12IVx, y el resto son ceros. Además de las banderas que se generan por almacenar el resultado de una conversión, en este registro están las banderas de timeoverflow y conversion memory overflow. Los valores que puede tomar ADC12IV, están en la siguiente tabla ordenados de mayor prioridad a menor prioridad. Si una bandera se ha levantado, pero no ha sido atendida, y se levanta otra de mayor Seminario de Computadores I, 2004 14 ADC12 Registros de interrupción prioridad, está ultima sobreescribe el valor de ADC12IV ya que tiene mayor prioridad. En cambio, si posteriormente llega otra con menor prioridad, no se produce ningún cambio. Una vez atendida la interrupción de mayor prioridad, si existen otras de menor prioridad pendiente, ADC12IV tomará el valor de la interrupción que le sigue en prioridad. Esto quiere decir que las interrupciones de menor prioridad que han sido sobreescritas no se pierden, sólo se posponen. Seminario de Computadores I, 2004 15 ADC12 3 Funcionamiento Funcionamiento 3.1 Conversión 3.1.1 Memoria de Conversión Existen 16 registros de memoria de conversión ADC12MEMx, cada uno de 16 bit de los cuales sólo se ocupan 12 para guardar los resultados de cada ciclo de conversión. Cada registro de conversión está asociado a un registro de control ADC12MCTLx, en el cual se encuentran SREFx, INCHx y EOS. SREFx define el voltaje de referencia a usar; INCHx selecciona el canal entrante (esto quiere decir que no necesariamente por usar el registro de memoria 1 tengo que convertir el canal 1); el EOS define el final de la secuencia cuando el modo secuencial es utilizado. En caso de que ningún EOS sea seteado, una secuencia se repetirá indefinidamente. CSTARTADDx (Control START ADDress) ubicado en ADC12CTL1 define el primer registro de control usado para cualquier conversión. Si la conversión es canal único o repetición de canal único, el CSTARTADDx indica el único ADC12MCTLx por ser usado. Si el modo de conversión seleccionado es secuencia de canales o repetición de secuencia de canales, CSTARTADDx indica el primer ADC12MCTLx por ser usado en la secuencia. Un puntero invisible es incrementado automáticamente cuando cada conversión esta completa para que pase al próximo ADC12MCTLx. La secuencia continúa hasta que sea encontrado un EOS=1. Cuando el resultado de la conversión es escrito en el registro seleccionado ADC12MEMx, la bandera en el registro ADC12IFGx correspondiente es seteada automáticamente. 3.1.2 Modos de Conversión El modo de conversión se selecciona mediante CONSEQx ubicado en el registro ADC12CTL1. CONSEQx 00 01 Canal único, única conversión Secuencia de canales : : 10 11 Repetición de canal único Repetición Secuencia de canales : : Seminario de Computadores I, 2004 Un único canal es convertido una sola vez Una secuencia de canales es convertida una sola vez Un único canal es convertido repetidas veces Una secuencia de canales en convertida repetidas veces 16 ADC12 Conversión A. Canal único, única conversión (00) Un único canal es convertido una sola vez. El resultado obtenido es guardado en el registro de memoria ADC12MEMx definido por el CSTARTADDx. Las conversiones son disparadas por el ADC12SC bit y cuando cualquier otra fuente de disparo es usada (TIMER A, TIMER B) el bit ENC debe ser cambiado entre cada conversión. La siguiente Figura muestra el diagrama de flujo del modo Canal único, única conversión. B. Secuencia de canales (01) Una secuencia de canales es convertida una sola vez. Los resultados son guardados en la memoria de conversión partiendo del registro definido en CSTARTADDx. La secuencia termina con la conversión del registro ADC12MCTLx cuyo bit EOS esté en 1. Nuevamente la secuencia el gatillada por el ADC12SC y cuando cualquier otra fuente de disparo es usada (TIMER A, TIMER B) el bit ENC debe ser cambiado entre cada conversión. La siguiente Figura muestra el diagrama de flujo del modo Secuencia de canales. Seminario de Computadores I, 2004 17 ADC12 Conversión C. Repetición de canal único (10) Un único canal es convertido repetidas veces. El resultado obtenido es guardado en el registro de memoria ADC12MEMx definido por CSTARTADDx. Las conversiones son disparadas por el ADC12SC bit y cuando cualquier otra fuente de disparo es usada (TIMER A, TIMER B) el bit ENC debe ser cambiado entre cada conversión. Es necesario leer el resultado después que se ha terminado la conversión, debido a que sólo un registro de memoria es usado y se sobrescribirá éste después de la siguiente conversión La siguiente Figura muestra el diagrama de flujo del modo Repetición de canal único. Seminario de Computadores I, 2004 18 ADC12 Conversión D. Repetición Secuencia de canales (11) Una secuencia de canales en convertida repetidas veces. Los resultados son guardados en la memoria de conversión partiendo del registro definido en CSTARTADDx. La secuencia termina en la lectura de un canal donde su registro de control ADC12MCTLx tenga seteado el bit EOS, la repetición de secuencia el gatillada por el ADC12SC y cuando cualquier otra fuente de disparo es usada (TIMER A, TIMER B) el bit ENC debe ser cambiado entre cada conversión. La siguiente Figura muestra el diagrama de flujo del modo Repetición Secuencia de canales. Cómo parar las conversiones Parar el ADC12 depende del modo de operación que se este usando. Las vı́as recomendadas para parar una conversión activa son las siguientes: • Modo (00): Resetear el bit ENC terminarı́a inmediatamente la conversión, lo que implicarı́a que el resultado de la conversión no serı́a confiable. • Modo (01): Resetear el bit ENC terminarı́a la conversión al final de la secuencia. • Modo (10): La conversión es detenida poniendo a ENC en 0 lo que hace terminar la conversión al final del ciclo de conversión. • Modo (11): Las sucesivas conversiones terminan cuando ENC es igual a 0 lo que hace terminar la conversión al final de la secuencia. Seminario de Computadores I, 2004 19 ADC12 Interrupciones Cualquier modo de conversión puede ser detenido inmediatamente asignando a CONSEQx igual a (00) y reseteando el bit ENC, en este caso los resultados de las conversiones no serán confiables. 3.1.3 Sensor integrado de temperatura Para usar el sensor integrado de temperatura se debe seleccionar la entrada análoga INCHx = 1010. Este canal es usado como cualquier otro. Para usar el sensor de temperatura el perı́odo de muestreo debe ser mayor que 30[µs] y se debe considerar que el offset varı́a mucho entre un procesador y otro. La temperatura se encuentra relacionada con el voltaje de entrada mediante la siguiente ecuación(con valores nominales), Vtemp = 3.55 × 10−3 · T + 0.986 De la cual se desprende el siguiente gráfico. 3.2 Interrupciones 3.2.1 Interrupciones del ADC12 El ADC12 posee 18 recursos de interrupción. • ADC12IFG0-ADC12IFG15: una bandera es seteada cada vez que su registro de memoria asociado ha sido escrito por una conversión. Una interrupción es creada si el correspondiente bit ADC12IEx y el GIE bit son seteados. • ADC12OV, ADC12MEMx overflow: esta interrupción es generada cuando un resultado ha sido sobre-escrito en un registro de memoria ADC12MEMx, antes de haber sido leı́do. • ADC12TOV, ADC12 conversión time overflow: esta ocurre cuando otra petición de conversión es requerida antes que la conversión actual halla terminado. Seminario de Computadores I, 2004 20 ADC12 3.2.2 Interrupciones Vector Generador de Interrupciones, ADC12IV En este registro todas las interrupciones son priorizadas y combinadas en un único vector de interrupciones. Este vector es usado para poder identificar cuál de las interrupciones ha ocurrido, sin necesidad de revisar cada una de las banderas de interrupción. Las interrupciones ADC12TOV y ADC12OV son reseteadas automáticamente con cualquier acceso a este registro. Las interrupciones originadas por ADC12IFGx son reseteadas una vez que se hayan leı́do los datos de los registros de memoria ADC12MEMx correspondiente. En el caso que una interrupción quede pendiente después de un servicio de interrupción, se generara otra interrupción que será atendida posteriormente. Seminario de Computadores I, 2004 21 ADC12 4 Ejemplo de implementación Ejemplo de implementación 4.1 Proceso de Inicialización Para configurar la conversión ADC12 los pasos son los siguientes: • Seleccionar los pines del puerto 6 que van a utilizarse como canales análogos y configurarlos como entradas (P6DIR=0) y uso por periféricos (P6SEL=1). • Luego debe deshabilitarse el bit ENC del registro ADC12CTL0. Esto es necesario para poder modificar los registros de configuración del ADC12. ADC12CTL0: 1. Configurar el tiempo de captura para los canales internos con SHT1 xx y para los canales externos con SHT0 xx. 2. Si se va a utilizarse la referencia interna de voltaje, habilitar REFON y seleccionar el voltaje con REF2 5V. 3. Si se utilizan conversiones múltiples, poner en 1 el bit MSC del registro ADC12CTL0 si se desea que cada conversión se realice apenas hay terminado la anterior. Si se deja en 0, el inicio de cada conversión sucesiva será dado por un timer. 4. Si se van a utilizar interrupciones, configurar los bits ADC12OVIE y ADC12TOVIE del registro ADC12CTL0 de a cuerdo a la aplicación. También configurar el Registro ADC12IE. ADC12CTL1: 1. Seleccionar el primer registro a convertir con CSTARTADD x. Con esto elegimos cual de los registros ADC12MCTL0 a ADC12MCTL15 será el registro a convertir, o el primero de la secuencia de conversión. 2. Dejar el bit SHP en 1 para no interrumpir el ciclo de captura, y los bits ISSH y SHS en 0. 3. Seleccionar la fuente de reloj del ADC12 con ADC12SSEL x y el divisor del reloj con ADC12DIV x. Asegurarse que el tiempo de conversión de 12 ciclos de reloj no sea menor a 375[ns] y tampoco mucho mayor. 4. Elegir el modo de conversión con CONSEQ x. Seminario de Computadores I, 2004 22 ADC12 Ejemplo: Conversión única, canal único ADC12MCTL0 a ADC12MCTL15: 1. Para cada registro de conversión que vaya a utilizarse, seleccionar el canal por convertir con INCH x. 2. Para cada registro de conversión seleccionar cuál será la referencia V+ y V- con SREF x 3. Si se utiliza el modo secuencia de canales, poner el bit EOS en 1 en el último registro a convertir. Al terminar la configuración: 1. Encender el conversor poniendo en 1 el bit ADCON del registro ADC12CTL0 2. Habilitar las conversiones poniendo en 1 el bit ENC del registro ADC12CTL0, bloqueando ası́ la modificación de los bits de configuración de los registros de control ADC12CTL0, ADC12CTL1 y ADC12MCTL0 a ADC12MCTL15. Para iniciar la conversión, poner en 1 el bit ADC12SC del registro ADC12MCTL0. 4.2 Programa de ejemplo Conversión única, canal único. Sólo se convertirá un único canal una única vez. El registro seleccionado para hacer la conversión es el ADC12MCLT0, por lo tanto el resultado se obtiene en el registro ADC12MEM0. En esta ocasión, se ha configurado de antemano la referencia de voltaje para el canal a convertir, que es el voltaje de alimentación V+ = 3.6[V] y V- = 0[V]. La rutina de conversión sólo elige qué canal convertir, no pudiendo modificarse la referencia de voltaje. La rutina de conversión inicia y espera a que termine el ciclo de la conversión, retornando el resultado obtenido. Rutina de inicialización: void ADC INIT SIMPLE(void) { P6SEL |= 0x00FF; //8 lsb Puerto 6 para conversor ADC12 P6DIR &= 0xFF00; //8 lsb Puerto 6 como entradas (análogas) ADC12CTL0 &= ~ENC; //deshabilita conversion ADC12CTL0 = SHT1 15 | SHT0 15 | ADC12ON; ADC12CTL1 = CSTARTADD 0 | SHS 0 | SHP | ADC12DIV 7 | ADC12SSEL 2 | CONSEQ 0; ADC12MCTL0 = SREF 0; ADC12IE = 0x00; //Deshabilitadas las interrupciones (bits ADC12IEx) para todos los ADC12MCTLx ADC12CTL0 |= ENC; // habilita conversión } Seminario de Computadores I, 2004 23 ADC12 Ejemplo: Conversión única, secuencia de canales Rutina de conversión. Se llama con el argumento del canal a convertir. int conversion(int CANAL) { ADC12CTL0 &= ~ENC; //deshabilita conversion para realizar cambios ADC12MCTL0 &= 0xFFF0; //borra INCHx ADC12MCTL0 |= (CANAL & 0x0F); //Selecciona el canal a convertir ADC12CTL0 |= ENC; //habilita conversión ADC12CTL0 |= ADC12SC; //inicia conversión while (ADC12CTL0 & ADC12SC); //espera término de la conversión, o sea espera que bit ADC12SC = 0 return ADC12MEM0; } 4.3 Programa de ejemplo Conversión única, secuencia de canales. Función de inicialización para secuencia de 4 conversiones utilizando los registros ADC12MCTL0 a ADC12MCTL3, cada conversión es generada apenas termina la conversión anterior. El resultado de las conversiones se guardan en variables globales llamadas ResultadoADC[0] a ResultadoADC[3]. Las diferencias con la inicialización de la conversión de un único canal se muestran en rojo. void ADC INIT SEQ(void) { P6SEL |= 0x00FF; P6DIR &= 0xFF00; ADC12CTL0 &= ~ENC; //Para poder hacer cambios en los registros ADC12CTL0 = SHT1 15 | SHT0 15 | ADC12ON | MSC; //MSC =1 => Cada conversión se realiza apenas la anterior haya terminado ADC12CTL1 = CSTARTADD 0 | SHS 0 | SHP | ADC12DIV 7 | ADC12SSEL 2 | CONSEQ 1; //CONSEQx = 1 => MODO DEL ADC12: Secuencia de canales. ADC12MCTL0 = SREF 0; ADC12MCTL1 = SREF 0; ADC12MCTL2 = SREF 0; ADC12MCTL3 = SREF 0 | EOS;// último canal de la secuencia ADC12IE = 0x00; ADC12CTL0 |= ENC; // habilita conversión } Seminario de Computadores I, 2004 24 ADC12 Ejemplo: Conversión única, secuencia de canales Función de conversión. Se llama con argumento de los cuatro canales por convertir. Los canales pueden estar en cualquier orden deseado y pueden repetirse. void CONV ADC SEQ(int CH1,CH2,CH3,CH4) { ADC12CTL0 &= ~ENC; ADC12MCTL0 &= 0xFFF0; //Se limpia canal anterior ADC12MCTL1 &= 0xFFF0; //Se limpia canal anterior ADC12MCTL2 &= 0xFFF0; //Se limpia canal anterior ADC12MCTL3 &= 0xFFF0; //Se limpia canal anterior ADC12MCTL0 |= (CH1 & 0x0F);//Selecciona 1er canal a convertir ADC12MCTL1 |= (CH2 & 0x0F);//Selecciona 2do canal ADC12MCTL2 |= (CD3 & 0x0F);//Selecciona 3er canal ADC12MCTL3 |= (CH4 & 0x0F);//Selecciona 4to canal ADC12CTL0 |= ENC; ADC12CTL0 |= ADC12SC; while (ADC12CTL0 & ADC12SC); ResultadoADC[0]=ADC12MEM0; //Los resultados de la conversión ResultadoADC[1]=ADC12MEM1; //se almacenan en variables ResultadoADC[2]=ADC12MEM2; // globales ResultadoADC[3]=ADC12MEM3; } Seminario de Computadores I, 2004 25