Diseño de un controlador PI integrado para control de velocidad

0

Apreciaré su orientación en esto. Tengo algunas publicaciones anteriores sobre esto, pero ahora estoy mostrando el código. Estoy diseñando un controlador PI integrado usando una placa Nucleo STM32. En la configuración PWM, un 0 significa 0% de servicio y 800 significa 100% de servicio. El objetivo es regular la velocidad de un motor PMDC. Estoy confundido acerca de la salida PI y la relación del ciclo de trabajo. Esto es lo que tengo:

int error=0;
int target_RPM=0;
int duty_cycle=0;
int Kp = 0;
int integral = 0;
int current_RPM = 0;
int Ki = 0;

Planeo ejecutar el siguiente bucle PID cada 5 ms (aún no estoy seguro) con una interrupción.

//Get current RPM
current_RPM = read_RPM();

//Get the error
error = target_RPM - current_RPM;

//Calculate the integral
integral = integral+error;

//Calculate the Control Variable
duty_cycle = (Kp*error) + (Ki*integral);

//Limit the Control Variable to within 0-800
if(duty_cycle>800){
    duty_cycle = 800;
}
else if (duty_cycle<0){
    duty_cycle = 0;
}
htim1.Instance->CCR1 = duty_cycle;

Todavía no tengo las constantes PI. Primero, quiero asegurarme de que el algoritmo sea correcto . Además, sé que necesito anti-viento para la variable integral, pero aún no estoy seguro de cómo implementarla.

    

1 respuesta

1

Es un controlador PI muy básico con muchos problemas. Debe hacer un tipo incremental también conocido como algoritmo de velocidad (Astrom et al.), Puede usar la fórmula de Simpson para integrador o integración numérica trapezoidal similar. Con el algoritmo de velocidad no está permitido usarlo sin el integrador, pero el anti-windup es bastante fácil de implementar.

Otra forma es construir un controlador Astrom, con componentes separados. Luego puede apagar el integrador, pero necesitará un control de seguimiento integral para el anti-windup, que es exigente para la CPU ya que utiliza la función sqrt ().

Es mejor que lea al menos algunos artículos, que se relacionan con Astrom: Astriom

Debido a la gran cantidad de infracciones en el pasado, no publicaré los algoritmos PID, al menos hasta que no lea algunos conceptos básicos.

T0...sample time
Ti....integration time
uk...output
ek....error = setpoint - process value


//at init or parameter change compute q0, q1 
q0 = KP*(1 + T0/2*Ti);
q1 = −KP*(1 − T0/2Ti);

//every sample time ISR compute output
ek = SP-PV;
uk = q0*ek + q1*ek_1 + uk_1;
if uk > max_value 
    uk = max_value;
elsif uk < min_value 
    uk = min_value;
uk_1 =uk;
ek_1 = ek;
    
respondido por el Marko Buršič

Lea otras preguntas en las etiquetas