Servomotor con PIC
5 (100%) 1 vote

En esta entrada entenderemos como podemos controlar un Servomotor con PIC usando el compilador CCS C Compiler. Para esta entrada usaremos el Servomotor con PIC 16F887, pero puedes usarlo también en un Servomotor con PIC 16F877A, 18F4550 o cualquier otro microcontrolador que tu desees usar. Los códigos aqui son adpatables a cualquier PIC.

Antes que nada, si todavia no has visto todo el curso gratuito de microcontroladores PIC desde cero usando lenguaje C, te invito a que le des un vistazo y te vuelvas un experto: 👉 CURSO DE PIC GRATIS

 

🤔 ¿Que es un Servomotor?

Un servomotor es básicamente un motor con su propio controlador interno, esto quiere decir que su giro va a ser proporcional a un comando de entrada, en lugar de estar girando continuamente como un motor convencional.

Servomotor PIC C

Un servomotor se compone de tres cables que son GND, Power (5v) y Control, tal y como puede apreciarse en la siguiente figura:

servomotor con PIC

Para que el servomotor funcione, deben enviarse una secuencia de pulsos (PWM) por el cable de control, de esa forma el servomotor verifica su posición actual y actúa para ir hacia la posición deseada.

 

Para poder entender bien el concepto del funcionamiento de un servomotor, debemos dejar claro que este no se comporta como un motor cualquiera, como ya lo mencionamos antes, o sea que no va a girar libremente simplemente energizandolo, si no que por el contrario al ser un motor que tiene su propio controlador (PID) interno, el trabaja por referencias, y esta referencia es en Grados, lo que quiere decir que yo debo informarle si deseo que se vaya para 0°, o para 25°, 48°,100°, 180°, etc.

Entonces el cable de Control, es usado especificamente para eso, para informarle al motor a cual ángulo yo deseo que él se vaya.

Pero ¿Como le envío los ángulos al motor por medio de una secuencia de pulsos (PWM)?

🎳 Control de Giro de un Servomotor con PIC

El servomotor procesará la señal de pulso (PWM) y dependiendo del ancho del pulso, él sabrá cual es el angulo que estamos pidiéndole.

 

Generalmente un Servomotor procesa un pulso con un periodo de 20ms y valiendonos del datasheet del servomotor podremos saber cuanto es el ancho de pulso que necesitamos colocarle a la señal pwm para que el servomotor recorra la distancia deseada.

 

Un pulso de 1.5 ms, por ejemplo, va hacer con que el motor se detenga en la posición de 90 grados. Si el pulso es menor  que 1.5 ms, hará que el motor se detenga lo mas cerca posible de los 0° y si el pulso tiene una anchura mayor que 1.5 ms, el eje del servomotor girará lo mas cerca posible a 180 grados, tal y como lo podemos apreciar en la siguiente figura:

Servomotor con PIC
Nota que cada periodo, (cuando el pulso se vuelve positivo) ocurre a cada 20ms.

Teniendo un poco más claro el funcionamiento del servomotor, procederemos a controlarlo a través de nuestro microcontrolador PIC

 

Para este proyecto, vamos a usar el siguiente servomotor:

  1.  el servomotor MG996R de (120 grados, torque de 10Kg) Datasheet
  2. Comprar Servomotor Amazon USA (click)
  3. Comprar Servomotor Amazon España (click)

Servomotor con PIC usando PWM modulo CCP

Como podemos apreciar en los datasheet de los servomotores, estos trabajan a 50Hz de frecuencia. Una de las formas de controlar un servomotor es configurando el PWM del PIC usando el modulo CCP, para usar el control de servomotor con pic 16F887 vamos a tener que configurar el PWM a esa frecuencia.

Oscilador Interno con PIC CCS

Como es una baja frecuencia vamos a tener que configurar el oscilador interno del PIC, para eso simplemente basta con configurar el #FUSE y usar la función de configuración del oscilador interno del PIC CCS

El oscilador interno del PIC 16F887 al igual que el PIC16F877A  o el 18F4550 puede ser configurado con frecuencias desde 8MHz hasta 32KHz, para eso solo basta configurar en la directiva de la función setup_oscillator como:

  • OSC_8MHZ
  • OSC_4MHZ
  • OSC_2MHZ
  • OSC_1MHZ
  • OSC_500KHZ
  • OSC_250KHZ
  • OSC_125KHZ
  • OSC_32KHZ

Para otros microcontroladores PIC, debes ver en el datasheet si soporta estas mismas frecuencias, simplemente abres el datasheet y buscas por el registro “OSCCON”

Configuración del PWM

Vamos a obtener los 50Hz c0n el PWM, para eso vamos a configurar el oscilador interno a 500Khz y hacer los calculos del PWM que fueron explicados detalladamente en la entrada PWM con PIC CCSC.

El periodo (Inverso de la frecuencia) f=50Hz.

T=\dfrac{1}{50}=0.02s
Desbordamiento del TIMER 2 con preescaler de 16 y poscaler de 1:
T_{PWM}=(Timer2+1)*4*(Preescaler)*T_{Osc}*Postcaler
0,02s=(X+1)*4*(16)*\frac{1}{500000}*1
El valor de carga del Timer2 es X=155
El Timer 2 quedaría así:

