#include <speedsensor.h> // Librería para la lectura de la velocidad
#include <Ticker.h>
#include <user.h>
Ticker blinker; //Usado para programar el periodo de control en tiempo real
// Definir los pines de entrada analógica y otros pines necesarios
const int pinSensorVel = 12; // Pin analógico para la lectura de la velocidad
const int control = 21; // Pin para el control de la velocidad
// Parámetros del controlador PID
const float Kp = 5; // Proporcional
const float Ki = 0.1; // Integral
const float Kd = 0.2; // Derivativo
// Variables para el control PID
volatile float ref = 0; // Velocidad de referencia del usuario
volatile float currentSpeed = 0; // Velocidad actual
//Funcion que realiza la lectura del sensor de temperatura
int leerSensor()
{
currentSpeed = userSpeedRef();
}
//Funcion que implementa el algoritmo de control
void PIDControl()
{
sn = sn + en;
mn = (Kp * en) + (Ki * sn) + (Kd * (en - enOld));
enOld = en;
}
// Funcion que genera la salida y el modo
void actuador()
{
//Si la velocidad es mayor o igual a la referencia
analogWrite(control, (unsigned int)abs(mn));
if (en >= 0) {
digitalWrite(modo, HIGH); //si el error es positivo o cero
}
else {
digitalWrite(modo, LOW); // si el error es negativo
}
}
//Manejadores de interrupción
void onTimerISR() {
leerSensor();
en = ref - currentSpeed;
PIDControl();
actuador();
}
void setup()
{
Serial.begin(9600); // Inicialización del puerto serie
//Se inicializa el Timer
blinker.attach(0.01, onTimerISR);
pinMode(pinSensorVel, INPUT);
pinMode(control, OUTPUT);
pinMode(modo, OUTPUT);
sn = 0;
en = 0;
enOld = 0;
mn = 0;
ledcSetup(0, 1000, 8);
ledcAttachPin(control, 0);
Serial.println("Velocidad de referencia: ");
Serial.write(ref);
}
void loop() {
//incremento
for(int dutycycle = 0; dutycycle <= 255; dutycycle++){
ledcWrite(0, dutycycle);
delay(10);
}
//decremento
for(int dutycycle = 255; dutycycle >= 0; dutycycle--){
ledcWrite(0, dutycycle);
delay(10);
}
// Se envia información por el serial
Serial.print("Referencia de Velocidad: ");
Serial.println(ref);
Serial.print("Velocidad actual: ");
Serial.println(currentSpeed);
Serial.print(" Velocidad - Salida PID: ");
Serial.println((unsigned int)abs(mn));
}Se desea controlar la velocidad de crucero de un vehículo empleando un código Arduino programado sobre un microcontrolador ESP32. La velocidad actual del vehículo se proporciona a través de una señal analógica que proporciona valores entre 0 y 5V, siendo 0V 0km/h y 5V 200km/h. La lectura de esta señal analógica se realiza mediante la llamada float speedRead() que se está implementada en la librería "speedsensor.h" que sería proporcionada. Esta función devuelve la tensión en voltios que se ha leído.
La velocidad de referencia es proporcionada por el usuario, y accesible a través de la función float userSpeedRef() que proporciona la velocidad deseada en km/h. Implementada en la librería "user.h"
Los parámetros del PID: Kp=5, Kd=2, Ki=0.1 para un período de muestreo de 1ms.
La energía que entrega el motor se ajusta mediante una señal PWM conectada a la salida GPIO21 del microcontrolador. Al ser un vehículo de combustión, no se puede controlar el sentido de giro.
Se pide, implementar un controlador PID con los parámetros proporcionados.