PDF de programación - Capítulo 5/12 - ADC10 - A/D Converter – Conversor Analógico / Digital - Curso sobre Microcontroladores

Imágen de pdf Capítulo 5/12 - ADC10 - A/D Converter – Conversor Analógico / Digital - Curso sobre Microcontroladores

Capítulo 5/12 - ADC10 - A/D Converter – Conversor Analógico / Digital - Curso sobre Microcontroladoresgráfica de visualizaciones

Publicado el 31 de Mayo del 2018
637 visualizaciones desde el 31 de Mayo del 2018
461,7 KB
8 paginas
Creado hace 13a (19/11/2011)
Curso sobre Microcontroladores
Familia HC9S08 de Freescale

Por Ing. Daniel Di Lella – EduDevices – www.edudevices.com.ar
e-mail: [email protected]
Responsable Area Educación – ELKO / ARROW – www.elkonet.com
e-mail: [email protected]

Capítulo 5.
Entrega Nº 12
ADC10 - A/D Converter – Conversor Analógico / Digital.
Como se había visto en las entregas número 10 y 11, el módulo conversor A/D de la
familia HC9S08 si bien es muy similar al de la familia HC908 posee mayor
funcionalidad que este último y por ello en esta entrega veremos algunos ejemplos de
aplicación.

Ejemplos Prácticos.

A continuación veremos algunos ejemplos prácticos aportados por el grupo del
“Trainning Center” de Freescale Semiconductor, para el dispositivo MC9S08QG8
en lenguaje “C” pero que pueden modificarse muy fácilmente para trabajar con
dispositivos como el MC9S08AW60CFUE contenido en la placa PLUGIN_AW que
equipa al sistema EDUKIT08 para trabajar con la familia HC9S08.

1er Ejemplo.

Se deberá configurar al ADC del MC9S08QG8 para realizar la siguiente medición:

• Leer la entrada analógica desde un canal ADC y almacenar el resultado en memoria.
• Chequear el estado de los bits COCO y ADACT antes de cada conversión para

asegurar que el ADC está listo.

• Usar disparo por software (Software trigger).
• Configurar el prescaler para proveer una frecuencia de reloj de conversión de 2

• Asumir una frecuencia de Bus (FBUS) de 8 Mhz.
• Realizar una conversión Simple en modo High Speed y con tiempo de muestreo

Mhz.

corto.

• Usar el canal 1 del ADC.
• Apagar el módulo COP.

Se usará una función para realizar la medición ADC:

• Se identificará la entrada del canal ADC en una variable.
• Se verificará que la conversión ha sido completada.
• Se almacenará el resultado en memoria

El programa principal inicializa el módulo ADC del QG8 luego del reset y luego llama
a la subrutina que hará la medición. Al salir del reset, lo primero en configurar es el
registro de opciones del sistema SOPT (System Option Register). Es una buena
costumbre configurar los bits de este registro en forma explícita, aún cuando los mismos
se encuentren con el valor buscado luego del reset. Para el propósito de este ejercicio,
los bits del COP y modo STOP fueron configurados para deshabilitar dichas funciones.

El primer paso para usar el ADC es configurar el registro ADCCFG.

El bit ADLPC se configura a “0” indicando que se usará el ADC en modo High –
Speed. El bit ADLSMP también es configurado a “0” para garantizar tiempos cortos de
muestreo.

Los bits de MODE serán configurados como “10” para seleccionar 10 Bits de
resolución del A/D.

En orden de proveer al ADC de un reloj (clock) de conversión de 2 Mhz desde un
FBUS = 8 Mhz, los bits del ADICLK han sido configurados con el valor “01”
indicando que la frecuencia de bus será dividida por 2. Como todavía nos falta una
división por 2, configuramos los bits ADIV con el valor “01” que indica una nueva
división por 2 del FBUS. De esta forma la frecuencia de trabajo del ADC será de 2
Mhz. El lector puede también configurar los registros ADICLK y ADIV de forma
diferente para lograr el mismo resultado.

El segundo paso es configurar el valor del registro ADCSC2.

El bit ADACT es un bit de solo lectura y no puede ser modificado en este paso.
El bit ADTRG se configura a “0”, habilitando el disparo por software (escribiendo el
ADCSC1). Como no se usará la función “Compare” esta se deshabilita poniendo un
“0” en el bit ACFE. También, por el mismo motivo, el bit ACFGT no es importante y
se configura a “0”, al igual que los registros ADCCVH y ADCCVL cuyo valor de
comparación no es importante y no serán escritos en esta aplicación.
Los restantes bits del registro ADCSC2 están reservados o no son usados, por lo
que los escribiremos con “0s”.

Antes de entrar al “loop” del programa, se tienen que deshabilitar las entradas del canal
ADC que no serán utilizadas para la aplicación. Para ello se trabajará con los registros
APCTL1 /APCTL2 / APCTL3 configurando solo el APCTL1 para utilizar el
canal 1 del ADC y los registros restantes se conservarán con sus valores de origen.

El loop del programa llama a una función que efectúa la medición y almacena el
resultado de la misma en memoria. Esta función maneja todas las actividades
relacionadas con el ADC. La misma requiere que el ADC sea configurado de antemano
y ello se efectúa al salir del reset como se describió anteriormente.

De esta forma, la función solo necesita conocer que canal se usará y si la
conversión será Simple o Continua. Eso se logra pasando la configuración deseada del
registro ADCSC1 dentro de la función para cumplir con ello.

