Uso Practico del Pic12F675 (VIII) - PICKEY ELECTRÓNICA

Vaya al Contenido

Menu Principal:

Uso Practico del Pic12F675 (VIII)

Uso Practico del PIC12F675 (VIII)


PRACTICAS: MnEBasic (módulo convertidor analógico a digital, ADC).

.Modulo convertidor analógico digital (ADC):
Descripción:

El microcontrolador Pic12F675 tiene un modulo convertidor analógico digital que se nombrar de forma abreviada como ADC. Se utiliza para saber el valor de la tensión que tenga en su entrada. El módulo ADC que contiene el pic es de propósito general por lo que no es muy rápido pero su utilidad es realmente extensa. Este módulo convierte una señal analógica en otra equivalente a digital de 10bit. Tiene 4 entradas analógicas pero solo una de ellas se puede leer a un tiempo, la entrada activa se selecciona mediante un multiplexor interno dedicado a este propósito que la conecta al circuito sample and hold. Para poder realizar la conversión el ADC necesita una fuente de tensión de referencia que puede seleccionarse desde dos orígenes distintos, uno puede ser la alimentación del pic y el otro puede ser una tensión de referencia externa suministrada al pin destinado a este propósito y que ocupa una de las entradas analógicas, y por ultimo se necesita una fuente de pulsos de reloj. El resultado de la conversión se obtiene en dos registros de 8bit cada uno.

En la imagen se puede ver su estructura interna

Imagen extraída del datasheets de Microchip dispuesto para el Pic12F675


.Preparándose para la configuración del módulo ADC:

La principal dificultad a la hora de configurar el módulo ADC del pic se encuentra en la correcta sincronización del reloj principal con la velocidad real del convertidor, que por supuesto siempre su respuesta es más lenta. Para dar solución a este problema el pic dispone de un divisor de frecuencia dispuesto entre el reloj principal y la entrada de reloj del ADC. Para poder seleccionar la escala del divisor el datasheets del microcontrolador especifica que se necesitan 11Tad para realizar cada conversión. El Tad se entiende que es un pulso de reloj de un ancho (tiempo) determinado que lo da la velocidad de conversión del módulo ADC. En este caso el manual indica que como mínimo tiene que ser de 1.6uS, por lo tanto en la tabla, para la frecuencia de reloj seleccionada, se buscará la configuración del divisor que de como resultado 1.6uS o en su defecto por no existir, la inmediata superior. Si se observa con detalle la tabla, es posible que se dé la paradoja de que a una frecuencia de reloj más elevada el ADC trabaje más lento ya que solo se pueden seleccionar múltiplos de la frecuencia principal.

En la siguiente tabla se muestran los bits dispuestos a este fin, con la disposición para varias frecuencias de reloj.

Imagen extraída del datasheets de Microchip dispuesto para el Pic12F675


Al tiempo de conversión de la lectura hay que añadirle el tiempo de lectura de los registros de salida. Cuando muestra el resultado en un solo registro de 8bit se tarda 4 ciclos de reloj en leerlo o lo que es lo mismo 1 ciclo de ejecución de instrucción y, 8 ciclos de reloj (2 ciclos de instrucción) cuando el formato de salida es con 10bits, porque el resultado de la lectura se divide en dos registros de 8bits. Se tendrá que hacer una espera mínima de 10uSeg. si se realiza un cambio de configuración en tiempo de ejecución para estar seguro que la lectura no estará falseada. El tiempo de espera es el necesario para que el módulo complete su nueva configuración y se estabilice. La impedancia de la señal aplicada a la entrada no debe superar los 10k, de esta forma se garantizan que se está trabajando dentro de los parámetros expuestos en el datasheets del micro. El módulo tiene un flag de aviso de terminación de lectura y permite interrupciones, también puede trabajar en el modo Sleep del micro mediante el reloj interno RC. Esta permitido abortar la conversión que esté en proceso, pero después de esto hay que esperar 2Tad antes de demandar una nueva y, los registros de salida mantienen el valor de la conversión anterior.

Registros de salida del ADC:

