ArduinoMega2560_SPI 1.0
Cargando...
Buscando...
Nada coincide
Referencia de la clase PID

Controlador PID con anti-windup, derivative-on-measurement y limitación de cambio de salida (slew-rate limit). Más...

#include <pid.h>

Métodos públicos

 PID (float Kp, float Ki, float Kd, float outputMin, float outputMax, float dt, float outputMaxChanged)
 Constructor del controlador PID.
float calculoPID (float setpoint, float feedback, bool debugMSG=false)
 Calcula la salida del controlador PID.
void setKPID (float Kp, float Ki, float Kd)
 Establece nuevas ganancias PID.
void setOutputLimits (float outputMin, float outputMax)
 Establece los límites de salida del PID.
void setDt (float dt)
 Establece un nuevo tiempo de muestreo.
void resetPID ()
 Reinicia el estado interno del PID.
float statedt (float dt)
 Valida y corrige el tiempo de muestreo.
void printDebugPID (float setpoint, float feedback)
 Imprime información de depuración del PID.

Atributos privados

float Kp
 Ganancia proporcional.
float Ki
 Ganancia integral.
float Kd
 Ganancia derivativa.
float outputMin
 Límite mínimo de salida.
float outputMax
 Límite máximo de salida.
float dt
 Tiempo de muestreo.
float error
 Error actual.
float prevError
 Error previo.
float proportional
 Término proporcional.
float integral
 Acumulador integral.
float pidNoIntegral
 PID sin término integral.
bool saturated
 Indica si el PID está saturado.
float derivative
 Término derivativo.
float output
 Salida final del PID.
float rawOutput
 Salida sin limitación de cambio.
float prevOutput
 Salida previa.
float deltaOutput
 Cambio entre salidas.
float prevFeedback
 Feedback previo para derivative-on-measurement.
float outputMaxChanged
 Máximo cambio permitido por ciclo.

Descripción detallada

Controlador PID con anti-windup, derivative-on-measurement y limitación de cambio de salida (slew-rate limit).

Este controlador está diseñado para sistemas sensibles como motores paso a paso, actuadores lentos o sistemas donde se requiere suavidad y estabilidad.

Definición en la línea 14 del archivo pid.h.

Documentación de constructores y destructores

◆ PID()

PID::PID ( float Kp,
float Ki,
float Kd,
float outputMin,
float outputMax,
float dt,
float outputMaxChanged )

Constructor del controlador PID.

Parámetros
KpGanancia proporcional.
KiGanancia integral.
KdGanancia derivativa.
outputMinLímite mínimo de salida.
outputMaxLímite máximo de salida.
dtTiempo de muestreo en segundos.
outputMaxChangedMáximo cambio permitido por ciclo (slew-rate).

Definición en la línea 20 del archivo pid.cpp.

23{
24 this->Kp = Kp;
25 this->Ki = Ki;
26 this->Kd = Kd;
27
28 this->outputMin = outputMin;
29 this->outputMax = outputMax;
30
31 this->dt = statedt(dt);
33
34 this->error = 0.0f;
35 this->prevError = 0.0f;
36 this->integral = 0.0f;
37 this->derivative = 0.0f;
38 this->output = 0.0f;
39
40 this->prevFeedback = 0.0f;
41 this->prevOutput = 0.0f;
42}
float integral
Acumulador integral.
Definition pid.h:106
float Kd
Ganancia derivativa.
Definition pid.h:93
float prevError
Error previo.
Definition pid.h:104
float error
Error actual.
Definition pid.h:103
float outputMax
Límite máximo de salida.
Definition pid.h:97
float statedt(float dt)
Valida y corrige el tiempo de muestreo.
Definition pid.cpp:173
float output
Salida final del PID.
Definition pid.h:110
float derivative
Término derivativo.
Definition pid.h:109
float Kp
Ganancia proporcional.
Definition pid.h:91
float outputMaxChanged
Máximo cambio permitido por ciclo.
Definition pid.h:117
float outputMin
Límite mínimo de salida.
Definition pid.h:96
float dt
Tiempo de muestreo.
Definition pid.h:100
float prevOutput
Salida previa.
Definition pid.h:112
float prevFeedback
Feedback previo para derivative-on-measurement.
Definition pid.h:114
float Ki
Ganancia integral.
Definition pid.h:92
Gráfico de llamadas de esta función:

Documentación de funciones miembro

◆ calculoPID()

