Autor Tema: PID en 16f876A  (Leído 1947 veces)

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

Desconectado pirraca

  • PIC10
  • *
  • Mensajes: 11
PID en 16f876A
« en: 06 de Mayo de 2009, 08:53:29 »
Me dispongo a hacer un control PID de un motor DC equipado con encoder.

la lectura del encoder la realizo a una frecuencia y a esa misma frecuencia realizo tambien la ejecucion del codigo del PID.

Ahora mismo estoy utilizando la siguiente rutina:

Código: [Seleccionar]
signed int16 UpdatePID(SPid *pid, signed int16 error, signed int16 position)
{
   signed int16 pTerm,
                dTerm,
                iTerm;

   // calculate the proportional term
   pTerm =  pid->pGain * error;   // calculate the proportional term

   // calculate the integral state with appropriate limiting
   pid->iState += error;

   if ( pid->iState > pid->iMax){
       pid->iState = pid->iMax;
   }

   else if ( pid->iState <  pid->iMin){
      pid->iState = pid->iMin;
   }

   iTerm = pid->iGain * pid->iState;  // calculate the integral term

   dTerm = pid->dGain * ( pid->dState - position);

   pid->dState = position;

   return (pTerm + dTerm + iTerm);
}
 

pero no me aclaro del todo...

he logrado ver por el osciloscopio la salida del encoder, y lo he transladado a excel, con lo que he conseguido ver una respuesta al escalon de tension de entrada.

El número de flancos que el motor debe conseguir a velocidad maxima es de de 40.

¿Como puedo hacer un afinado del PID?

muchas gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: PID en 16f876A
« Respuesta #1 en: 06 de Mayo de 2009, 12:34:50 »
Hola

Se usa normalmente el metodo de Ziegler-Nichols. Otra opcion es realizar el modelado matematico de tu sistema y verificar su estabilidad en lazo abierto -esto conlleva mas trabajo teorico-

Saludos
El papel lo aguanta todo

Desconectado pirraca

  • PIC10
  • *
  • Mensajes: 11
Re: PID en 16f876A
« Respuesta #2 en: 07 de Mayo de 2009, 07:54:34 »
Hola MLO

he intentado hacer los pasos necesarios para el proceso de ziegler-nichols y adecuando mi codigo a él no se me mueven las ruedas.

la grafica en la cual me he basado es de numero de flancos de encoder en un determinado tiempo, y dudo que con ella pueda hacer algo decente...... no se como medir la tension de salida del motor que veo en los modelos de ziegler-nichols...

¿ideas?

Muchas gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: PID en 16f876A
« Respuesta #3 en: 09 de Mayo de 2009, 12:31:00 »
Hola.

El metodo de Ziegler-Nichols es para sintonizar el PID.

Para aplicar un controlador a un sistema, debes conocer el modelo fisico del sistema, esto es: hallar una funcion de transferencia, lo que es una ecuacion diferencial descriptiva del sistema. Hay varios metodos para hallarlas: 1. Usar metodos fisicomatematicos para hallar dicha ecuacion-teroicamente-. 2. Hallarla por metodos experimentales -midiendo entrada y salida y graficando su funcion-.

Una vez tengas el modelo del sistema debes definir el actuador, su modelo es muy importante tambien, en el brazo de realimentacion.

Tu sabes que vas a controlar velocidad de giro, esa seria la variable, pero el actuador debe modificar el potencial que le llega al motor para controlar esa velocidad. Tenemos entonces que necesitas una funcion que te relacione la tension del motor con la velocidad de giro del mismo. Normalmente se usa PWM para controlar esta tension.

Saludos



El papel lo aguanta todo

Desconectado adrianrs86

  • PIC10
  • *
  • Mensajes: 24
Re: PID en 16f876A
« Respuesta #4 en: 10 de Mayo de 2009, 23:36:24 »
Mira no es complicado, como han dicho anteriormente lo que necesitas es una ecuacion que describa tu sistema en este caso el motor, para obtener dicha ecuacion lo mas adecuado es que hicieras una identificacion del sistema, es decir, que con una tarjeta de adquisicion de datos vas a registrar la salida que da tu motor ante diferentes entradas, de esta manera vas a obtener una base de datos con la cual puedes utilizar varios metodos (curva de reaccion, minimos cuadrados, minimos cuadrados recursivos, etc. Te aconsejo que uses Matlab el cual te brinda muchas posibilidades) para obtener la funcion de transferencia del sistema y ya con esta diseñas el controlador por cualquier metodo