Autor Tema: PID con el PIC  (Leído 8885 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado angelica-garcia

  • PIC10
  • *
  • Mensajes: 1
PID con el PIC
« en: 27 de Junio de 2005, 10:19:00 »
hola muchachos... será que alguno puede colaborarme con la programacion de mi PIC para hacer un controlador PID generico.
gracias.
cualquier ayuda pueden escribirme a angelica-garcia@hotmail.com

Desconectado kyo_Meros

  • PIC10
  • *
  • Mensajes: 32
RE: PID con el PIC
« Respuesta #1 en: 27 de Junio de 2005, 12:41:00 »
angelica-garcia

Aqui te paso un programa de un PID digital... proviene de los apuntes de un profe... mio... realmente no tengo conocimiento aun de su funcionamiento... ya que es un tema que no he visto...

Pero espero que despues porfa tu puedas explicarmelo sale...

Aunqeue es para un micro no muy nuevo... facilmente podras implementarlo en un 877 o en un 18F...

Atte Oscar Mendieta...
Saludos desde Qro. Mex...

Desconectado kyo_Meros

  • PIC10
  • *
  • Mensajes: 32
RE: PID con el PIC
« Respuesta #2 en: 27 de Junio de 2005, 12:42:00 »
//EJEMPLO 16. CONTROL DIGITAL.
//Guia del Compilador C. PIC16C74A. 4 de marzo del 2001.

//Realizar  un controlador PID digital.

//Solucion:

//Se utilizara el algoritmo de control PID tipo posicion que maneja el libro
//"Sistemas de Control en Tiempo Discreto", de K. Ogata (capitulo 3, Funcion
//de transferencia de pulsos de un controlador PID digital, en forma de posicion).

//Funcion de transferencia de pulsos, forma de posicion:

//Gd(z) = Kp + Ki/(1-z-1) + Kd(1-z-1)

//donde:
// Kp = K - KT/2Ti = Ganancia proporcional (controlador digital).
// Ki = KT/Ti      = Ganancia integral.
// Kd = KTd/T      = Ganancia derivativa.

// Ti = Tiempo integral (o tiempo de restablecimiento, segundos).
// Td = Tiempo derivativo (o tasa de tiempo, segundos).
//  K = Ganancia proporcional (controlador analogico).
//  T = Periodo de muestreo (segundos).


//Los parametros anteriores, junto con otras se¤ales, seran capturados
//utilizando los canales de entrada analogica de los puertos A y E en el
//siguiente orden:

//Ti    Canal A/D 0 (Tiempo integral, segundos, PA0).
//Td    Canal A/D 1 (Tiempo derivativo, segundos, PA1).
//K     Canal A/D 2 (Constante proporcional, segundos, PA2).
//SP    Canal A/D 3 (Set Point, PA3).
//RETRO Canal A/D 4 (Retroalimentacion, PA5).
//T     Canal A/D 5 (Periodo de muestreo, segundos, PE0).

//Para la salida de control del PID, se utilizara la operacion PWM del modulo CCP1
//(pin PC2). Esta salida nos indica la magnitud en 8 bits de la accion de control.
//El signo de la accion de control se muestra en el pin PC0 (0 positivo, 1 negativo).


//Directivas.

#include <16C74.H>      //Especificando dispositivo a utilizar y constantes generales (pag. 47).

#fuses XT,NOWDT,NOPROTECT,PUT   //Fusibles de configuracion de hardware (pag. 31).

#use delay(clock = 4000000)   //Base de tiempo para retardos (pag. 17).

#use fast_io(C)         //Directiva para el manejo normal de puertos (pag. 13).

#byte portc = 0x07      //Declarando la direccion del puerto C.

#bit PC0 = 0x07.0      //Apuntando como una constante al bit de un puerto (pag. 30).
#bit PC2 = 0x07.2

//Variables globales:

int Ti, Td, K, SP, RETRO, T;   //Variables de 8 bits sin signo.
float m0,m1,e0,e1,e2;      //Variables en punto flotante de 32 bits (pag. 7).
int magnitud;         //Variable de 8 bits sin signo. Magnitud accion de control.
short signo;         //Variable tipo bit. Signo accion de control.

//Funcion de inicializacion.

inicializar() {

   //Inicializando la operacion analogica del puerto A.
     setup_port_a(ALL_ANALOG);      //Especificando operacion analogica de puertos A y E, Vref = Vdd. (pag. 13).
   set_tris_a(0b00111111);      //Configurando puerto A como entrada (pag. 13).
   set_tris_e(0b00000111);      //Configurando puerto E como entrada (pag. 13).
   setup_adc(ADC_CLOCK_INTERNAL);   //Habilitando el convertidor A/D con reloj interno (pag. 16).
   
   //Inicializando el modo PWM del modulo CCP1.
   portc = 0;         //Valor inicial del puerto C.
     set_tris_c(0b11111010);         //Configurando PC0 y PC2 como salidas (pag. 13).
     setup_ccp1(CCP_PWM);      //Configurando el modulo CCP1 en modo PWM (pag. 15).
     setup_timer_2(T2_DIV_BY_4, 167, 0);  //Definiendo el periodo del PWM con la configuracion
                    //del temporizador 2 (para es te caso periodo
                    //pwm = (167)(4)/(4000000/4) = 668 us (pag. 15).
                    //Ver tambien ejemplo 14.   
   set_pwm1_duty(0);           //Valor inicial salida PWM.
                   
   m1 = 0;                 //Valor inicial parametros PID.
   e1 = 0;
   e2 = 0;                
}                    //Fin inicializar.


//Funcion de adquisicion de datos.

adquisicion_datos() {

  set_adc_channel(0);        //Adquisicion canal 0, Ti.
  delay_cycles(3);
  Ti = read_adc();

  set_adc_channel(1);        //Adquisicion canal 1, Td.
  delay_cycles(3);
  Td = read_adc();

  set_adc_channel(2);        //Adquisicion canal 2, K.
  delay_cycles(3);
  K = read_adc();

  set_adc_channel(3);        //Adquisicion canal 3, SP.
  delay_cycles(3);
  SP = read_adc();

  set_adc_channel(4);        //Adquisicion canal 4, RETRO.
  delay_cycles(3);
  RETRO = read_adc();

  set_adc_channel(5);        //Adquisicion canal 5, T, en segundos.
  delay_cycles(3);
  T = read_adc();
         
}              //Fin adquisicion.


//Funcion del controlador PID digital de posicion (algoritmo del libro de Control Discreto de K. Ogata).

control_PID() {

   float Ts, Kp, Ki, Kd, salida_PID;   //Variables locales en punto flotante de 32 bits.
   Ts = T/1000;            //Convirtiendo el periodo T de segundos a milisegundos.
   Kp = K - (K*Ts/2*Ti);      //Calculo de los parametros Kp, Ki y Kd segun algoritmo.
   Ki = K*Ts/Ti;
   Kd = K*Td/Ts;
   m0 = m1+(Kp+Ki+Kd)*e0-(Kp+2*Kd)*e1+Kd*e2;//Calculo de la accion de control m(kT).

   if( m0<0 ) {         //Detectando el signo de la accion de control.
      signo = 1;      //m0 negativo, signo = 1, m0 positivo, signo = 0.
      salida_PID = -m0;       //Calculando valor absoluto de m0.
   }   
   else {
      signo = 0;   
    salida_PID = m0;
   }

   if(salida_PID>255) salida_PID = 255; //Limitando la magnitud de la accion de control a 255.
                     
   magnitud = (int)salida_PID;      //Cambiando de tipo de dato float a
                  //8 bits sin signo.
   e2 = e1;            //Actualizando e(k-2).
   e1 = e0;            //Actualizando e(k-1).
   if(signo == 1) m1 = -salida_PID;   //Actualizando m(k-1).
   else m1 = salida_PID;
            
}               //fin control PID.  


//Funcion principal.

main() {         //Inicio programa principal.

  inicializar();       //Llamada a funcion inicializar.

  while(TRUE) {         //Inicio ciclo continuo.

       adquisicion_datos();   //Llamada a funcion de adquisicion de datos.
       
   e0 = SP - RETRO;      //Calculo del error actual.
       
   control_PID();       //Llamada al controlador PID.
       
   set_pwm1_duty(magnitud);//Actuacion del PWM en funcion de la magnitud
            //de la accion de control calculada.
   PC0 = signo;      //Salida del signo de la accion de control.
       
   delay_ms(T);      //Retardo segun periodo de muestreo.

  }            //Fin while.

}              //Fin main.

Desconectado atlasdelcarinakeel

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 277
RE: PID con el PIC
« Respuesta #3 en: 27 de Junio de 2005, 12:59:00 »
Que tal, en la siguiente direccion encontraras una nota de aplicacion en la que se implementa un controlador PID usando un PIC de la familia 18, ahi encontraras un PDF y el codigo fuente del PIC. Espero que te sirva de ayudaSonrisa Gigante.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en020434
Si tienes un problema y tiene solucion, para que te preocupas? y si no tiene solucion, para que te preocupas?

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: PID con el PIC
« Respuesta #4 en: 28 de Junio de 2005, 08:27:00 »
Llorando perdonen mi absoluta ignorancia, ¿que es un PID?
Si juegas contra el mejor, pierdes como los demás.

Desconectado kyo_Meros

  • PIC10
  • *
  • Mensajes: 32
RE: PID con el PIC
« Respuesta #5 en: 28 de Junio de 2005, 10:13:00 »

radon

PID, son las siglas de Proporcional Integral Derivativo, el cual es un tipo de respuesta que ha de tener algun sistema de control, para mantener un valor deseado...

realmente no se mucho de ello... y te recomiendo buscar en google "PID proporcional integral derivativo"... o igual y alguien por aqui nos pasa un link con un buen tutorial... sobre el tema... ja... Muchas risas Vacilando ...

Atte... Oscar M R
Saludos...

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: PID con el PIC
« Respuesta #6 en: 28 de Junio de 2005, 10:24:00 »
Aja, como comente con Nocturno, la electronica del un Servo por ejemplo no?, o un encoder para una rueda ? loco
Si juegas contra el mejor, pierdes como los demás.

Desconectado kyo_Meros

  • PIC10
  • *
  • Mensajes: 32
RE: PID con el PIC
« Respuesta #7 en: 28 de Junio de 2005, 10:30:00 »

Te refieres a que en un servo... o en un encoder... se utiliza un PID.....???

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: PID con el PIC
« Respuesta #8 en: 28 de Junio de 2005, 10:34:00 »
Quiero decir, que segun lo que entendido, es semejante a un servo, que mantiene su posicion con un control y si la fuerzas a cambiar vuelve ... ya me estoi rallando con los PID jejeje, aver si leo algo
Si juegas contra el mejor, pierdes como los demás.

Desconectado kyo_Meros

  • PIC10
  • *
  • Mensajes: 32
RE: PID con el PIC
« Respuesta #9 en: 28 de Junio de 2005, 11:06:00 »

mmmm.....

Pero observa que ese mantener de posicion... es simplemente porque solo obedece a su señal de control ( X frecuencia ==>> Y posicion)...

es decir, en el servo no hay un elemento primario que muestree la posicion... a lo que voy es que no se podria decir que... la correccion que existe en el servo se deba a la diferencia entre el punto de consigna (o posicion deseada) y la salida del elemento primario (algun dispositivo que determine la posicion del servo)...

en el caso de un encoder... es el encoder (tu elemento primario) el cual te otoga una señal en funcion de la velocidad de giro del motor... si tu quisieras establecer que el motor girara a una X velocidad siempre... podrias usar el encoder y el PID...
supongamos...

El encoder te otorga una señal... esta la puedes convertir a voltaje... entons...
X voltaje corresponde a Y velocidad.... es decir el voltaje de salida de tu elemento primario esta en funcion de la velocidad de tu elemento de control...

Ahora supongamos que tu deseas una determinada velocidad para tu motor... (en otros terminos por lo expuesto arribita) estableces un nivel de voltaje como punto de consigna... a la diferencia entre ese punto de consigna y la señal de tu elemento priario... se le conoce como error... es ahi donde entra el PID... el PID... ha de efectuar una accion correctiva en funcion de dicho error...

es decir llega ese error al PID... el cual lo multipica.... integra.... y deriva.... claro que el PID lo diseñas en base a como quieres tu que responda esa accion correctiva....

creo que hasta aqui te puedo exponer un poco de lo que es un PID....

realmente no soy un experto en ello... solo tengo esa nocion de ellos....

te paso estos link"s.... pa que los cheques... espero que te sean utiles.... hay luego tu me orientas mas.... y comentas algun error que haya cometido (por si lo hay) sale....

ATTE Oscar MR...



Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: PID con el PIC
« Respuesta #11 en: 28 de Junio de 2005, 12:02:00 »
Muchas gracias por los links, los leeré con detenimiento Sonrisa Gigante
Si juegas contra el mejor, pierdes como los demás.