Estoy diseñando un software de control PID. La lógica es casi definitiva, pero me pregunto cómo decido el valor de , y . Además, necesito determinar el valor máximo y mínimo para el elemento Pterm y Dterm. ¿Cómo puedo hacer eso?. Además, estoy tratando de implementar el control inverso. Además, ¿voy por el camino correcto al diseñar el software PID? Además, si el tiempo integral y ¿ambos son lo mismo? El código que escribí hasta ahora se muestra a continuación.
Calculate_Error();
P_Term = Percnt_Error;
P_Term = KP * P_Term;
if(P_Term >= PMAX)
{
P_Term = PMAX;
}
else if(P_Term <= PMIN)
{
P_Term = PMIN;
}
// Integral calculation
if(Integraltime==1) // Take integration at every 1s
{
Integraltime = 0;
Error_Accum = Error_Accum + Percnt_Error; // Error Accumulation over time
if(Error_Accum >= MaxAccumError)
{
Error_Accum = MaxAccumError;
}
if(Error_Accum <= -MinAccumError)
{
Error_Accum = -MinAccumError;
}
I_Term = (Error_Accum)*KI;
if(I_Term >= IMAX)
{
I_Term = IMAX;
}
else if(I_Term <= IMIN)
{
I_Term = IMIN;
}
}
Todo el crédito por esto es del hilo (ahora desafortunadamente muerto) Balancing Robots for Dummies en el foro de Arduino.
El controlador PID es el siguiente:
int
updatePID(int setPoint, int currentPoint)
{
float error;
static float last_error;
static float integrated_error;
float pTerm, iTerm, dTerm;
/* Calculate error and proportional value.*/
error = setPoint - currentPoint;
pTerm = Kp * error;
/* Calculate error and intergral value.*/
integrated_error += error;
iTerm = Ki * constrain(integrated_error, LOWER_LIMIT, UPPER_LIMIT);
/* Calculate deriviative value and reset error.*/
dTerm = Kd * (error - last_error);
last_error = error;
/* Return the PID controlled value.*/
return constrain(i32K*(pTerm + iTerm + dTerm)), LOWER_LIMIT, UPPER_LIMIT);
}
Esta versión de 'control PID de software' implementa el límite en el valor integral (similar a su código) utilizando la función de restricción de la biblioteca Arduino. El beneficio adicional de este código es que le permite elegir qué controlador desea cambiar el valor de retorno. Por ejemplo, un controlador de PD eliminaría del iTerm
valor de retorno.
En cuanto a la sintonía, es similar a lo que dijo Inmigrante Ilegal .
Set Ki, Kp, and Kd to 0.
Tune Kp until oscillation occurs.
Reduce oscillation and overshoot by tuning Kd.
Tune Ki to increase the speed of the system.
Esta es la primera vez que respondo, ¡espero haberlo hecho correctamente y haberte ayudado un poco en el camino!
¿Qué tipo de integrador espera implementar? mirando su código, tiene un acumulador simple, funcionará, pero hay mejores integradores que también facilitan el mapeo al dominio s más fácilmente
fwdEuler?
revEuler?
¿Trampa?
Es bueno que esté considerando poner límites de suma en el PID. ¿Puedo recomendarle que establezca un límite individual en el plazo y un límite total de suma. Esto mitigará las preocupaciones de liquidación con el integrador.
¿Cómo se determina el valor máximo de los límites? Depende de lo que alimentará el PID.
Digamos que es el controlador de un bucle de velocidad. Cuya salida será una demanda actual. Si la corriente máxima que desea controlar es digamos ... 100 amperios, no querrá que el PID de velocidad genere una demanda más alta que eso, igualmente no querrá que el acumulando más alto (ver la declaración anterior sobre anti-windup)
Cómo elegir el numérico , , ? Bienvenido a la teoría del control. Hay diferentes maneras. Generalmente se requiere un modelo de sistema y criterios de estabilidad.
PID = P+I-D.
considerando el valor máximo de todos y cada uno de los componentes, obtuve el PIDmax y el PIDmin. Acerca de kp, KI y kd, en este momento me estoy acercando al método de prueba y error. Pero no estoy seguro de si es una buena práctica o no.Si puede tolerar el exceso, intente leer sobre el método Ziegler-Nichols en wikipedia. Esto es agresivo y a menudo encuentra la mejor velocidad de respuesta dentro de los límites del rendimiento de su actuador. Si necesita una amortiguación crítica (p. ej., máquinas herramienta), necesitará algo más. Mucho más en Métodos de sintonización de bucle
Li Aung Yip
Fraissé