Hola a todos. Les cuento que estoy desarrollando un control para estabilizar a un robot móvil con un compas magnético. La idea es ingresar un ángulo (set_point) y que el robot gire y se estabilice en el ángulo deseado. Bueno el desarrollo de la teoría de control ya lo he realizado y he obtenido buenos resultados. El problema se me presentó cuando desarrolle la ecuación del PID (uk = b0ek + b1ek−1 + b2ek−2 + uk−1, obtenida con el método de las derivadas). La cuestión es que no comprendo cómo procesar esos valores para que el motor reaccione en cuestión. Si le aplico la salida directamente al pwm, el valor de uk rebasará muy rápidamente el valor maximo del DUTY para el pwm. Bueno abajo le muestro la parte del código que resuelve el PID, y lo poco que pude hacer hasta ahora. El robot busca el ángulo, pero nunca se estaciona.
Muchas gracias.
PID:
uk=0;
uk_1=0;
ek=0;
ek_1=0;
ek_1_1=0;
ek_2=0;
ek_1_2=0;
set_point = 90; //Leemos el valor del teclado SET POINT
// c = 0; borramos c para comenzar PID desde 0.
do{
nuevo_pid:
Interpolacion(); // obtengo señal de salidan u_k
//printf ("Angulo= %3.0g\n\r", angulo); //Calculo error e_k
ek = set_point - angulo; //obtengo error actual
if(c == 0){
uk = b_0 * ek;
ek_1 = ek;
uk_1 = uk;
}
if(c == 1){
uk = b_0 * ek + b_1 * ek_1 + uk_1;
ek_2 = ek_1;
uk_1 = uk;
ek_1 = ek;
}
if(c == 2){
uk = b_0 * ek + b_1 * ek_1 + b_2 * ek_2 + uk_1;
ek_2 = ek_1;
ek_1 = ek;
uk_1 = uk;
c=2;
}
if(c <=1){
c= c + 1; //Variable de incremento del set point
}
//printf ("Uk= %3.0g\n\r", uk);
if(uk < 0x00){
izquierda_pid_MC33931();
set_pwm2_duty(uk);
}
else{
derecha_pid_MC33931();
set_pwm1_duty(uk);
}
delay_ms(100);
}while (1);