viernes, 8 de marzo de 2013

Control de un servomotor mediante Rs232

Igual que en el caso del motor de corriente contínua y el motor paso a paso, vamos a realizar una práctica enfocada al control de un servomotor. El software que vamos a emplear en este caso es Mplab X.

Práctica:

El control lo vamos a realizar desde nuestro ordenador mediante Hyperterminal utilizando el puerto Rs232.  En la consola  Hyperterminal se nos mostrará un menú donde seleccionaremos el ángulo de giro o la posición que ordenaremos a nuestro servo. El PIC 18F4550 será el encargado de gobernar el funcionamiento del mismo.
El servo que vamos a utilizar es un Microservo de 9 gramos, que en este caso le podemos alimentar directamente con el Pic, ya que su consumo es muy bajo. Si fuéramos a controlar un servo de mayores características sería necesaria una fuente externa.

Diseño del esquemático en Isis:

Antes de ponernos a programar, vamos a realizar un esquemático en Isis para poder realizar una simulación en Proteus, antes de pasar a la realidad.
Como se puede apreciar el conexionado es muy sencillo. Hemos utilizado la salida de nuestro Pic, RC2(CCP1)  para controlar el ancho de pulso (Pwm). La cual esta conectada al terminal de señal del servomotor.
Los pines RC6 y RC7 les hemos empleado para poder realizar la comunicación Rs232.




La configuración del servo es muy importante para poder ajustar posteriormente el duty, en esta caso hemos establecido una configuración entre 0.3ms y 2.1ms, que corresponde con el servo que vamos a emplear. Siempre  que trabajemos con servos tenemos que analizar el datasheet para saber el rango de operación que tiene el que utilicemos.



Una vez que tenemos el esquemático realizado en Isis para poder realizar la simulación pasaremos al siguiente apartado. Que será la programación del código.

Código fuente

Para la programación  del código fuente, hemos empleado el mismo sistema que en el control del motor de CC. Pero en este caso solo hemos empleado una salida Pwm (RC2).

#include<18f4550.h>
#FUSES INTHS,MCLR,PUT,BROWNOUT
#use delay(INTERNAL=1MHZ) // hemos definido una frecuencia de 1Mhz para obtener un periodo de 16ms.
#use rs232 (BAUD=9600 , XMIT=PIN_C6 , RCV=PIN_C7)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL   ////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////


void main()
{
SET_TRIS_C(0b11111011);
ENABLE_INTERRUPTS(INT_CCP1);     // habilitamos la interrupción por CCP1
SETUP_CCP1(CCP_PWM);                    // configuramos el modulo CCP1 como Pwm
ENABLE_INTERRUPTS(INT_TIMER2); // habilitamos la interrupción por Timer2
SETUP_TIMER_2(T2_DIV_BY_16,255,1); /* hemos empleado un preescaler de 16 y un valor de Pr2 de 255, el postscaler lo hemos dejado a 1, ya que no nos afecta */
set_pwm1_duty(19);
ENABLE_INTERRUPTS(GLOBAL);
printf("Selecccione una opcion: \n\r");
printf("[0] Servo en posicion -90º\n\r");
printf("[1] Servo en posicion -45º\n\r");
printf("[2] Servo en posicion   0º\n\r");
printf("[3] Servo en posicion +45º\n\r");
printf("[4] Servo en posicion +90º\n\r");
printf("[+] Posición 0º aumento grados  \n\r");
printf("[-] Posición 0º reduccion grados \n\r");
do
{
d = getchar(); // almacenamos en la variable d la captura de teclado
switch(d) // Ajuste de grados
{
case '0':  //

setup_timer_2(T2_DIV_BY_16, 255, 1); // -90 GRADOS
set_pwm1_duty(3);
break;
}
case '1':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // -45 GRADOS APROX
set_pwm1_duty(12);
break;
}
case '2':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // 0 GRADOS APROX
set_pwm1_duty(19);
break;
}
case '3':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // +45 GRADOS APROX
set_pwm1_duty(26);
break;
}

case '4':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // +90 GRADOS APROX
set_pwm1_duty(38);
break;
}
case '+':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // Aumento de grados
set_pwm1_duty(duty);
duty++;
break;
}
case '-':  //
{
setup_timer_2(T2_DIV_BY_16, 255, 1); // Reduccion de grados
set_pwm1_duty(duty);
duty--;
break;
}
}
}
while(d=1);
}

