Control PID para motor DC – Programación

En la publicación Control PID para motor DC – Lectura y Potencia comentaba sobre la primera parte de este proyecto y sobre sus interfaces de lectura y potencia, ahora esta publicación estará dedicada a la programación del controlador en LabVIEW y la comunicación USB entre el PIC y el ordenador.

Para comenzar explicare la estructura del programa en LabVIEW, el programa esta compuesto por un While Loop que permite ejecutar iteraciones continuamente, al inicio del programa se establece la configuración del COM virtual con el que se va a comunicar el programa, es decir datos como el nombre del puerto, velocidad de transmisión y numero de bits en la transmisión. Dentro del While Loop se establece la apertura del puerto y el tamaño del buffer de recepción, luego se hace la conversión del dato de tipo “string” como lo envía el PIC a tipo “int” para ser usado en el PID. En la programación se usaron subVIs para cada uno de los controladores separados y luego sumar su resultado.

El primer controlador es el Proporcional, según la teoría este corresponde unicamente a el error multiplicado por una constante, es decir wk = Kp*Ek. El error es calculado en el programa principal restando el valor muestreado de el valor del set point.

El controlador Integral es mas complejo que el Proporcional, en este se tienen en cuenta el tiempo de muestreo, una constante o tiempo de integración, nuevamente el error, la constante de proporcionalidad y la salida del controlador en la iteración anterior (esta se establece en el programa principal). De esta forma se cumple la formula pk = ((kp*t/ti)*ek)+pk-1 de donde pk es la salida del controlador, kp es la constante de proporcionalidad, t es el tiempo de muestreo, ti es el tiempo de integración, ek es el error y pk-1 es el valor del controlador en ciclo inmediatamente anterior.

El controlador Derivativo tiene la siguiente ecuación qk = (td*kp/t)*(ek-ek-1), en esta ecuación de tiene a qk que es la salida del controlador, td que corresponde al tiempo de derivación, kp es la constante de proporcionalidad, t el periodo de muestreo, ek el error y ek-1 el valor del error en el ciclo inmediatamente anterior.

Luego de los valores de los controladores son sumados y enviados al PIC donde este valor se vera reflejado en el ciclo de trabajo de el PWM que controla el motor. Para evitar posibles ambiguedades en el ciclo de trabajo del PWM se hace una restricción en la que si el valor del PID es superior a 255 el PWM sera de 255 y si es inferior a 0 el PWM sera de 0.

En el front panel se pueden visualizar y modificar el set point y cada una de las constantes (kp,ti y td), ademas una gráfica de la velocidad y una de la salida del PID. El PIC hace la lectura de la velocidad del motor, establece la comunicación USB, recibe el valor del PID y varia el ciclo útil del PWM.

Para descargar: PID Motor.rar

Sí tienes alguna inquietud no dudes en comentar.

17 comments

  1. Trate de implementarlo siguiendo al pie de la letra tus pasos y circuitos, pero me arroja un error Labview al echarlo a correr, porque corre una sola vez y no trabaja el “bucle while”, lo que no me deja controlar la velocidad. Alguna sugerencia???
    Gracias

  2. Saludos.
    Tu proyecto es muy interesante, pero tengo problemas en reconocimiento del usb. El cable usb que conecto del pic a la pc no me reconoce, me dice dispositivo desconocido y me pide instalar el hardware. Quisiera saber como hiciste para que te reconociera el usb al pc, si instalaste algo adicional para que lo haga. Estoy utilizando 2 PC un PC con windows 7 32bits y el otro windows 7 64bits, intente el windows XP tampoco me funciona me da el mismo error. Todos los drivers de VISA los tengo instalados. Espero me puedas ayudar con alguna explicación GRACIAS

    1. Hola Ruben, la instrucción setup_timer_1(T1_EXTERNAL| T1_DIV_BY_1) configura el timer 1 como contador de pulsos, por configuración del hardware del PIC este timer está conectado al pin 11, de modo que no es necesario decirle que lea el pin, el lo lee implícitamente.
      Un saludo

  3. que tal! oye si quisiera remplazar el encoder por un potenciometro y cambiar la comunicacion por rs232, que tendria q cambiar en el codigo???Tengo pensado hacer el posicionamiento de un motor de cd.
    Saludos!

    1. Hola janiskno, tendrías que modificar gran parte del código, comenzando por el hecho de que vas a controlar una variable totalmente distinta y que no la puedes leer por pulsos (como se hace en este proyecto) si no midiendo voltajes en la resistencia. Por otra parte la comunicación que uso yo es USB en modo CDC, muy diferente a la serial.
      Un saludo

  4. Hola amigo muy bueno tu proyecto he de antemano gracias, ando algo verde en cuanto al labview y mi duda es si las lecturas del pic las detecta al conectarlo o si hay que ir a las propiedades y seleccionarlo o algo asi ya seria lo unico que me faltaria para terminarlo, de nuevo gracias y ojala me contestes

    1. Hola Erick, el procedimiento sería: Primero conectar el PIC al ordenador, luego seleccionar el COMx del PIC desde LabView, finalmente debes poner a correr el programa de LabView.
      Un saludo

  5. Hola que tal muy buen aporte tengo un motor con encoder digital y quisiera utilizar una DAQ, en este caso en que cambia la programacion en labview y del pic ya que el motor es de encoder digital. gracias.

    1. Hola Yuliana, si vas a usar una DAQ no tienes que usar el pic, la programación en LabView sería totalmente diferente ya que tiene estructuras especiales para leer los datos de la DAQ.
      Un saludo

Deja un comentario