float PID::calculoPID ( float setpoint,
float feedback,
bool debugMSG = false )

Calcula la salida del controlador PID.

Parámetros
setpointValor deseado.
feedbackValor medido.
debugMSGSi es true, imprime información de depuración del PID.
Devuelve
Salida del PID.

Implementa:

  • Proporcional
  • Integral con anti-windup condicional
  • Derivative-on-measurement (evita derivative kick)
  • Slew-rate limit (limitación de cambio por ciclo)
  • Saturación final
Parámetros
setpointValor deseado.
feedbackValor medido.
Devuelve
Salida del controlador PID.

Definición en la línea 58 del archivo pid.cpp.

59{
60 // 1) Error actual
61 this->error = setpoint - feedback;
62
63 // 2) Proporcional
64 this->proportional = this->Kp * this->error;
65
66 // Protección dt
67 if (this->dt <= 0.0f)
68 return this->output;
69
70 // 3) Derivada (derivative-on-measurement)
71 this->derivative = -(feedback - this->prevFeedback) / this->dt;
72
73 // 4) Anti-windup condicional
74 this->pidNoIntegral = this->proportional + this->Kd * this->derivative;
75 this->saturated = (this->pidNoIntegral > this->outputMax) || (this->pidNoIntegral < this->outputMin);
76
77 if (!this->saturated)
78 {
79 this->integral += this->error * this->dt;
80
81 if (this->integral > this->outputMax) this->integral = this->outputMax;
82 if (this->integral < this->outputMin) this->integral = this->outputMin;
83 }
84
85 // 5) PID completo sin limitación de cambio
86 this->rawOutput = this->proportional +
87 (this->Ki * this->integral) +
88 (this->Kd * this->derivative);
89
90 // 6) Slew-rate limit
91 this->deltaOutput = this->rawOutput - this->prevOutput;
92
93 if (this->deltaOutput > this->outputMaxChanged)
94 this->output = this->prevOutput + this->outputMaxChanged;
96 this->output = this->prevOutput - this->outputMaxChanged;
97 else
98 this->output = this->rawOutput;
99
100 // 7) Saturación final
101 if (this->output > this->outputMax) this->output = this->outputMax;
102 if (this->output < this->outputMin) this->output = this->outputMin;
103
104 // 8) Guardar estado
105 this->prevError = this->error;
106 this->prevFeedback = feedback;
107 this->prevOutput = this->output;
108
109
110 // 9) Debug
111 if (debugMSG) printDebugPID(setpoint, feedback);
112
113 return this->output;
114
115};
bool saturated
Indica si el PID está saturado.
Definition pid.h:108
float deltaOutput
Cambio entre salidas.
Definition pid.h:113
void printDebugPID(float setpoint, float feedback)
Imprime información de depuración del PID.
Definition pid.cpp:188
float rawOutput
Salida sin limitación de cambio.
Definition pid.h:111
float proportional
Término proporcional.
Definition pid.h:105
float pidNoIntegral
PID sin término integral.
Definition pid.h:107
Gráfico de llamadas de esta función:
Gráfico de llamadas a esta función:

◆ printDebugPID()

void PID::printDebugPID ( float setpoint,
float feedback )

Imprime información de depuración del PID.

Muestra en consola el estado interno del PID en formato tabla.

Parámetros
setpointValor deseado.
feedbackValor medido.

Definición en la línea 188 del archivo pid.cpp.

189{
190 Serial.println(F("--------------------------------------------------------------------------"));
191 Serial.println(F("| SP | FB | Error | P | I | D | RawOut | Out |"));
192 Serial.println(F("--------------------------------------------------------------------------"));
193
194 Serial.print(F("| "));
195 Serial.print(setpoint, 3);
196 Serial.print(F(" | "));
197
198 Serial.print(feedback, 3);
199 Serial.print(F(" | "));
200
201 Serial.print(this->error, 3);
202 Serial.print(F(" | "));
203
204 Serial.print(this->proportional, 3);
205 Serial.print(F(" | "));
206
207 Serial.print(this->integral, 3);
208 Serial.print(F(" | "));
209
210 Serial.print(this->derivative, 3);
211 Serial.print(F(" | "));
212
213 Serial.print(this->rawOutput, 3);
214 Serial.print(F(" | "));
215
216 Serial.print(this->output, 3);
217 Serial.println(F(" |"));
218
219 Serial.println(F("--------------------------------------------------------------------------"));
220}
Gráfico de llamadas a esta función:

