lunes, 5 de marzo de 2012

control de servomotor por grados

Este es un ejemplo de un sencillo programa para controlar un servomotor por medio de la computadora. controlando a diferentes grados



//Control de motor servo hobbico
//#include <16F877.h>
#include <16F870.h>
#use delay(clock=10000000)
#fuses HS,NOWDT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define out_SERVO PIN_C1
#include <stdio.h>
#include <stdlib.h>
void main()
{
  char ch;        //character variable
  char ch_p='0';  //character para indicar posicion
  int enable_SERVO; //variable de habilitación - apagado - default
  enable_SERVO = 0;  //apagado - default
  output_bit(out_SERVO,0);
  while(1)
  {
    if(kbhit())
    { //only get the character if one has been received
      ch = getchar(); //wait for and get serial character
      switch(ch)
      {
        case 'a': // arrancar motor
                  enable_SERVO=1;
                  break;
        case 'p': // parar motor
                  enable_SERVO=0;
                  break;
        default: // cambio de posicion
                  ch_p = ch;
                  break;
       }
    }
    if(enable_SERVO==1) //si esta habilitado el SERVO
    {
      output_bit(out_SERVO,1);
      switch(ch_p)
      {
        case '0': // posicion 0
                  delay_us(1000); 
                  break;
        case '1': // posicion 1
                  delay_us(1100); 
                  break;
        case '2': // posicion 2
                  delay_us(1200); 
                  break;
        case '3': // posicion 3
                  delay_us(1300); 
                  break;
        case '4': // posicion 4
                  delay_us(1400); 
                  break;
        case '5': // posicion 5
                  delay_us(1500); 
                  break;
        case '6': // posicion 6
                  delay_us(1600); 
                  break;
        case '7': // posicion 7
                  delay_us(1700);
                  break;
        case '8': // posicion 8
                  delay_us(1800);
                  break;
        case '9': // posicion 9
                  delay_us(1900);
                  break;
        case 'A': // posicion 10
                  delay_us(2000);
                  break;
       }
      output_bit(out_SERVO,0);
      delay_us(18000);//time - a variable 0-255 or a constant 0-65535
      }
  }
}