Autor Tema: control PI calefactor  (Leído 3832 veces)

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

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
control PI calefactor
« en: 21 de Julio de 2005, 18:08:00 »
Hola amigos, estoy haciendo mi proyecto de fin de carrera de domotica y control via internet, algo en lo que me estoy confundiendo es como hacer control proporcional con un 16f877 usando un triac para calefaccion y ventilacion, se como es el control en el papel, pero no tengo ni idea de como aplicarlo al pic, si me pudieran ayudar o darme alguna info, creo que puedo usar PWM, pero no se como aplicar las constantes proporcionales ni nada, bueno, espero que me ayuden en esto y me den consejos de como hacer el control por internet, ya tengo gran parte avanzado, y lo quiero colgar en esta web cuando acabe para los que lo quieran usar, bueno me despido amigos

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
RE: control PI calefactor
« Respuesta #1 en: 25 de Julio de 2005, 11:20:00 »
Hola.

Te "pego" el algoritmo para el PID que estoy usando yo para el control de velocidad de un motor.
Tienes que tener en cuenta que:
1.- referencia -> indica la consigna que quieres que alcance
2.- real -> lo que midas del sensor

Codigo:

int16   duty_PWM2=400;      // Variable para modificar el "duty cycle" del PWM2.
float   Kp_vel,Ki_vel,Kd_vel;   // Constantes del controlador PID.
float   referencia=0,real;      // Consigna de referencia y real del eje a controlar.
float   error=0,serror=0,errant=0,outctrl;   // Variables para algoritmo PID.



El tiempo de muestreo lo tendras que programar usando un timer, ojo que no puedes usar el timer2 que lo usa el modulo PWM.

Yo fijo el timer a 10ms y utilizo una variable para hacer periodos de muestreo multiplos de 10ms. Para un calefactor necesitaras tiempos mayores.

Codigo:

   errant=error;      // Guardamos error de iteracion anterior, usado en parte D.
   error=referencia-real;   // Error actual.
   serror+=error;      // Error acumulativo.
   if(serror>MAX_serror)   serror=MAX_serror;   // Al ser acumulativo puede desbordarse, asi le imponemos
   if(serror<-MAX_serror)   serror=-MAX_serror;   // un maximo.

   outctrl=Kp_vel*error+Ki_vel*serror+Kd_vel*(error-errant);   // Señal de control, duty cycle para PWM.

   if(outctrl>MAX_duty)   outctrl=MAX_duty;   // Debe tener como maximo 100% duty cycle, calculado sobre base
   if(outctrl<-MAX_duty)   outctrl=-MAX_duty;   // de tiempos del modulo PWM.
   duty_PWM2=abs(outctrl);

   set_pwm2_duty(duty_PWM2);   // Cargamos en modulo PWM el valor absoluto de la señal de control obtenida.



Espero te sirva.

Salu2

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: control PI calefactor
« Respuesta #2 en: 26 de Julio de 2005, 03:16:00 »
Podrias poner el programa entero?

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
RE: control PI calefactor
« Respuesta #3 en: 26 de Julio de 2005, 05:29:00 »
Wenas.

No puedo poner el programa entero, que son unas 900 lineas y mazo de funciones. Pero dime que te interesa saber y te posteo esa parte y te explico como lo hago.

El programa realiza un control de velocidad para un motor DC, recibiendo ordenes desde un PC el cual grafica los resultados. Los parametros del PID se leen inicialmente de la EEPROM del PIC, y tb se pueden cambiar desde el PC. Como encoder uso un raton de PC, comunicacion PIC-Raton mediante protocolo PS2.

Te pongo la rutina de atencion para el timer1:

Codigo:


// -----------------------------------------------------------------------------
// Rutina de atencion a la interrupcion por desbordamiento del timer1.
// El timer1 tendrá un valor fijo de tiempo (10ms), y en funcion del valor de Ts tendremos
// el tiempo de muestreo (multiplo de 10ms).
// Ts inicial = 4 -> Tiempo de muestreo = 40ms
// -----------------------------------------------------------------------------
#int_TIMER1         // Indica que la siguiente funcion es de atencion a interrupcion del timer1.
void TIMER1_PID() {
  set_timer1(0xD8EF);      // Contador ascendente, interrupcion al pasar de FFFF a 0000.
            // La interrupcion saltara cada 15ms (FFFF-C567).
            //             10ms (FFFF-D8EF).
            //            45ms (FFFF-5037).
            //            60ms (FFFF-159F).

  // Cuando contador valga Ts, se ejecutara el control
  contador_Ts++;

/////////////////////////////////////
  if(contador_Ts>=Ts){
    contador_Ts=0;
  // Pedimos datos al raton. Almacenados en byte1, byte2 y byte3.
    lee_raton();
  // Indicamos nuevo dato listo para enviar a HOST.
  nueva_lectura=true;

  // Indica fallo en lectura del raton.
  if(err_leyend_raton)   output_high(PIN_A5);         
   
    PID_ejeX();         // LLamada a subrrutina de control PID.
  }
//////////////////////////////////////

#asm
  bcf   PIR1,0         // Incluido por problemas del copilador empleado, falla si no se incluyen
  retfie            // reentrando en la interrupcion (problemas al leer raton).
#endasm
}




PID_ejeX() es la subrrutina que puse en el primer mensaje, la que realiza el control PID.

Espero opiniones.

>Salu2<

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: control PI calefactor
« Respuesta #4 en: 26 de Julio de 2005, 11:11:00 »
Pués la idea era la de tener un ejemplo sencillo y entendible con un control completo PID.

Hace tiempo ayudé a un compañero del FORO con un control Proporcional, creo que era para controlar la velocidad de un motor, no estoy seguro. Si a alguién le interesa, el programa, el cual funcionó al final perfectamente, está en este subforo de C.

Si tuvieras otro ejercicio sobre control completo PID, sin tantas líneas, sería interesante que lo colgaras.

Un saludo

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: control PI calefactor
« Respuesta #5 en: 26 de Julio de 2005, 12:11:00 »
Pocher, porfa, cual es ese programa, he estado navegando en el foro, pero creo que no soy buen buscador, y muchachos gracias por la ayuda y la voy a empezar proba.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: control PI calefactor
« Respuesta #6 en: 26 de Julio de 2005, 12:50:00 »
Después de mucho buscar, por fín lo he encontrado:

http://miarroba.com/foros/ver.php?foroid=46840&temaid=2247231

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: control PI calefactor
« Respuesta #7 en: 26 de Julio de 2005, 15:37:00 »
Gracias pocher, ahora como crees que lo puedo aplicar para controlar un calefactor, o mas bien una secadora de pelo, estoy pensando que cada vez que haya un cruce por cero, haya una interrupcion en RB0, pero a la vez quiero seguir controlando otros dispositivos sin que me quite demasiado tiempo

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
RE: control PI calefactor
« Respuesta #8 en: 27 de Julio de 2005, 09:48:00 »
Wenas.

Pues siento deciros que no tengo otro ejemplo de control PID mas sencillo. El que he posteado forma parte de mi proyecto final de carrera y tengo todo el programa mezclado tanto que me cuesta encontrar las cosas.

Aun así creo que con el algoritmo del PID y obteniendo bien los pulsos de un encoder, tal y como lo puse antes sirve para controlar cualquier motor.
Si se trata de controlar otra cosa (temperatura, presion, posicion, etc...) el algoritmo del PID es el mismo, solo hace falta ajustar la lectura del sensor específico y determinar los parametros/tiempo de muestreo.

Salu2

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: control PI calefactor
« Respuesta #9 en: 21 de Febrero de 2008, 14:43:24 »
Hola I3iT, se que hace mucho que publicaste este algoritmo PID pero es que acabo de verlo y me ayudó mucho. solo quería pedirte si puedes aclararme una duda, la variable "serror" la pones a cero en algun momento o siempre se suma algebraicamente con el nuevo error.
Muchas gracias.
Sergio
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
Re: control PI calefactor
« Respuesta #10 en: 22 de Febrero de 2008, 06:36:55 »
Hola IOIO, si que hace tiempo de este post......

Pues creo recordar que en un principio no se reseteaba a 0 en ningun momento, pero esto creaba problemas al cambiar la referencia si el error acumulado es elevado.
En el código final hacia "serror=0" al recibir una nueva referencia.

Hace tanto tiempo que tendría que buscar el código entre el CAOS de archivos de mi PC.....


Un saludo.

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: control PI calefactor
« Respuesta #11 en: 23 de Febrero de 2008, 18:23:16 »
Muchas gracias I3iT, justamente a eso me refería, me parecía que sería bueno resetearla cada vez que se cambiara el valor de referencia.

Saludos
Sergio
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio