#include <PID_v1.h>
// Definir pines
const int potPin = A0; // Pin analógico para el potenciómetro
const int sensorPin = A1; // Pin analógico para el sensor de retroalimentación
const int salidaPinP = 9; // Salida proporcional (PWM)
const int salidaPinI = 10; // Salida integral (PWM)
const int salidaPinD = 11; // Salida derivativa (PWM)
const int salidaPinTotal = 3; // Salida total (PWM)
// Variables
double setpoint, input, outputP, outputI, outputD;
// Sintonizar estas constantes para tu sistema
double kp = 12; // Constante proporcional
double ki = 0; // Constante integral
double kd = 0; // Constante derivativa
PID myPID(&input, &outputP, &setpoint, kp, ki, kd, DIRECT);
void setup() {
Serial.begin(9600);
pinMode(salidaPinP, OUTPUT);
pinMode(salidaPinI, OUTPUT);
pinMode(salidaPinD, OUTPUT);
pinMode(salidaPinTotal, OUTPUT);
}
lee la referencia del potenciometro y la retroalimentacion la obtengo de un motor generador usado como sensor
void loop() {
setpoint = analogRead(potPin); // Establecer el punto de referencia desde el potenciómetro
input = analogRead(sensorPin); // Obtener la retroalimentación del sensor
myPID.Compute(); // Calcular la salida PID
En las salidas no me da voltajes el arduino son tres salidas de las etapas de proporcionalidad, integral y derivativa, para poder testearlo con osciloscopio
// Salidas individuales (PWM)
analogWrite(salidaPinP, outputP);
analogWrite(salidaPinI, outputI);
analogWrite(salidaPinD, outputD);
// Salida total (suma PWM)
int totalPWM = outputP + outputI + outputD;
analogWrite(salidaPinTotal, totalPWM);
// Imprimir valores para depuración
Serial.print("Setpoint: ");
Serial.print(setpoint);
Serial.print(", Input: ");
Serial.print(input);
Serial.print(", Output P: ");
Serial.print(outputP);
Serial.print(", Output I: ");
Serial.print(outputI);
Serial.print(", Output D: ");
Serial.print(outputD);
Serial.print(", Output Total (PWM): ");
Serial.println(totalPWM);
delay(100);
}