Kp, Ki, Kd para software de control PID

Estoy diseñando un software de control PID. La lógica es casi definitiva, pero me pregunto cómo decido el valor de k pag , k i y k d . 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 k i ¿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;
        }
    }
¿Has intentado buscar "sintonización PID"? Me parece recordar que hay algunos métodos de ajuste estándar que lo acercarán, sin embargo, el ajuste fino es tanto un arte como una ciencia.
Existe el método definitivo de Zeigler-Nichols, primero implemente la porción Kp, establezca Kp en 0, aumente Kp hasta que el comportamiento de salida se vuelva cíclico (es más fácil decirlo que hacerlo), la periodicidad de este comportamiento cíclico, así como la amplitud, servirán como una heurística para ajustar el controlador PI, PD o PID.

Respuestas (3)

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 iTermvalor 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!

Bienvenido a EE:SE. ¡Ojalá mi primera respuesta hubiera sido tan buena como esta!

¿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? y ( norte ) = y ( norte 1 ) + k × [ t ( norte ) t ( norte 1 ) ] × X ( norte 1 )

revEuler? y ( norte ) = y ( norte 1 ) + k × [ t ( norte ) t ( norte 1 ) ] × X ( norte )

¿Trampa? y ( norte ) = y ( norte 1 ) + k × [ t ( norte ) t ( norte 1 ) ] × [ X ( norte ) + X ( norte 1 ) ] / 2

Es bueno que esté considerando poner límites de suma en el PID. ¿Puedo recomendarle que establezca un límite individual en el k i plazo y un límite total de suma. Esto mitigará las preocupaciones de liquidación con el integrador.

límite X X ( k pag + límite X X k i + k d )

¿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 k i acumulando más alto (ver la declaración anterior sobre anti-windup)

Cómo elegir el numérico k pag , k i , k d ? Bienvenido a la teoría del control. Hay diferentes maneras. Generalmente se requiere un modelo de sistema y criterios de estabilidad.

No lo mencioné aquí, pero también proporcioné el límite mínimo y máximo para mi salida PID. Como final, 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.
para la simulación ¿puedo tener una herramienta genérica o algo así?
puedes usar python Tengo un controlador de dominio z simple que funciona en python.
¿Algún buen simulador de Excel disponible? Estoy tratando de construir uno para mi aplicación, una referencia puede ser bastante útil.
Hay un número volando (google "PID excel"). Tengo uno que usé porque a veces es más fácil darle a alguien una hoja de Excel (que pueden abrir) en lugar de un modelo de matlab o un script py
No tengo Matlab conmigo, así que estoy buscando un simulador de Excel.

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