// https://wokwi.com/projects/380733829667456001
// el modulo DAC no genera tensiones diferentes en el simulador
#define PL 2 // PL -> cambiar por el puesto de laboratorio del estudiante
#define ADC1 34
#define DAC1 25
#define DAC2 26
int D_dac, D_adc;
float voltageADC, tensionDAC;
int Dadc_calibrado;
int n=0;
int valor_filtrado;
hw_timer_t *timer = NULL;
void fintimer()
{
//Lectura del valor de tensión
D_adc = analogRead(ADC1); // leemos el valor de tensión en el pin a través del bloque ADC, guardando este como código digital "D"
//CALIBRADO
Dadc_calibrado = 0.9301*D_adc + 186.44; //Aproximación lineal a valores reales medidos con multímetro en función de los valores devueltos por el ADC del ESP32
//Emisión de la señal --> Compruebo funcionamiento a través de DAC2
tensionDAC = 3,3*Dadc_calibrado/4095; //Vo=q*D+Vref- --> Vo= ((3,3-0)/2^12 -1 )* D + 0
//El valor digital que le entra al DAC, proviene de la salida del ADC, por lo tanto, D a la entrada del DAC va de 0 a 4095
D_dac = 255.0 * ( tensionDAC / 3.3); // Valor D en el DAC --> D = (VeMax - Vref-)/q --> q = (Vref+ - Vref-)/2^8 -1 --> Vref+=3,3 y Vref-=0 (DAC)
//Como el DAC tiene 8 bits, pasa la salida D del ADC de 12 bits (de 0 a 4095) a su valor correspondiente con 8 bits (de 0 a 255), por medio de la tensión asociada a ese código digital (es la misma para ambos)
dacWrite(DAC2, D_dac); //Escibe en el DAC el valor "D" en formato de 8 bits y el DAC pasa este valor a tensión
}
void setup()
{
Serial.begin(115200);
delay(100);
Serial.printf("\n\n Ejercicio Filtrado \n");
//set the resolution to 12 bits (0-4096)
analogReadResolution(12);
// voltage full-range 150mV - 3100 mV
analogSetAttenuation(ADC_11db); // ADC_0db, ADC_2_5db, ADC_6db, ADC_11db
// DAC channel 1 is attached to GPIO25, DAC channel 2 is attached to GPIO26
// acepta valores de 0 a 255 -> Vout = 0 a 3.3v
Serial.begin(115200);
//TIMER
timer = timerBegin(10e5); //Configuramos la frecuencia a 1 millón
timerAttachInterrupt(timer, &fintimer);
timerAlarm(timer,1000, true, 0); //Cada 1000 tics se lleva a cabo una muestra (función alarma)
}
//Al ADC le entra tensión
//Del DAC sale tensión
void loop()
{
D_adc = analogRead(ADC1); // leemos el valor de tensión en el pin a través del bloque ADC, guardando este como código digital "D"
voltageADC = D_adc / 4095.0 * 3.3; // ( (3.3 / 4095.0)* adcVal ) conversion de tension ideal Vo=q*D+Vref-(Vref-=0 y q=(Vref+ - Vref-)/2^n - 1)
Serial.printf("Voltage entrada: %1.3f V => valor ADC: %d, \n", voltageADC, D_adc);
Serial.print("valor ADC calibrado: ");
Serial.println(Dadc_calibrado);
delay(3000);
}