Control de Motores de baja Resolución con PIC

Este proyecto sólo es posible para encoders de muy baja resolución.

Menos de 20 PPR.

Si has llegado aquí directamente te recomiendo que visites la página anterior a ésta, te enlazará a dos tipos de control PID, ya sea para PIC o Arduino. El circuito es mucho más sencillo y aunque el algoritmo es un poco más complejo, en principio lo único que tendrías que cambiar es el tiempo de muestreo a 1000 milisegundos. Además te permitirá controlar el motor desde el puerto serie.

En este apartado controlaremos la posición de una reductora con motor DC mediante un encoder incremental y un microcontrolador (PIC). Se puede hacer de dos maneras como mínimo y expongo las que mejor resultado me han dado. Una de ellas es por bucle infinito y la otra es por interrupción externa (RB0/Int). Ambas funcionan correcta y eficientemente pero según como orientes tu proyecto puede interesarte hacerlo por un método o el otro. En ambos casos, la entrada de datos (posición) siempre es en modo paralelo con resolución de 16 bits.

El algoritmo que uso para controlar el motor es por comparación numérica (es el método más sencillo y simple que existe); esto significa que compara la posición actual del motor con la posición a la que queremos llevarlo.

Sería interesante que hayas experimentado los encoders incrementales que propongo en el apartado Encoder por Software, porque se profundiza en el funcionamiento de conteo de pulsos, visualizándolo a través de LEDs, LCD y USB según el caso. Y después venir aquí para concentrarte en el control del motor y otros detalles que verás más adelante.

A continuación muestro un vídeo con el circuito montado y funcionando. Los esquemas, programas y explicaciones lo obtendrás haciendo clic en los enlaces que están al final de esta página.

Tiene un encoder que va directo al eje del motor (no confundir con el eje principal de la reductora). He probado con resoluciones de 2 a 12 pulsos por revolución del motor. El conjunto es un motor con reductora (60/1) controlado con el PIC 16F876A.

El control de posición lo hago a mano. Inicialmente todos los bits están a cero. Cuando suelto uno de los cables estoy poniendo a 1 uno de los 16 bits correspondientes; y cuando vuelvo a 'clavarlo' en la protoboard, ese bit vuelve a 0. Maneja de 0 hasta 65535 posiciones posibles con total exactitud, esto se traduce en número de vueltas y fracciones de ésta. Para que pueda funcionar perfecto se necesita que la entrada de datos sea en modo paralela como aquí muestro, porque si utilizásemos la comunicación RS232 crearía tiempos de latencia y haría fallar el conteo. Es necesario utilizar un microcontrolador (PIC) para cada motor que quieras utilizar.

En este proyecto lo complicado es tratar de poner o construir un encoder incremental directo al eje del motor. Para ver una imagen de cómo hice esta parte puedes hacer clic aquí, es de dos pulsos por revolución.

En estos dos enlaces uso el método de comparación numérica y sólo es factible para encoder de baja resolución.

Control de un motor DC con el PIC 16F876A, 16 bits de resolución, método Bucle Infinito.

Control de un motor DC con el PIC 16F876A, 16 bits de resolución, método Interrupción Externa.