Ahora solo nos falta determinar el valor de resolución para saber cuanto es lo máximo que podremos variar el ancho de pulso, aplicando la formula de resolución tenemos:

n=\dfrac{log\left (\dfrac{500000}{50*16} \right )}{log(2)}=9.28\ bits

Así, el máximo ancho de pulso lo voy a obtener colocando la variable valor:

valor=2^{9.28}=625

Con esto sabemos que si colocamos 625 en el duty cicle, vamos a tener el PWM completamente en alto. Ahora bién como nosotros solo queremos inyectar máximo 2ms para hacer que el motor vaya a 180° y mínimo 1 ms para que el motor vaya a 0°, nuestro duty cilce haciendo una regla de tres simple sabiendo que 625 equivalen a 20ms, va a estar en el rango aproximado de

30\leq Duty\ Cicle\leq 63

Sin embargo cada Servomotor es fabricado de forma diferente y la configuración interna del controlador puede variar, asi que en la práctica se debe verificar si dichos valores de frecuencia realmente llevan el servomotor de 0°a 180°.

Por ejemplo, en mi caso para conseguir este barrido completo debo aumentar los limites del ancho del PWM en:

20\leq Duty\ Cicle\leq 80

Servomotor PIC C Compiler usando interrupción por TIMER

En este caso podremos controlar un mayor número de servomotores con un pic 16F877A, 18F4550, 16F84A, 16F887 o cualquier otro PIC configurando para que la interrupción por TIMER, salte a cada 20ms, por lo tanto aquí podremos utilizar normalmente nuestro cristal de cuarzo.

Vamos a realizar los calculos para que nuestro Timer 0, Recordemos que ya habíamos visto una entrada con las configuraciones del Timer 0 (Timer 0 con PIC C Compiler).

Sabemos que el servomotor necesita unos pulsos cada 20ms, sin embargo este valor no es totalmente extricto, como en este proyecto vamos a trabajar con un cristal de 4Mhz,  vamos a configurar nuestro Timer 0 para que se desborde aproximadamente cada 16.38ms

Para eso vamos a tomar un preescaler de 64, y sabiendo que el Timer 0 se desborda cuando llega a la carga de 256 pues vamos a conseguir el tiempo que queríamos:

DesbordeT=CargaTimer\cdot preescaler\cdot \dfrac{4}{F.Oscilador}=256\cdot 64\cdot \dfrac{4}{4000000}=0.01638s=16.38ms

Perfecto! con esto el PIC saltará a la interrupción del Timer 0 cada 16.38ms cuando cuente de 0 a 256. ¿Pero como vamos a mandar los pulsos de 1ms y 2ms? Pues hacemos una regla de 3 simple.

Valor mínimo:

x=\dfrac{256\cdot 1ms}{16.38ms }=15.62\approx 16

Valor máximo:

x=\dfrac{256\cdot 2ms}{16.38ms }=31.25\approx 32

Ahora dentro de la rutina de interrupción, modificaremos la carga del Timer 0 y colocaremos en alto o en bajo la salida del PIC donde esté conectado el servomotor.

Por ejemplo, si queremos el servomotor en 180° (2ms) sabemos que:

Servomotor PIC

  1. Pregunto si la salida está en alto o bajo
  2. Si esta en alto, cargo el timer0 con 32 y pongo la salida en bajo, de esa forma al timer0 solo tendra que contar desde 32 hasta 256, es decir 224 para volverse a desbordar.
  3. Si esta en bajo, cargo el timer0 con (255-32) y pongo la salida en alto, de esa forma al timer0 solo tendra que contar desde 223 hasta 256, es decir 32 para volverse a desbordar.

La ventaja de usar el timer 0 es que podremos controlar varios servomotores con nuestro PIC

ServoMotor con PIC usando CCS C – Ejemplo

Vamos a implementar el siguiente circuito con nuestro PIC, donde vamos a controlar 2 servomotores de 180° con 3 pulsadores. Los pulsadores tienen la siguiente función:

  1. Pulsador 1 incrementa los angulos del motor
  2. Pulsador 2 decrementa los angulos del motor
  3. Pulsador 3 selecciona el motor a controlar

El código será implementado de las dos formas:

  1. Controlando los Servomotores con PWM (Oscilador Interno)
  2. Controlando los Servomotores con Timer 0 (Cristal de 4MHz)

Servomotores CCS C

Descargar Código

A continuación te dejo el código para que lo descargues junto con los archivos del Proteus 8. Sabes que para desbloquear el código solo basta con compartir este contenido en tus redes sociales para ayudar a más personas con este tema y permitir que este sitio web siga aportando más contenido de calidad.

Descarga de Archivos

>> Servomotor con PIC C Compiler <<

Servomotor usando PWM CCP con PIC C Compiler

 

Servomotor usando TIMER 0 con PIC C Compiler

Eso es todo amigos, espero les haya gustado, hayan aprendido y nos vemos en una siguiente clase

>> Volver al Curso de PIC

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Servomotor con PIC
Cerrar menú