Montaje y funcionamiento:

Después de programar, descargaremos el código a nuestro Pic como siempre mediante ICD 3, y pasaremos a realizar el conexionado partiendo del esquemático que diseñamos anteriormente en Isis. En la imagen podemos ver el servo posicionado en 0º.




En la siguiente imagen observamos que el servo se encuentra en +90º.



En la foto que hemos hecho al osciloscopio se puede ver que la duración del periodo efectivamente es de 16ms, con una frecuencia de 61.12Hz.
El duty tiene una duración de 2ms.


Por último lo vemos posicionado en -90º, y se puede apreciar la reducción del duty en la pantalla del osciloscopio.




En el vídeo podemos sacar las conclusiones del resultado final







18 comentarios:

  1. muy buen proyecto una duda el mplab X es igual que el mplab IDE 8,83?

    ResponderEliminar
    Respuestas
    1. Hola Abraham, Pues es el mismo soft lo unico que es una version más moderna obviamente. Tiene sus Pros y sus contras, La ver dad que después de probar MPlabX me quedo con esta versión sin ninguna duda. Una contra que tiene es que si usas el debugger ICD2 no puedes compilar con él. Yo uso el pickit3 y va perfecto.

      Eliminar
  2. marca error en la compilacion, suber el archivo .hex porfavor

    ResponderEliminar
    Respuestas
    1. Cuando pueda subo el .hex a la nube. Que compilador usas?

      Eliminar
    2. Muchas Gracias por responder!! mira ya instale el MPLAB X y el plugin para vincularlo con el CSC Compiler pero sigue arrojando errores la version de mi CSC Compiler es la 4.084. tambien tengo el PICkit 3 para quemar el programa pero la verdad no ´puedo generar el .hex por que me marca errore. la verdad me urge mucho necesito que me apoyes subiendo a la nube el archivo .hex. muchas gracias

      Eliminar
    3. Si no fuera mucho pedir y espero contar contigo quisiera que me pasaras tu programa hecho en c y adjuntaras la simulacion y tambirn ya que estuviera el .hex por favor me servirian de gran utilidad te lo agradecere bastante si gustas me lo mandas a mi correo abraham_ma2209@hotmail.com gracias!! Una ultima pregunta di usaste alguna libreria tambien me la adjuntas de favor espero no causarte molestias!

      Eliminar
  3. Oye me urge el archivo me lo podias mandar por favor. Muchas gracias!

    ResponderEliminar
  4. Hola Abraham, que he estado ocupado trabajando y después de viaje, siento no haberte respondido antes. Esta tarde-noche si me es posible te mando el .hex, xk pensaba que lo tenia en el drive pero no, lo tengo en el disco duro.. ¿que errores te genera Mplabx para no dejarte compilar?
    Un saludo

    ResponderEliminar
  5. muchas gracias y me marca errores en este renglon d = getchar(); // almacenamos en la variable d la captura de teclado si fuera mucha molestia el programa te lo agradeceria

    ResponderEliminar
  6. Buenas. En que versión de proteus se tiene ese componente gráfico del servo, porque en el que tengo no lo encuentro.

    ResponderEliminar
  7. Hola amigo el compilador que uso es pic c que variable le das a duty porque me sale error en esa variable es de tipo int etc = a que.

    Me podrias regalar tu .c gracias andfelrodriguez@uniboyaca.edu.co

    ResponderEliminar
  8. Hola Andrés. Intentare buscar el archivo .c. Duty esta definido como int.
    Un saludo

    ResponderEliminar
  9. Amigo no me sale el punto hex. Me lo podrías pasar porfa saludos

    ResponderEliminar
  10. Porfa porfa el hex Mi correo es mark_1504@hotmail.con saludos

    ResponderEliminar
  11. Porfa porfa el hex Mi correo es mark_1504@hotmail.con saludos

    ResponderEliminar
  12. Amigo no me sale el punto hex. Me lo podrías pasar porfa saludos

    ResponderEliminar
  13. Amigo también tengo problemas para compilar no da nada el hex. No me lo podrías mandar por favor esta muy bueno tu proyecto de losbpokos k ay con este pik

    ResponderEliminar