Este documento proporciona información sobre el módulo convertidor analógico a digital (A/D) en los microcontroladores. Explica los registros y parámetros relacionados con el módulo A/D, el proceso de conversión, y cómo realizar lecturas A/D en C utilizando funciones como setup_adc, set_adc_channel y read_adc. También incluye tres ejemplos de código C para lecturas A/D de un canal, dos canales y ocho canales.
BIENESTAR TOTAL - LA EXPERIENCIA DEL CLIENTE CON ATR
Clase 4 pro
1. IUT Cumaná
MICROCONTROLADORES II
MÓDULO A/D
(Convertidor Analógico/Digital)
PROF. LUIS ZURITA
2. IUT Cumaná
RESOLUCIÓN
Prof. Luis Zurita Microcontroladores II
3. VOLTAJES DE REFERENCIA EXTERNOS IUT Cumaná
• El convertidor A/D puede seleccionar como tensión de
referencia la interna VDD y Tierra.
• Para referencias externas, se introducen por:
• RA3/AN3/VREF+ y RA2/AN2/VREF-
• Las siguientes limitaciones aplican:
– El máximo voltaje aplicado a VREF+ (RA3/AN3) será
VDD+0,3V y el mínimo VDD-2,5V.
– Sobre el voltaje aplicado a VREF- (RA2/AN2) la
mínima tensión será VSS-0,3V y la máxima (VREF+) -
2V.
– Por ejemplo, si la tensión de alimentación es de 5V, la
tensión en RA3/AN3 no podrá exceder de 5V. Por lo
Prof. Luis Zurita
que el máximo voltaje en VREF- será de 3V. Microcontroladores II
4. IUT Cumaná
REGISTROS RELACIONADOS AL MÓDULO A/D
• ADCON0: Registro de control 0. (Banco 0).
• ADCON1: Registro de control 1. (Banco 1).
• ADRESH: Guarda la parte alta del Resultado de
la conversión. (Banco 0).
• ADRESL: Guarda la parte baja del Resultado de
la conversión. (Banco 1).
Prof. Luis Zurita Microcontroladores II
5. • Selección del reloj de conversión A/D IUT Cumaná
El tiempo de conversión A/D por bit se define como
TAD. La conversión A/D requiere mínimo 12TAD por
10-bits de conversión.
• La fuente del reloj de conversión A/D es seleccionado
por software, mediante los bits ADCON0 <7:6>. Las
cuatro opciones posibles para TAD son:
ADCS 1:0 PERÍODO
0 0 2TOSC
0 1 8TOSC
1 0 32TOSC
1 1 RC interno (2-6 μs)
Prof. Luis Zurita Microcontroladores II
6. Tiempo de adquisición (TACQ) IUT Cumaná
• Es el tiempo necesario para que se cargue el
condensador de retención interno, con la tensión de
entrada. Este proceso de carga del condensador
depende de distintos factores, entre otros, la
impedancia de la fuente de tensión de entrada (el
fabricante recomienda que se sitúe por debajo de 10
kohm.
• El tiempo de adquisición dentro de los márgenes
típicos es de aproximadamente 20μs.
• La adquisición no comienza hasta que no acabe la
conversión. Por lo que se debe esperar un TACQ tras
una conversión , para seleccionar un nuevo canal o
luego de encender el módulo AD.
Prof. Luis Zurita Microcontroladores II
7. IUT Cumaná
Tiempo de conversión (TAD)
• Es el tiempo necesario para obtener el valor digital
de la tensión analógica de entrada. Este tiempo
depende de la fuente de reloj que se seleccione para
la conversión.
Prof. Luis Zurita Microcontroladores II
8. IUT Cumaná
• Para un control adecuado de conversiones A/D, el reloj
de conversión A/D (TAD) deben ser seleccionados para
asegurar un tiempo mínimo TAD de 1,6 μs.
•La siguiente tabla muestra los tiempos de TAD derivada
de las frecuencias de funcionamiento del dispositivo y de
la fuente de reloj A/D de reloj seleccionado.
Prof. Luis Zurita Microcontroladores II
9. IUT Cumaná
CICLOS DE CONVERSIÓN
Prof. Luis Zurita Microcontroladores II
10. IUT Cumaná
FORMATO DE RESULTADOS
Prof. Luis Zurita Microcontroladores II
14. IUT Cumaná
PASOS PARA REALIZAR UNA CONVERSIÓN
1. Configurar el módulo conversor A/D
· Configurar los pines que actúan como entradas
analógicas, las señales que harán de tensión de
referencia y las que trabajarán como E/S digitales.
(ADCON1).
· Seleccionar el canal de entrada. A/D (ADCON0).
· Seleccionar la fuente de la señal de reloj para la
conversión A/D (ADON0).
· Activar el módulo de conversión A/D (ADCON0)
Prof. Luis Zurita Microcontroladores II
15. IUT Cumaná
PASOS PARA REALIZAR UNA CONVERSIÓN
2. Activar si, se desea, la interrupción. del módulo
conversor A/D:
· Poner a cero el bit ADIF
· Poner a uno el bit ADIE
· Poner a uno los bits habilitadores GIE y PEIE
3. Esperar el tiempo requerido para la adquisición.
4. Inicio de la conversión:
· Poner a 1 el bit GO/#DONE (ADCON0)
Prof. Luis Zurita Microcontroladores II
16. IUT Cumaná
PASOS PARA REALIZAR UNA CONVERSIÓN
5. Tiempo de espera para terminar la conversión A/D
que puede detectarse Por:
· Exploración de bit GO/DONE# , que al finalizar la
conversión toma el valor “0”
· Esperar que se produzca una interrupción si se ha
programado al finalizar la conversión.
· Aunque no se autorice la interrupción el flag ADIF se
pone a “ 1 “ al finalizar la interrupción.
Prof. Luis Zurita Microcontroladores II
17. IUT Cumaná
PASOS PARA REALIZAR UNA CONVERSIÓN
6. Leer el par de registros ADRESH:ADRESL donde se
encuentran los 10 bits que resultan de la conversión
y poner a cero el flag ADIF.
7. Para una nueva conversión volver a los pasos 1 y 2, el
tiempo de conversión por bit está definido por TAD,
se exige un mínimo de 2*TAD para realizar una nueva
conversión.
Prof. Luis Zurita Microcontroladores II
18. A/D en C IUT Cumaná
• En el compilador C las funciones para manejar el
convertidor A/D son las siguientes:
setup_adc(modo);
Donde modo, determina la configuración del módulo
A/D correspondiente a los bits 7:6 del ADCON0.
setup_adc(modo); ADCON0(1Fh)
ADC_OFF 00000000
ADC_CLOCK_INTERNAL 11000000
ADC_CLOCK_DIV_2 00000000
ADC_CLOCK_DIV_8 01000000
ADC_CLOCK_DIV_32 10000000
setup_adc_ports(valor);
Valor: definición de las entradas analógicas
Prof. Luis Zurita correspondiente a los bits 3:0 del ADCON1.Microcontroladores II
19. PCFG3 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 setup_adc_ports(valor);
RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
PCFG0
0000 A A A A A A A A ALL_ANALOG
0001 A A A A VREF+ A A A AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF
0010 D D D A A A A A AN0_AN1_AN2_AN3_AN4
0011 D D D A VREF+ A A A AN0_AN1_AN2_AN4_VSS_VREF
0100 D D D D A D A A AN0_AN1_AN3
0101 D D D D VREF+ D A A AN0_AN1_VSS_VREF
011X D D D D D D D D NO_ANALOGS
1000 A A A A VREF+ VREF- A A AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF
1001 D D A A A A A A AN0_AN1_AN2_AN3_AN4_AN5
1010 D D A A VREF+ A A A AN0_AN1_AN2_AN4_AN5_VSS_VREF
1011 D D A A VREF+ VREF- A A AN0_AN1_AN4_AN5_VREF_VREF
1100 D D D A VREF+ VREF- A A A_ANALOG_RA3_RA2_REF
1101 D D D D VREF+ VREF- A A AN0_AN1_VREF_VREF
1110 D D D D D D D A AN0
1111 D D D D VREF+ VREF- D A AN0_VREF_VREF
20. A/D en C IUT Cumaná
set_adc_channel(canal)
Canal: selección del canal analógico correspondiente a
los bits 5:3 del ADCON0.
0(AN0) 1(AN1) 2(AN2) 3(AN3)
4(AN4) 5(AN5) 6(AN6) 7(AN7)
Prof. Luis Zurita Microcontroladores II
21. A/D en C IUT Cumaná
valor= read_adc();
Lectura del resultado donde valor es un entero de 16
bits, según la directiva #DEVICE ADC= empleada. Esta
directiva trabaja según la tabla:
DEVICE 8 bit 10 bit 11 bit 16 bit
ADC=8 00-FF 00-FF 00-FF 00-FF
ADC=10 x 0-3FF x x
ADC=11 x x 0-7FF x
ADC=16 0-FF00 0-FFC0 0-FFE0 0-FFFF
Prof. Luis Zurita Microcontroladores II
22. A/D en C IUT Cumaná
• Por ejemplo, el fichero 16F877.h incluye como
primera directiva #device PIC16F877. Para incluir la
información del tipo de conversor A/D se debe
añadir #device adc=10.
READ_ADC() admite tres modos de funcionamiento:
ADC_START_AND_READ Si no se indica nada es la opción por
defecto.
Permite iniciar y leer el convertidor.
ADC_START_ONLY Sólo inicia la conversión.
ADC_READ_ONLY Sólo lee los registros del convertidor.
Prof. Luis Zurita Microcontroladores II
23. A/D en C. Ejercicio 1. Lectura de un canal. IUT Cumaná
En el siguiente ejercicio, se setup_adc(ADC_CLOCK_INTERNAL);
medirá un canal analógico setup_adc_ports(ALL_ANALOG);
que ingresa por RA0 y se lcd_init();
muestra su valor en digital y
en voltaje en una pantalla while(TRUE){
LCD. set_adc_channel(0);
#include <16f877a.h> delay_ms(100);
#device ADC=10 valor=read_adc();
#fuses p=0.004883*valor;
XT,NOWDT,NOPROTECT,NOLVP lcd_gotoxy(1,1);
#use delay(clock=4000000) printf(lcd_putc,"fA/DValor=%4LUn",valor);
#use fast_IO(c) printf(lcd_putc,"Voltaje=%g",p);
#include <lcd.c> }
int16 valor=0; }
float p;
void main(){
Prof. Luis Zurita Microcontroladores II
24. A/D en C. Ejercicio 1. Lectura de un canal. IUT Cumaná
Prof. Luis Zurita Microcontroladores II
25. A/D en C. Ejercicio 2. Lectura de dos canales. IUT Cumaná
En el siguiente ejercicio, se medirán dos canales
analógicos (RA0 y RA1), el primero será el valor de
una variable que se desea medir y el segundo será el
set point.
Si la variable está por encima del set point se activa un
led rojo. En caso contrario se activa un led verde.
Prof. Luis Zurita Microcontroladores II
26. A/D en C. Ejercicio 2. Lectura de dos canales. IUT Cumaná
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_IO(C)
#include <lcd.c>
int16 valor=0;
long setpoint=0;
float p;
float psp;
void main(){
set_tris_c(0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
lcd_init();
output_C(0);
Prof. Luis Zurita Microcontroladores II
27. A/D en C. Ejercicio 2. Lectura de dos canales.
Continuación.
IUT Cumaná
while (TRUE){
set_adc_channel(0);
delay_ms(10);
valor=read_adc();
p=0.004883*valor;
printf(lcd_putc,"fSENSOR=%gn",p);
set_adc_channel(1);
delay_ms(10);
setpoint=read_adc();
psp=0.004883*setpoint;
printf(lcd_putc,"SPOINT=%gn",psp);
if(p>=psp){
output_high(PIN_C0);
output_low(PIN_C1);}
else{
output_low(PIN_C0);
output_high(PIN_C1);
}
delay_ms(50);
}
}
Prof. Luis Zurita Microcontroladores II
28. A/D en C. Ejercicio 2. Lectura de dos canales. IUT Cumaná
Prof. Luis Zurita Microcontroladores II
29. A/D en C. Ejercicio 2. Lectura de dos canales. IUT Cumaná
Prof. Luis Zurita Microcontroladores II
30. A/D en C. Ejercicio 3. Lectura de ocho canales. IUT Cumaná
En el siguiente ejercicio, se medirán los 8 canales analógicos
disponibles para el PIC16F877:
#include <16f877.h>
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <math.h> //Se incluye para los cálculos
matemáticos
#define use_portb_lcd FALSE
#define use_portd_lcd TRUE
#include <lcd420.c>
int16 valor1,valor2,valor3,valor4,valor5,valor6,valor7,valor8;
float canal1,canal2,canal3,canal4,canal5,canal6,canal7,canal8;
Prof. Luis Zurita Microcontroladores II
35. A/D en C. Ejercicio 4. Termómetro con una NTC IUT Cumaná
NTSA0WB203
En este ejercicio se plantea diseñar un
termómetro basado en una NTC modelo
NTCSA0WB203, con una beta de 4050 y una
resistencia a 25°C de 20 kΩ.
Estas características se pueden ajustar así como
la temperatura a medir en el menú de edición del
componente.
Nota: Ejercicio tomado de “Compilador C CCS y
simulador Proteus para Microcontroladores PIC” de
Eduardo García Breijo.
Prof. Luis Zurita Microcontroladores II
36. Modificación de los valores de la NTC en IUT Cumaná
Proteus
Cambiar por 25°C
u otro valor de su
preferencia.
Prof. Luis Zurita Microcontroladores II
37. A/D en C. Ejercicio 4. Termómetro con una NTC IUT Cumaná
NTSA0WB203
La NTC se linealiza mediante una resistencia R1 de 10
kΩ, el valor de la tensión de la NTC(VT) se puede
obtener mediante las siguientes ecuaciones
(temperatura en °k):
Prof. Luis Zurita Microcontroladores II
38. A/D en C. Ejercicio 4. Termómetro con una NTC IUT Cumaná
NTSA0WB203
#include "16f877.h"
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <math.h> //Se incluye para los cálculos matemáticos
#include <lcd.c>
void main() {
float tv,tr,temp,y; //Variables de ecuación
int16 value;
lcd_init();
setup_adc_ports(ALL_ANALOG);
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_us(10);
Prof. Luis Zurita Microcontroladores II
39. A/D en C. Ejercicio 4. Termómetro con una NTC IUT Cumaná
NTSA0WB203
while(true) {
value = Read_ADC();
tv = 5.0 * value / 1024.0;
tr = tv * 10000.0 / (5.0 - tv);
A = log(tr/20000.0);
y = (1.0/298.15) + (A *(1.0/4050.0));
temp=1.0/y;
temp = temp -273.15;
lcd_gotoxy(1,1);
printf(lcd_putc,"TEMPERATURA");
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"T = %04.2fC", temp);
delay_ms(50); }
}
Prof. Luis Zurita Microcontroladores II
40. A/D en C. Ejercicio 4. Termómetro con una NTC IUT Cumaná
NTSA0WB203
Prof. Luis Zurita Microcontroladores II