#include <ESP32TimerInterrupt.h>
//variables de estado
#define kp 4.64
#define kd 2.63
#define ki 1.73
#define conv 3.3/4095
#define convo 255/3.3
float e = 0, Ak = 0, u=0;
const int pote = 35;
float refe = 0;
float y = 0;
// Crear el objeto TimerInterrupt
ESP32Timer ITimer(0);
// Definir la función de interrupción del timer
bool IRAM_ATTR onTimer(void * timerNo) {
noInterrupts();
// Acciones a realizar cuando ocurre la interrupción del timer
PID(refe,0.01,y,e,Ak);
if (u >= 3.3){
u = 3.3;
}else if(u <= 0){
u=0;
}
interrupts();
return true;
}
void PID(float refe,float Ts,float y,float ea,float Aka){
e=refe-y;
Ak=Aka+e*Ts;
float de=(e-ea)/Ts;
u=kp*e+ki*Ak+de*kd;
}
void setup() {
// Inicializar el pin del LED
Serial.begin(115200);
dacWrite(25,3.3*convo);
// Inicializar el timer con la frecuencia deseada (en microsegundos)
ITimer.attachInterruptInterval(10000, onTimer); // Configura la interrupción cada 0.01 segundos
//(diez mil microsegundos)
}
void loop() {
refe = analogRead(pote)*conv;
y = analogRead(33)*conv;
Serial.println(analogRead(32)*conv);
// El código en el loop se seguirá ejecutando mientras el timer realiza su función en segundo plano
}