La conversión interna del ADC siempre es a 10bit pero se puede programar para que la muestre en dos formatos:
10bits y 8bits, los registros de lectura son ADRESH y ADRESL, son el valor de mayor y menor peso de la lectura respectivamente y ambos se usan con el formato de salida de 10bits. Si se eligió el formato de salida de 8bits el valor de la conversión se lee en el registro ADRESH.

.Configurando el módulo ADC:
Configuración y ejemplos:
Ejemplo1:
Los registros de configuración son dos ADCON0 y ANSEL:

Registro ANSEL



ANSEL (ADCS2:ADCS0)
se asigna el tipo de reloj y su conversión al módulo ADC.
ANSEL (ANS3:ANS0)
se selecciona los pin que trabajan como analógicos y con el registro TRISIO bits se asignan como entradas.

Bits ADCS2:ADCS0: Bits selectores del tiempo de adquisición:

Con los bits ADCS2:ADCS0 se selecciona el tiempo de adquisición del modulo ADC que es de 11Tad (1Tad=1.6uS para este ADC). Conocido esto solo queda configurar los bits del divisor según la tabla trabajando con un cristal de 4Mhz; Como no existe un múltiplo que de 1.6uS exactos se elige el inmediato superior que es 2uS (001=8Tosc).
Resumiendo:
Trabajando a 4Mhz elegimos la opción 001 = FOSC/8, porque (4Mhz/8) = 2uSeg. Y en el caso de no obtener el valor exacto como en este caso, el datasheets indica que se seleccione el inmediato superior o coloquemos un cristal con una frecuencia especial.

Nota: 4Mhz/8=0.5Mhz => 1/0.5Mhz = 2uSeg., 11Tad*2uSeg.=22uSeg. conversión completa 10bits. Hay que tener en cuenta que el micro siempre internamente genera una conversión de 10bits.
Es posible que configurando otros valores inferiores a los recomendados el modulo funcione correctamente, pero se sale fuera de los parámetros recomendados, esto implica que aunque funcione correctamente el ADC del micro utilizado puede que al utilizar otro distinto, sus márgenes de tolerancia sean distintos y no funcione correctamente.

Configuración en modo bit:

ANSEL.ADCS2:ADCS0 = 001 = Fosc/8, selecciona el divisor.
ANSEL.ADCS2=0
ANSEL.ADCS1=0
ANSEL.ADCS0=1

ANSEL.ANS3=1 'GP4/AN3, trabaja como analógico.
ANSEL.ANS2=0 'GP2/AN2, I/O trabaja como digital.
ANSEL.ANS1=0 'GP1/AN1, I/O trabaja como digital.
ANSEL.ANS0=0 'GP0/AN0, I/O trabaja como digital.
I/O = el pin puede trabajar como entrada o salida (Input/Output) según se programe en el registro TRISIO.

Asignación de bits como entrada o salida:

TRISIO.2 = 0 'GP2/AN2, como salida, control led.
TRISIO.4 = 1 'GP4/AN3 pin, como entrada, lectura de la resistencia ajustable.
TRISIO.5 = 0 'GP5 pin, como salida, Tx puerto serie.
El resto de pins como entradas.

Modo abreviado:

ANSEL = %00011000 'Fosc/8 (4Mhz/8=2uSeg.), AN3 analógico y resto I/O (bit 3-0):
TRISIO = %11011011  'Se definen los pin como entrada=1 y como salida=0
% en este lenguaje significa que el numero siguiente esta expresado en binario.

ADCON0 registro de control del módulo conversor analógico a digital:

Registro ADCON0



Selección en modo bits:

ADCON0.ADON = 1 'Activa el módulo
ADCON0.GO/_DONE 'Se pone a 1 para activar el proceso de conversión, solo cuando el módulo ya es estable con la configuración.
ADCON.CHS1:CHS0 'Selecciona el pin analógico (canal) que se asigna al ADC para su lectura.
ADCON.CHS1=1
ADCON.CHS0=1

Tabla de selección de canal de entrada

ADCON.VCFG=0 'Tensión de referencia conectada a la alimentación del pic.
ADCON.ADFM = 1 'Se justifican los bits hacia la derecha, formato de salida de la conversión con 10bit. Si ADFM = 0 los bits se justifican hacia la izquierda que dando el formato de salida de la conversión con 8bits.

