Practica No 13 - 6EM4 - ADC

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 13

CARRERA DE INGENIERIA ELECTRICA.

Prácticas de Laboratorio de Electrónica III. Practica No. 13

INSTTITUTO POLITECNICO NACIONAL


Escuela Superior de Ingeniería Mecánica y Eléctrica

INGENIERIA ELECTRICA

LABORATORIO DE ELECTRONICA III.

PRACTICA No. 13 (Nov-2022)

Convertidor Analógico-Digital “ADC”.


Convertidor Digital Analógico “DAC”.

Número de Equipo: _____

Grupo: _____

INTEGRANTES

Nombre de los Alumnos: No. de Boleta:


1). ___________ ___________ ______________ ____________
2). ___________ ___________ ______________ ____________

Nombre de los Profesores:


Prof. Titular: ___________ ___________ _____________
Prof. Adjunto: ___________ ___________ _____________
Prof. Adjunto: ___________ ___________ _____________

Fecha de realización: ___________

Calificación: ___________

JLDM Pá gina 1 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

PRÀCTICA No 13: Convertidor Analógico-Digital “ADC”.


Convertidor Digital Analógico “DAC”.
.

OBJETIVOS:

a) Conceptualización de Conversión analógico-Digital y Conver4sión Digital-Analógico para la


configuración del microcontrolador ATMEGA328P y ESP32.
b) Configuración de los registros del ADC en el microcontrolador ATMEGA328P y ESP32.
c) Aplicación en el uso del microcontrolador ATMEGA328P y ESP32, en la configuración de
sus puertos ADC y DAC.

Marco Teórico.

Material y equipo utilizado

1 Computadora
1 Software Arduino IDE y Thonny.
1 Tarjeta Arduino Uno y ESP32 (KIT Microcontrolador).

DESARRROLLO DE LA PRÁCTICA.

13.1 Manejo y funcionamiento del temporizador de propósito general.

El primer ejercicio que se llevara a cabo es leer una señal analógica conectada a la A3 y el valor
obtenido se verá en la ventana del Monitor Serie.

/*
* Practica 13a_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Convertidor Analógico Digital con Monitor serie
*/

int AnalogTerm = 3; // Salida en la terminal 9 con un LED


int val = 0; // Variable auxiliar

void setup() {
Serial..begin(9600); // Configura la terminal Monitor Serie
}

void loop() {
val=analogRead(AnalogTerm);
    Serial.println(val);
}

JLDM Pá gina 2 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

Para llevar a cabo la adquición de datos, para su después conversión de la señal analógica a digital
debemos conocer el tiempo de muestreo, esto lo hacen os de la siguiente forma.

/*
* Practica 13b_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/

void setup(){
Serial.begin(9600);
muestreo();
}

void loop(){
}

void muestreo(){
unsigned long time1=0;
unsigned long time=0;
Serial.println("*************************");
Serial.println("ENSAYO TIEMPO DE MUESTRO:");
Serial.println("*************************");
for(byte i =0; i<4; i++){
time1=micros();
int A=analogRead(A0);
time=micros()-time1;
Serial.print(" Muestra: ");
Serial.print(i+1);
Serial.print(" Tiempo: ");
Serial.println(time);
}

Se mostrará en la ventana de Monitor Serial como sigue.

Excepto en la primera medida, las demás tiene un tiempo de muestreo de 112 micro segundos, lo
que equivale a una frecuencia de muestreo de 8.928 kHz, podemos tomar por valido ya que estoy

JLDM Pá gina 3 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13
utilizando una placa Arduino UNO. A demás debemos tener en cuenta una pequeña perdida de
tiempo que tenemos al guardar y calcular las variables time1 y time.

Otro factor a tener en cuenta del ADC es su resolución, para ello hablamos de los bits
de resolución que tiene, los bits no permiten hacer combinaciones, cuantos mas tengamos mayor
numero de combinaciones podremos hacer, cada una de estas combinaciones muestra una medida
del sistema analógico, la cantidad de medidas que tenemos serán 2 elevado al numero de bits de
resolución. Puesto que Arduino UNO, en mi caso, tiene un ADC de 10 bits de resolución tendrá
1024 combinaciones. La placa Arduino DUE por ejemplo cuenta con un ADC de 12 bits (4096
combinaciones).

Pero hay un segundo factor que interviene en la resolución, es el rango de medida, El rango de
Voltae de las placas Arduino por defecto es de 5v o 3.3v. Con esto sabemos que en voltios tenemos
una resolución igual a;

5V
Resolución= =4.88 mV
1024

A continuación, haremos un ejemplo con Arduino de la resolución midiendo el voltaje en un


potenciómetro, iremos girando la manecilla del potenciómetro y veremos que conversión da
el ADC y a que corresponde en voltaje. Comprobaremos además que el paso calculado antes de
4.88mV es correcto.

El código que utilizaremos es el siguiente:

/*
* Practica 13b_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino

JLDM Pá gina 4 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

*/

