Entrenadora para los pics 16F877A y 18F4550

Para saber mas sobre esta entrenadora visita el enlace.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

jueves, 3 de marzo de 2011

Servomotor y Pic

Controlando un Servomotor con un pic16f877, por medio de la interrupción del timer0.
Código que realice para entender el funcionamiento del servomotor, aclaro que no es la única forma de realizarlo, y no conozco cual sea la mejor, esta es la primera aplicación que realizo para controlar uno.Si crees que un poco de teoría no te vendrá mal te recomiendo este link: [Servomotor]Bueno si ya conoces la teoría, o eres de los que creen que aquí ay que arriesgar, manos a la obra. 


Estoy usando el pic16f877a, 3 botones, 1 lcd, y por su puesto un Servo.

Como ya sabemos la forma de controlar el servo es por medio de PWM, osea un tiempo en alto y otro en bajo, a una frecuencia de 50hz -Osea todo el ciclo completo cada 20mS-, mi servo es el de la imagen, usado en aeromodelismo, no cuenta con datasheet, -no tiene marca- y no hace un giro exacto de 180º, Su tiempo de operación ronda de los 0.7mS para 0º y 2.7mS para hacer un giro de -casi- 180º.



[Código]
#include <16f877a.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, NOLVP, NOPROTECT
#define LCD_E     PIN_d0
#define LCD_CK    PIN_d1
#define LCD_DAT   PIN_d2
#define LCD_LED   PIN_d3
#include <3pins.c>
#use fast_io(B)

int cont=0;
int pos=16;

#int_timer0                 
 void Pwm()
  {
   set_timer0(150);
   cont++;

   if(cont>=200)
      {
       cont=0;
      }
   if(cont<pos)
    {
      output_high(PIN_B0);
    }
   if(cont=pos)
    {
      output_low(PIN_B0);
    }
  }
void main()
 {
  lcd_init();
  set_tris_b(0b11111110);                   // Pin B0 como salida,
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // Preescaler de 4
  EXT_INT_EDGE(l_TO_H);                   // se desborda de Alto a bajo
  enable_interrupts(INT_timer0);         // Activar timer0
  enable_interrupts(global);            // Activar Interrupciones Globales
  set_timer0(150);

   while(1)
    {
    lcd_gotoxy(1,1);
    printf(lcd_putc,"Posicion: ");

    if(Input(Pin_b4))
      delay_ms(100);
    if(Input(Pin_b4))
     {
      pos=7;
      lcd_gotoxy(1,2);
      printf(lcd_putc,"     0 Grados  ");
     }

    if(Input(Pin_b5))
      delay_ms(100);
    if(Input(Pin_b5))
     {
      pos=15;
      lcd_gotoxy(1,2);
      printf(lcd_putc,"     90 Grados  ");
     }

    if(input(pin_b6))
      delay_ms(100);
    if(Input(Pin_b6))
     {
      pos=27;
      lcd_gotoxy(1,2);
      printf(lcd_putc,"     180 Grados  ");
     }
    }
}

[Descripción del código]

El objetivo del código es que al presionar un botón conectado al pin_B4 ponga en alto por 0.7mS el pin_B0 del pic y transcurrido ese tiempo mantenga ese pulso en bajo por 17.3mS, y repetir este proceso indefinidamente, asegurando el ciclo de trabajo por 20mS. -De similar forma para 90º y 180º con sus respectivos tiempos-.
La forma en la que logro esto es usando el timer0, el cual usando el oscilador de 20Mhz, iniciando el timer0 con un valor de 150 y con un preescaler de 4 obtengo que cada 100uS  -0.1 mS- el timer0 desvordara y atenderá la interrupción llamada #int_timer0, dentro de esta interrupción ay una variable llamada cont, la cual contara las veces que desborda el timer0, dentro de esta misma función ay 3 condiciones, la primera reviza si el contador no a sobrepasado los 200 desvordamientos para no superar los 20mS (200 * 0.1mS = 20mS), una ves que sobrepase el contador se reinicia a 0, la otra condición es para poner el servo en la posición indicada por los botones, (B4, B5, B6). Por ejemplo si queremos ponerlo en 90º presionamos el boton B5, el cual tiene un valor de 15 en la variable pos la cual es checada en la segunda condición, la cual compara el valor cont con el valor pos y si cont es menor a pos pone en alto el pin_B0, y la tercera es cuando los dos valores son idénticos apaga esta señal por los 18.5mS restantes (185 desbordamientos).