Modo abreviado:

ADCON0 = %10001101  'Adc salida con 10bit, vdd reference, canal AN3 (bit 3-2), adc On
% en este lenguaje significa que el número siguiente está expresado en binario.

Funcionamiento del ejemplo 1:

Se ha configurado el módulo ADC para que el resultado se exprese con 10bit, lee el valor de tensión del cursor de la resistencia variable RAJ2 situado en el pin AN3 de la placa MnEBasic, estos valores están comprendidos entre 0 y 1023. El valor de la lectura se envía al puerto serie RS232 siendo mostrado en la pantalla del ordenador mediante el Hyperterminal. El valor se expresa en voltios con un decimal.

Cálculo de puntos de resolución del ADC a voltios:
Para 10bits:
V = (AN3 * Vref) /1023Padc
Para 8bits:
V = (AN3 * Vref) / 255Padc
Vref = 5V.
AN3 representa el valor de la conversión del ADC.

Interrupciones con el módulo convertidor analógico digital, ADC (Ejemplo 2):

En el ejemplo2 se configura el formato de salida de la conversión del ADC con 8bits.
Se añade la configuración de la mascara para la activación de las interrupciones del módulo.
Cada vez que se entra en la rutina de interrupciones se cambia de estado el led2 y se borra el flag de interrupción.
En este ejemplo no se puede activar una nueva lectura desde esta rutina porque las interrupciones en este caso interfieren con la emulación del puerto serie RS232. Por lo que solo se puede pedir una nueva lectura después de que esta función termine de enviar los datos al puerto serie.

ADCON0 = %00001101
 'Adc a 8bit, vdd reference, canal AN3 (bit 3-2), adc On

PIE1.ADIE = 1
, habilita la interrupción del modulo convertidor analógico digital (ADC)
INTCON.PEIE = 1
, habilita las interrupciones de periféricos
INTCON.GIE = 1
, habilita las interrupciones generales

Los tres bits anteriores habilitan las interrupciones del módulo ADC. Los bits GIE y PEIE son bits genéricos que afectan a todos los módulos del pic que permiten interrupciones, son bits generales. El bit ADIE es el especifico para el módulo tratado.

Generando una lectura:

Se hace ADCON0.GO/_DONE = 1, comienza el proceso de conversión.
Cuando ADCON0.GO/DONE lo pone a 0 el módulo, indica que terminó la conversión y además se activa el flag de interrupción ADIF=1, esto provoca que una vez terminada de ejecutar la instrucción en proceso, se salta a una dirección determinada donde estará ubicada la rutina de interrupciones.

En este lenguaje el código queda como sigue:

On Interrupt
'Rutina de interrupciones, deshabilita las interrupciones generales, no modifica bit especifico de interrupciones.
  Toggle GP2
 'Cambia de estado el pin, Led2
  PIR1.ADIF = 0
 'Borra el flag de interrupción del comparador.
Resume
 'Habilita las interrupciones generales y retorna al programa, no modifica el estado del bit especifico de interrupciones.

Es obligatorio el borrado de bit ADIF del registro PIR1
, de lo contrario cuando se activen de nuevo las interrupciones al salir de la rutina de interrupciones se forzará un nuevo salto a ella, provocando un mal funcionamiento del programa. El borrado se realiza de la siguiente manera:

Borrado del flag especifico de interrupciones del módulo, en este caso el bit ADIF
, esto es PIR1.ADIF=0.

.Particularidades del Pic12F675:
Este chip tiene dos particularidades especiales, y son dos ajustes que el fabricante realiza para cada PIC12F675, estos parámetros son diferentes en cada chip, por lo que es conveniente hacer una primera lectura del microcontrolador mediante el programador y guardar estos valores. Estos Bits son los de Bandgap y los Bits de configuración del registro Osccal. Si no se carga el registro Osccal con el valor adecuado puede que no funcione la comunicación serie RS232 de la mini-entrenadora MnEBasic.


 
Copyright 2016. All rights reserved.
Regreso al contenido | Regreso al menu principal