int contador;

void setup(){
contador=1;
Serial.begin(9600);
Serial.println("*****************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("*****************");
}

void loop(){
muestreo();
contador++;
}

void muestreo(){
int A=analogRead(A0);
float B= float(A)*5/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
Serial.println(B, 5);
delay(1000);
}

Se veráen la ventana del Monitor Serial, de la siguiente forma:

[1.28543−1.28055] V
Resolución Real= =4.88 mV
[263−262]

JLDM Pá gina 5 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

En ocasiones, utilizaremos sensores cuyo rango de voltaje no será igual a [0, 5v]. En primer lugar,
tenemos que tener en cuenta, que no debemos introducir en la placa Arduino voltajes mayores de
5v o 3.3v, partiendo de esto podemos cambiar el límite superior del rango de voltaje. De
manera interna o externa:

La manera interna de cambiarlo, es utilizando sowftware únicamente, para ello utilizaremos la


función analogReference(). Esta función nos permitirá cambiar el límite superior del rango de
voltaje, en la placa Arduino UNO por ejemplo, si introducimos como parámetro INTERNAL el límite
de voltaje superior será de 1.1v. En la placa Arduino mega podemos introducir como
parámetro INTERNAL1V1 y INTERNAL2V56 siendo el nuevo límite 1.1v y 2.56v respectivamente.

A continuación haremos un nuevo ejemplo análogo al anterior, con una placa Arduino utilizando la


función interna analogReference para que su voltaje de referencia sea 1.1v. Para alimentar el
potenciómetro requeriremos una fuente de 1.1v, para crearla utilizaremos un divisor de tensión y un
seguido nivel de tensión:

Una vez montado cargamos el siguiente programa, para verificar que funciona
correctamente:

JLDM Pá gina 6 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

/*
* Practica 13d_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/

int contador;

void setup(){
analogReference(INTERNAL);
contador=1;
Serial.begin(9600);
Serial.println("******************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("REFERENCIA INTERNA");
Serial.println("******************");
}

void loop(){
muestreo();
contador++;
}

void muestreo(){
int A=analogRead(A0);
float B= float(A)*1.1/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
Serial.println(B, 5);
delay(1000);
}

JLDM Pá gina 7 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13
Como se realizo anteriormente podemos tomar dos muestras, y de ahí calculamos la nueva
resolución:

[0.52581−0.48387]V
Resolución Real= =1.075 mV
[489−450]

Conseguimos pues una resolución casi 5 veces mayor que la anterior.

Finalmente, queda la manera externa para cambiar el voltaje de referencia, para ello utilizaremos el
pin AREF. El funcionamiento de este pin es sencillo el voltaje que introduzcamos por el, será la
nueva referencia, pero cuidado, dicho voltaje debe estar entre entre 1.1v y 5v.

Para el siguiente ensayo utilizaremos la configuración anterior, generaremos con el divisor de


tensión y el seguidor de tensión 2.5v, y los llevaremos al pin AREF, el resto lo dejaremos igual.
Respecto al código utilizaremos lo siguiente:

/*
* Practica 13e_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/

int contador;

void setup(){
analogReference(EXTERNAL);
contador=1;
Serial.begin(9600);
Serial.println("******************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("REFERENCIA EXTERNA");
Serial.println("******************");
}

void loop(){

muestreo();
contador++;
}

void muestreo(){

int A=analogRead(A0);
float B= float(A)*2.5/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
Serial.println(B, 5);
delay(1000);
}

Activamos el Serial monitor y vemos los resultados:


JLDM Pá gina 8 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

Medición con el Sensor de Temperatura y Humedad.

Especificación sensor DTH11.

Este sensor se caracteriza por tener la señal digital calibrada por lo que asegura una alta calidad y
una fiabilidad a lo largo del tiempo, ya que contiene un micro controlador de 8 bits integrado. Está
constituido por dos sensores resistivos (NTC y humedad). Tiene una excelente calidad y una
respuesta rápida en las medidas. Puede medir la humedad entre el rango 20% – aprox. 95% y la
temperatura entre el rango 0ºC – 50ºC. 

sensor de temperatura y humedad

JLDM Pá gina 9 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13
De acuerdo a la figura, se tiene el orden de las terminales de forma siguiente:

 Pin 1 = VCC
 Pin2 = Data
 Pin 3 = GND

Sus principales características son:

 Tensión de funcionamiento: 3v – 5.5v.


 Rango de valores del 20% al 90% de Humedad Relativa.
 Rango de valores de 0ºC a 50ºC de Temperatura.
 Resolución de lectura: 1, es decir, nos proporciona tan sólo valores enteros tanto de
humedad relativa como de temperatura.
 Precisión de la humedad relativa: ±5%.
 Precisión de la temperatura: ±2ºC.

 Conexión de sensor de temperatura y humedad con Arduino UNO.


En la parte del sensor de temperatura, para conectarlo al Arduino, en nuestro caso hemos usado un
cable que contiene tres hilos: uno verde que va al SIG (datos), otro amarillo que va al VCC
(alimentación) y otro azul que va al GND (masa). El conector NC no se usa por lo que no necesita
cable. Es importante tener bien identificado cada hilo para conectarlo en su pin correspondiente del
Arduino.
En la parte del Arduino UNO conectaremos el cable blanco (señal) al pin A0 analógico, como se
muestra en la figura.
El siguiente paso se conecta el cable negro (GND) al pin GND, posteriormente se conecta el cable
gris (VCC) al pin de 5v.

JLDM Pá gina 10 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13
Programa en C++  para obtener temperatura y humedad a Arduino UNO.
Una vez conectado el sensor de temperatura y humedad a Arduino UNO, el siguiente paso será
realizar un programa que obtenga los valores de temperatura y humedad y los muestre por el puerto
serie, de esta forma podremos verificar que el hardware (sensor y Arduino) funcionan
correctamente.
Instalaremos los drivers necesarios, instalaremos el IDE de desarrollo de Arduino y conectaremos
Arduino al PC por el puerto USB.
A continuación escribiremos el siguiente programa:

/*
* Practica 13e_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/

#define DHT11_PIN 0      // ADC0


byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
}
return result;
}

void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i; // start condition
// 1. pull-down i/o pin from 18ms
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in)
{
Serial.println("dht11 start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
Serial.println("dht11 start condition 2 not met");

JLDM Pá gina 11 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

return;
}
delayMicroseconds(80);
// now ready for data reception
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
Serial.print("Humedad = ");
Serial.print(dht11_dat[0], DEC);
Serial.print(".");
Serial.print(dht11_dat[1], DEC);
Serial.print("%  ");
Serial.print("Temperatura = ");
Serial.print(dht11_dat[2], DEC);
Serial.print(".");
Serial.print(dht11_dat[3], DEC);
Serial.println("C  ");
delay(2000);
}

----------------------------------- FIN DE LA PRÀCTICA --------------------------------------------

JLDM Pá gina 12 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 13

JLDM Pá gina 13 de 18

También podría gustarte