Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
226.- Wemos D1 R32 ESP32. Convertidor Digital-Analógico. DAC.
- Pensamos que un convertidor digital de 8 bits es un circuito al cual se suministramos niveles altos y bajos por sus 8 entradas y obtenemos un valor analógico en su salida, en este caso una tensión.

________________________________
- El ESP32 como convertidor DAC con 8 entradas.
- Esto lo podemos hacer con los mismos terminales del ESP32, utilizamos 8 terminales de entrada y mediante la expresión anterior obtenemos un valor analógico, observa que obtenemos un valor, no una tensión.
- Será un valor comprendido entre 0V y 3,2V, con un paso de 3,2/256 = 0,0125V

________________________________
- El ESP32 como convertidor Digital-Analógico sin entradas. DAC.
- En el ESP32, el concepto es un poco distinto, le aplicamos un número del 0 al 255 mediante el programa y obtenemos un valor de tensión entre 0 y 3,2V, es decir no conectamos 8 entradas como acabamos de ver en los dos ejemplos anteriores, sino que la entrada es una variable, un número, que asignamos en el programa.
- Obtendremos una tensión comprendida entre 0V y 3,2V en los terminales IO25 y IO26, ya que podemos tener dos DAC diferentes.
________________________________
- Diente de sierra. Incremento de 1 desde 0 a 255.
- En este ejemplo vamos a utilizar como salida de nuestro DAC el terminal IO25
|
// Juan Antonio Villalpando
// KIO4.COM
void setup() {
Serial.begin(115200);
}
void loop() {
for (int E = 0; E < 256; E = E + 1){
dacWrite(25, E);
delay(10);
}
}
|
- Aquí tenemos el resultado, a medida que se va incrementando E, se incrementa la tensión en el terminal IO25.
- Los valores de E se incrementarán desde 0 a 255 y el nivel de tensión en el terminal IO25 irá cambiando desde 0V a 3,2V
- En el siguiente dibujo, solo se ha representado hasta el valor 16, observa el paso de unos 0,0125V
- ¿Cómo podemos apreciar esa subida de tensión?
1.- Cambia el delay(100);
- Conecta un voltímetro a IO25, observarás como se incrementa la tensión hasta los 3,1V.
2.- Otra manera, cambia el delay(1);
- Conecta un osciloscopio a IO25, observarás la forma de onda del diente de sierra.
- Otra forma de ver la señal.
- Recuerda el tutorial 140, sobre la entrada analógica y el potenciómetro.
- Vamos alimentar la entrada analógica IO2 desde la salida de IO25 de nuestro DAC, uniéndolas con un cable.
|
// Juan Antonio Villalpando
// KIO4.COM
int IO2 = 2;
float valor = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
for (int E = 0; E < 256; E = E + 1){
dacWrite(25, E);
valor = analogRead(IO2);
Serial.println(valor);
delay(10);
}
}
|
- Vamos al Serial Plotter.
- La
abscisa representa a tiempo en centésima de segundos, en el dibujo un ciclo se realiza aproximadamente en un periodo de 2,5 segundos.
- Podemos cambiar dacWrite(25, 255); y ver que sale una señal continua de unos 3,2V. se mide mejor con un voltímetro.

|
// Juan Antonio Villalpando
// KIO4.COM
int IO2 = 2;
float valor = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
for (int deg = 0; deg < 360; deg = deg + 1){
dacWrite(25, int(128 + 127 * (sin(deg*PI/180))));
valor = analogRead(IO2);
Serial.println(valor);
delay(10);
}
}
|
frecuencia máxima unos 160 Hz |
 |
- Ejemplos de:
https://github.com/G6EJD/ESP32-DAC-Examples
|
void setup() {
Serial.begin(115200);
}
void loop() { // Generate a Sine wave
for (int deg = 0; deg < 360; deg = deg + 8){
dacWrite(25, int(128 + 80 * (sin(deg*PI/180)+sin(3*deg*PI/180)/3+sin(5*deg*PI/180)/5+sin(7*deg*PI/180)/7+sin(9*deg*PI/180)/9+sin(11*deg*PI/180)/11))); // Square
}
}
// ESP32 has two 8-bit DAC (digital to analog converter) channels, connected to GPIO25 (Channel 1) and GPIO26 (Channel 2)
// Square wave = amplitude . sin(x) + sin(3.x) / 3 + sin (5.x) / 5 + sin (7.x) / 7 + sin (9.x) / 9 + sin (11.x) / 11 Odd harmonics
// Triangle wave = amplitude . sin(x) + 1/3^2.sin(3.x) + 1/5^2.sin(5.x) + 1/7^2.sin (7.x) + 1/9^2.sin(9.x) + 1/11^2.sin (11.x) Odd harmonics
// dacWrite(25, int(128 + 80 * (sin(deg*PI/180)))); // GPIO Pin mode (OUTPUT) is set by the dacWrite function
// dacWrite(25, int(128 + 80 * (sin(deg*PI/180)+sin(3*deg*PI/180)/3+sin(5*deg*PI/180)/5+sin(7*deg*PI/180)/7+sin(9*deg*PI/180)/9+sin(11*deg*PI/180)/11))); // Square
// dacWrite(25, int(128 + 80 * (sin(deg*PI/180)+1/pow(3,2)*sin(3*deg*PI/180)+1/pow(5,2)*sin(5*deg*PI/180)+1/pow(7,2)*sin(7*deg*PI/180)+1/pow(9,2)*sin(9*deg*PI/180))));
|
- Funcionamiento de las dos salidas DAC.
|
// Juan Antonio Villalpando
// KIO4.COM
int IO2 = 2;
int IO4 = 4;
float valor2 = 0;
float valor4 = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
for (int deg = 0; deg < 360; deg = deg + 1){
dacWrite(25, int(128 + 127 * (sin(deg*PI/180))));
dacWrite(26, int(128 + 80 * (sin(deg*PI/180))));
valor2 = analogRead(IO2);
valor4 = analogRead(IO4);
Serial.println(valor2);
Serial.println(valor4);
delay(10);
}
}
|
________________________________
- Osciloscopio.
- Cargamos este código, observa que está muy simplificado.
|
// Juan Antonio Villalpando
// KIO4.COM
void setup() {
}
void loop() {
for (int deg = 0; deg < 360; deg = deg + 1){
dacWrite(25, int(128 + 127 * (sin(deg*PI/180))));
}
}
|
- Conectamos a un osciloscopio digital la señal del IO25 y Gnd. Obtendremos una señal sinusoidal de unos 3.12 Vpp y una frecuencia de unos 152 Hz.
- La señal ha sido construida digitalmente, por lo cual tiene mucho ruido, se observa sus trazos escalonados.
 |

- Así se vería en un osciloscopio analógico, cada división vertical es de 0,5V y la base de tiempo 2 ms. |
- Propuesta.
- Realiza un Lissajous con un osciloscopio.
https://www.youtube.com/watch?v=8L2qjdaHwug
Convertidor DAC.
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html
_______________________________
|