Cuando se llama a la función “ConvertATD”, la configuración del registro ADCSC1
pasa dentro de la misma, como puede verse en las líneas de código que figuran a
continuación.

En este ejercicio, la medición con el ADC es muy simple, el programa de loop principal
es el encargado de realizar la medición. Sin embargo, el uso de una “función” es un
buen ejemplo de “reusabilidad” de código que puede ser empleada en un programa
mucho más grande.

Por ejemplo, si se quisiera medir 8 entradas analógicas con cada uno de los canales
analógicos disponibles en el QG8, solo habría que configurar el registro ADCSC1 para
seleccionar cada una de los canales del ADC. La variable “adcsc1” contiene el byte
pasado a la función desde el programa principal.

Tan pronto como la función almacena el valor representado por “adcsc1” en el registro
ADCSC1, el módulo comienza con la conversión.

Dentro de la función se procede a monitorear el estado de actividad del conversor por
medio del bit ADACT y el fin de la conversión por medio del bit COCO.

Finalmente, cuando ocurre el fin de la conversión, se guardará el resultado de la misma
en posiciones de memoria RAM ($0200 y $0201).

Mejoras en el Programa.

Podemos efectuar las siguientes mejoras:

• Usar un algoritmo de promediación para tomar las mediciones.
• Habilitar la interrupción del módulo para reportar los cambios.


Incluir una “rutina de manejo de errores”.

Al programa ejemplo se le puede agregar un algoritmo de promediación para filtrar los
datos. De esta forma, al efectuar múltiples conversiones y luego promediarlas, se
dispone de un “filtro digital” que permite obtener mediciones mucho más estables y
precisas frente al ruido que generalmente está presente en este tipo de mediciones.

El método utilizado de “loop” y monitoreo de flags en la función “ConvertADT” puede
provocar que el programa entre en un “loop infinito”, si por alguna razón el bit COCO
nunca se pone en “1”, el programa quedará enganchado en el loop y nunca podrá salir
de él.

Otro problema que se presenta es la perdida de tiempo por parte del CPU a la espera del
fin de la conversión por tener que vigilar el estado del bit COCO.

Si se introduce la generación de una interrupción cuando la conversión ha sido
completada por el ADC, se logra no solo el ahorro de tiempo de procesamiento para
hacer otras cosas por parte del CPU, sino que también se consigue introducir una rutina
de control de tiempo que permita generar un aviso cuando, por algún motivo, se haya
cumplido con el tiempo para la conversión y el bit COCO no esté en “1” indicando el
fin de la conversión. A este tipo de rutinas se las suele llamar “Time Out” y son muy
útiles para hacer del programa algo más consistente ante los errores.

2do. Ejemplo.

Introducción

Nos toca ahora describir y aplicar las interrupciones en el módulo conversor A/D.
La aplicación es sencilla, mostraremos en el LCD del sistema didáctico EDUKIT08
personalizado con la placa “PLUGIN_AW” (MC9S08AW60CFUE) el resultado de la
conversión A/D, solo que no haremos polling sobre el bit de conversion complete
(COCO) sino que dejaremos que ocurra una interrupción, y dentro de la ISR
procesaremos el resultado.

Configuración de las interrupciones

Toda la configuración del módulo conversor A/D, hecha con el Processor Expert, es
válida salvo lo referido a las interrupciones. Observemos la ventana del Processor
Expert dedicada al conversor A/D:

El gran cambio es que la interrupción por conversión complete está en Enabled,
desenmascarando las interrupciones por finalización de conversión A/D. Por otra parte,
el Processor Expert nos pone al tanto del nombre de la ISR, isrVadc, en este caso.

Con solo esta variante y generando el archivo “MCUinit.inc” que corresponde, el
conversor A/D ya está en condiciones de generar interrupciones.

Descripción del programa

Dijimos que este programa mostrará los resultados en el LCD. Por ello la primera tarea
del programa es inicializar el LCD:

La segunda tarea es mostrar la leyenda “LECTURA DEL A/D:” y poner a cero, las
variables digito_1, digito_2, digito_3 y digito_4, encargadas de almacenar los dígitos
que se mostrarán en el LCD:

Con esto, estamos en condiciones de mostrar un número en pantalla, aunque todavía no
tengamos un valor proveniente del A/D (veremos un “0000”):

Y disparamos la conversión A/D. Esta forma de dispararla es diferente a la vista en
ejemplos anteriores, pero no es difícil de entenderla si recordamos los bits que forman el
registro ADC1SC1:

El canal sigue siendo el 8, pues la señal la tomamos siempre del pin del
microcontrolador al cual se ha conectado el preset. La diferencia la encontramos en el
bit AIEN, que se encuentra en “1” en esta ocasión. Su función es desenmascarar las
interrupciones por el módulo conversor A/ D cuando el bit es igual a “1”.Para ser
exactos, la interrupción se dispara al completarse la conversión A/D.

Otra diferencia en este programa respecto a los anteriores se encuentra en que tras
disparar la conversión A/D no esperamos a que esta concluya, sino que continuamos
realizando otras tareas, en este caso esperar 1 segundo. Es el procedimiento habitual en
un programa que utiliza interrupciones, dejar que la ISR se ocupe de procesar los
eventos que genera un periférico.

Cada 1 segundo el programa se encargará de r
  • Links de descarga
http://lwp-l.com/pdf11471

Comentarios de: Capítulo 5/12 - ADC10 - A/D Converter – Conversor Analógico / Digital - Curso sobre Microcontroladores (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad