// el modulo DAC no genera tensiones diferentes en el simulador
#define ADC1 34
#define DAC2 26
int D_dac, D_adc;
float voltageADC, tensionDAC;
int alarma2=20000; //Si D_adc<500 se satura a 20000
const int motor_A = 23;
const int motor_B = 22;
const int motor_C = 19;
const int motor_D = 18;
const int motor[6]={18,23,22,19,18,23};
hw_timer_t*timer2 = NULL;
//La toma de datos del potenciómetro varía con la velocidad del motor (RARO)
void fintimer2()
{
for(int i=1;i<5;i++) //Pasos del motor
{
digitalWrite(motor[i-1],LOW);
digitalWrite(motor[i],HIGH); //Hay que poner el LOW, si no, se quedaría todo el rato en HIGH
digitalWrite(motor[i+1],HIGH);
}
//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"
//Cambio el valor de la alarma (cuentas por interrupción) del timer donde se cuentan los pasos del motor para cambiar su velocidad
if(D_adc<=500)
alarma2=20000;
if(D_adc>=3800) //Saturo en valores menores de 500 y mayores de 3800 ya que el ESP32 los coge mal
alarma2=5000;
if(500<D_adc && D_adc<3800)
alarma2 = -4.5455*D_adc + 22273;
//Función para establecer el valor de la alarma en función de los valores del D_adc
timerAlarm(timer2,alarma2, true, 0);
//Emisión de la señal --> Compruebo funcionamiento a través de DAC2
tensionDAC = 3,3*D_adc/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
//Pone el valor de la tensión en el pin asociado al LED por lo que este brilla más o menos
}
void setup()
{
Serial.begin(115200);
//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);
timer2 = timerBegin(10e5); //Configuramos la frecuencia a 1 millón
timerAttachInterrupt(timer2, &fintimer2);
timerAlarm(timer2,alarma2, true, 0);
//La velocidad del motor y la toma de datos del potenciómetro se lleva a cabo con el mismo timer (misma 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.printf("Alarma %d, \n", alarma2);
delay(3000); //No puedo usar función delay, en mi programa asocia impresión en LOOP a timer con alarma cada 5 segundos
}