Este documento describe el módulo de conversión analógico a digital (A/D) de un microcontrolador. Explica los registros relacionados con el módulo A/D, las opciones para la fuente del reloj de conversión, y cómo seleccionar y leer canales analógicos en C. También incluye ejemplos de código C para medir canales analógicos y aplicaciones como un termómetro digital.
3. VOLTAJES DE REFERENCIA EXTERNOS
• 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á– 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
que el máximo voltaje en VREF- será de 3V.Prof. Luis Zurita Microcontroladores II
4. 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• 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
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)
• 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 10fabricante 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. 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. • 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
14. A/D en C
• 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 00000000ADC_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
correspondiente a los bits 3:0 del ADCON1.Prof. Luis Zurita Microcontroladores II
15. PCFG3
PCFG0
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN0
RA0
setup_adc_ports(valor);
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_ANALOGS011X 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
16. set_adc_channel(canal)
Canal: selección del canal analógico correspondiente a
los bits 5:3 del ADCON0.
A/D en C
0(AN0) 1(AN1) 2(AN2) 3(AN3)
4(AN4) 5(AN5) 6(AN6) 7(AN7)
Prof. Luis Zurita Microcontroladores II
17. 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:
A/D en C
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
18. • 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:
A/D en C
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
19. En el siguiente ejercicio, se
medirá un canal analógico
que ingresa por RA0 y se
muestra su valor en digital y
en voltaje en una pantalla
LCD.
#include <16f877a.h>
#device ADC=10
#fuses
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
lcd_init();
while(TRUE){
set_adc_channel(0);
delay_ms(100);
valor=read_adc();
p=0.004883*valor;
A/D en C. Ejercicio 1. Lectura de un canal.
#fuses
XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_IO(c)
#include <lcd.c>
int16 valor=0;
float p;
void main(){
p=0.004883*valor;
lcd_gotoxy(1,1);
printf(lcd_putc,"fA/DValor=%4LUn",valor);
printf(lcd_putc,"Voltaje=%g",p);
}
}
Prof. Luis Zurita Microcontroladores II
20. A/D en C. Ejercicio 1. Lectura de un canal.
Prof. Luis Zurita Microcontroladores II
21. 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
A/D en C. Ejercicio 2. Lectura de dos canales.
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
22. #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;
A/D en C. Ejercicio 2. Lectura de dos canales.
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
24. A/D en C. Ejercicio 2. Lectura de dos canales.
Prof. Luis Zurita Microcontroladores II
25. 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Ω.
A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
Estas características se pueden ajustar así como
la temperatura a medir en el menú de edición del
componente.
Prof. Luis Zurita Microcontroladores II
26. Modificación de los valores de la NTC en
Proteus
Cambiar por 25°C
Prof. Luis Zurita Microcontroladores II
27. 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):
A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
Prof. Luis Zurita Microcontroladores II
28. #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>
A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
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
29. 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));
A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
y = (1.0/298.15) + (A *(1.0/4050.0));
temp=1.0/y;
temp = temp -273.15;
printf(lcd_putc,"fTEMPERATURAn");
printf(lcd_putc,"nT = %04.2fC", temp);
}
}
Prof. Luis Zurita Microcontroladores II
30. A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
Prof. Luis Zurita Microcontroladores II