[Vídeo]




Aquí la representación visual de todo lo dicho.

miércoles, 2 de marzo de 2011

Servomotor DC

A mi parecer unos de los elementos mas interesantes en la construcción de los Robots son los Servomotores, y ya que mi carrera esta enfocada a la Robotica es imprescindible hacer uso de ellos. ¿Pero que son? Bueno intentare explicarlos a continuación.                             
Si ya estas empapado de información y mucha teoría acerca de que son y como esta conformados y lo que realmente quieres es hacer mover un servomotor, te recomiendo visites este enlace: Servomotor [CCS]





[Introducción]
       Un servomotor -también llamado servo- es un dispositivo similares a los motores de corriente continua, y lo que  lo caracteriza es que puede ubicarse en cierta posicion dentro de su rango de operación -la cual varia en cada servo- y mantenerse estable en dicha posición.
         Su componente principal es un motor de corriente continua, básicamente al aplicar un voltaje al motor girara en un sentido a una velocidad considerable pero con un torque muy bajo, para aumentar el torque de este se usa una caja reductora, la cual transforma la velocidad de giro del motor en torsión.


[Componentes]
Los componentes básicos del servomotor son los siguientes:
  • 1) Motor de CC: Es el actuador del servomotor es el dispositivo que genera el movimiento.
  • 2) Tren de engranajes: Son los encargados de darle al servomotor una de sus mejores características, un buen torque.
  • 3) Potenciometro: Es el elemento que conectado a la circuiteria nos indica en que posición se encuentra el servomotor.
  • 4) Circuito de control: Es toda la circuiteria interna que procesa la señal PWM, genera el cambio de giro del motor y procesa la lectura del potenciometro para indicarnos en que angulo se encuentra.

[Funcionamiento]
La modulación por ancho de pulsos o PWM (power width modulation), es el sistema mas empleado para el control de servomotores, ¿Como funciona esto? Básicamente se le tiene que estar aplicando un pulso periódico, para que el servomotor se posicione en un punto especifico, ¿Y si dejo de aplicarle dicho pulso? Si al servo se le deja de aplicar este pulso dejara de ejercer una fuerza y cualquier fuerza externa podrá hacer girar el eje del motor aunque este conectado a la alimentación. Así que para mantener al servo en la misma posición   y no quede expuesto a perderla, se necesita mandarle el mismo pulso repetidas veces.
Cada servomotor tiene condiciones distintas de operación tanto en su alimentación que varia de 4 a 8 volts, el giro maximo que pueden realizar -Normalmente de 0 a 180º- así como la duración del pulso que varia entre 1mS y 3 mS, normalmente la frecuencia a la que se operan es a 50hz quiere decir que todo el ciclo de operación (Tiempo en alto y bajo del pulso) se ejecutara cada 20 mS, aunque en ciertos casos el ciclo de operación puede rondar entre 10 y 30 mS sin ningún problema. 
Haciendo cuentas, si operamos el servomotor a 50Hz, y queremos posicionar nuestro servomotor en 180º, mandamos un pulso en alto con una duración de 3mS (o depende del servo) luego ese pulso se detendra (Mantener en bajo dicho pulso) 17mS  y se repetirá este ciclo indefinidamente y así poder asegurar que el motor no quedara expuesto a fuerzas externas que muevan el eje.


[Conexiones]
Los servomotores tienen 3 terminales, 2 corresponden a la conexión eléctrica y el 3ro por donde inyectaremos nuestra señal, esta terminal la podemos conectar directamente a cualquier microcontrolador ya que internamente trae su etapa de potencia. De acuerdo a la marca del servomotor estas terminales pueden ser de distintos colores. Aquí las mas comunes:

[Vídeo]
Si no entendiste ni media palabra de lo que e dicho, encontre un video en youtube, el cual puede dejar mas claro, esto de los servos. 




Como mencione antes, los servomotores pueden girar de 0 a 180º normalmente, existen algunos que llegan hasta 210º, pero si requieres que den giros completos Ariel Palazzesi explica en su pagina como trucar un servomotor.


Saludos!!!