MICROCONTROLADORES II
MÓDULO A/DMÓDULO A/D
(Convertidor Analógico/Digital)
TEMA 4
PROF. LUIS ZURITA
RESOLUCIÓN
Prof. Luis Zurita Microcontroladores II
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
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
• 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
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
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
• 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
CICLOS DE CONVERSIÓN
Prof. Luis Zurita Microcontroladores II
FORMATO DE RESULTADOS
Prof. Luis Zurita Microcontroladores II
Prof. Luis Zurita Microcontroladores II
Prof. Luis Zurita Microcontroladores II
Prof. Luis Zurita Microcontroladores II
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
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
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
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
• 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
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
A/D en C. Ejercicio 1. Lectura de un canal.
Prof. Luis Zurita Microcontroladores II
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
#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
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;
A/D en C. Ejercicio 2. Lectura de dos canales.
Continuación.
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
A/D en C. Ejercicio 2. Lectura de dos canales.
Prof. Luis Zurita Microcontroladores II
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
Modificación de los valores de la NTC en
Proteus
Cambiar por 25°C
Prof. Luis Zurita Microcontroladores II
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
#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
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
A/D en C. Ejercicio 3. Termómetro con una NTC
NTSA0WB203
Prof. Luis Zurita Microcontroladores II

Micro2 tema 4

  • 1.
    MICROCONTROLADORES II MÓDULO A/DMÓDULOA/D (Convertidor Analógico/Digital) TEMA 4 PROF. LUIS ZURITA
  • 2.
    RESOLUCIÓN Prof. Luis ZuritaMicrocontroladores II
  • 3.
    VOLTAJES DE REFERENCIAEXTERNOS • 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 ALMÓ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 delreloj 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 uncontrol 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.
    CICLOS DE CONVERSIÓN Prof.Luis Zurita Microcontroladores II
  • 10.
    FORMATO DE RESULTADOS Prof.Luis Zurita Microcontroladores II
  • 11.
    Prof. Luis ZuritaMicrocontroladores II
  • 12.
    Prof. Luis ZuritaMicrocontroladores II
  • 13.
    Prof. Luis ZuritaMicrocontroladores 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 AA 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 delcanal 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 delresultado 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 siguienteejercicio, 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 siguienteejercicio, 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 #fusesXT,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
  • 23.
    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; A/D enC. Ejercicio 2. Lectura de dos canales. Continuación. 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
  • 24.
    A/D en C.Ejercicio 2. Lectura de dos canales. Prof. Luis Zurita Microcontroladores II
  • 25.
    En este ejerciciose 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 losvalores de la NTC en Proteus Cambiar por 25°C Prof. Luis Zurita Microcontroladores II
  • 27.
    La NTC selinealiza 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 #fusesXT,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