◆ resetPID()

void PID::resetPID ( )

Reinicia el estado interno del PID.

Definición en la línea 156 del archivo pid.cpp.

157{
158 this->error = 0.0f;
159 this->prevError = 0.0f;
160 this->integral = 0.0f;
161 this->derivative = 0.0f;
162 this->output = 0.0f;
163 this->prevFeedback = 0.0f;
164 this->prevOutput = 0.0f;
165}

◆ setDt()

void PID::setDt ( float dt)

Establece un nuevo tiempo de muestreo.

Parámetros
dtNuevo dt.

Definición en la línea 148 del archivo pid.cpp.

149{
150 this->dt = statedt(dt);
151}
Gráfico de llamadas de esta función:

◆ setKPID()

void PID::setKPID ( float Kp,
float Ki,
float Kd )

Establece nuevas ganancias PID.

Parámetros
KpNueva ganancia proporcional.
KiNueva ganancia integral.
KdNueva ganancia derivativa.

Definición en la línea 124 del archivo pid.cpp.

125{
126 this->Kp = Kp;
127 this->Ki = Ki;
128 this->Kd = Kd;
129}

◆ setOutputLimits()

void PID::setOutputLimits ( float outputMin,
float outputMax )

Establece los límites de salida del PID.

Parámetros
outputMinNuevo límite mínimo.
outputMaxNuevo límite máximo.

Definición en la línea 137 del archivo pid.cpp.

138{
139 this->outputMin = outputMin;
140 this->outputMax = outputMax;
141}

◆ statedt()

float PID::statedt ( float dt)

Valida y corrige el tiempo de muestreo.

Valida el tiempo de muestreo.

Parámetros
dtTiempo de muestreo solicitado.
Devuelve
dt válido (mínimo 0.1f).

Definición en la línea 173 del archivo pid.cpp.

174{
175 if (dt <= 0.0f)
176 return 0.1f;
177
178 return dt;
179}
Gráfico de llamadas a esta función:

Documentación de datos miembro

◆ deltaOutput

float PID::deltaOutput
private

Cambio entre salidas.

Definición en la línea 113 del archivo pid.h.

◆ derivative

float PID::derivative
private

Término derivativo.

Definición en la línea 109 del archivo pid.h.

◆ dt

float PID::dt
private

Tiempo de muestreo.

Definición en la línea 100 del archivo pid.h.

◆ error

float PID::error
private

Error actual.

Definición en la línea 103 del archivo pid.h.

◆ integral

float PID::integral
private

Acumulador integral.

Definición en la línea 106 del archivo pid.h.

◆ Kd

float PID::Kd
private

Ganancia derivativa.

Definición en la línea 93 del archivo pid.h.

◆ Ki

float PID::Ki
private

Ganancia integral.

Definición en la línea 92 del archivo pid.h.

◆ Kp

float PID::Kp
private

Ganancia proporcional.

Definición en la línea 91 del archivo pid.h.

◆ output

float PID::output
private

Salida final del PID.

Definición en la línea 110 del archivo pid.h.

◆ outputMax

float PID::outputMax
private

Límite máximo de salida.

Definición en la línea 97 del archivo pid.h.

◆ outputMaxChanged

float PID::outputMaxChanged
private

Máximo cambio permitido por ciclo.

Definición en la línea 117 del archivo pid.h.

◆ outputMin

float PID::outputMin
private

Límite mínimo de salida.

Definición en la línea 96 del archivo pid.h.

◆ pidNoIntegral

float PID::pidNoIntegral
private

PID sin término integral.

Definición en la línea 107 del archivo pid.h.

◆ prevError

float PID::prevError
private

Error previo.

Definición en la línea 104 del archivo pid.h.

◆ prevFeedback

float PID::prevFeedback
private

Feedback previo para derivative-on-measurement.

Definición en la línea 114 del archivo pid.h.

◆ prevOutput

float PID::prevOutput
private

Salida previa.

Definición en la línea 112 del archivo pid.h.

◆ proportional

float PID::proportional
private

Término proporcional.

Definición en la línea 105 del archivo pid.h.

◆ rawOutput

float PID::rawOutput
private

Salida sin limitación de cambio.

Definición en la línea 111 del archivo pid.h.

◆ saturated

bool PID::saturated
private

Indica si el PID está saturado.

Definición en la línea 108 del archivo pid.h.


La documentación de esta clase está generada de los siguientes archivos: