Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 3 visitas.| 3409979 Visitas (desde Dic. 2011), hoy: 271 Visitas 854 Pag. Vistas , ultimos 36 dias: 10133 Visitas. 48531 Pag. Vistas. Tu IP: 3.142.98.108
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

Cotrol servo s3003 con css

Hilo en un foro:

Antieriormente; ya habia sido asesorado por wilfretronic; al que agradezco su ayuda para este proyecto.
Mi problema es el siguiente;

Tengo el siguiente codigo;

Código:

#include “C:\Proyectos con Proteus y MPLab con LCD\Programas para PCB en PIC C compiler CCS\Circuito de prueba para un 16F876A\Programa para servo Futaba S3003 con CCS\Pic16F876A_01_2.h”
#use delay (clock=4000000)                //Fosc=4Mhz
#byte PORTA=5
#byte PORTB=6
#byte PORTC=7
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)

//////////////////////////////////////////////
//Variables externas y funciones
//////////////////////////////////////////////
void retardo (unsigned int32 y);
void pulso(unsigned int pulso_alto);
unsigned int32 high=0,low=0,ajustar=0;
unsigned int mover_a=0;
//////////////////////////////////////////////
//Programa inicial
//////////////////////////////////////////////
void main(void)
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_a(63);                     //Todo el Puerto A como entrada
   set_tris_b(255);                    //Todo el PUERTO B como entrada
   set_tris_c(0);            //Todo el PUERTO C como salida
  while(1)
   {
   if(PORTA==33)               //Si A0 y A5 estan en 1
         {
              mover_a=PORTB;         //Guardar valor de PORTB en mover_a
              delay_us(5);         //Retardo de 5 microsegundos
              ajustar=mover_a;      //Pasar el valor mover_a hacia ajustar
                                //por seguridad pasa de int a int32
         }
    if(PORTA==0&&ajustar>=0&&ajustar<=180)
      {pulso(ajustar);}                        //Llamar funcion para generar pulso      �
   }
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//==========    Funcion retardo    ================
//=================================================
void retardo (unsigned int32 y)               �
{
  unsigned int32 z;     //Varible contador
  for(z=1;z<=y;z++)     //Realizar retardo de 10us “y” veces
   {                �
   delay_us(10);        //Retardo de 10 microsegundos
   }
}
////////////////////////////////////////////////

////////////////////////////////////////////////
//==========    Funcion pulso    ================
//===============================================
void pulso(unsigned int pulso_alto )
{
    high=pulso_alto+30;              //Calcula tiempo en alto “high”
                                     //   30 = 0 grados (constante)
                                     //   40 = 1 grado
                                     //   210 = 180 grados
    low=2000-high;                   //Calcula tiempo en bajo
                                     //**High+low=(2000x10us)= 50Hz o 20 ms
    bit_set(PORTC,0);                //Activo el PIN 1 del puerto C
    retardo(high);                   //Llamar funcion de retardo
    bit_clear(PORTC,0);              //Limpiio el PIN 1 del puerto C
    retardo(low);                    //Llamar funcion de retardo        �
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////

el cual he simulado con proteus VSM y creado por PIC C Compiler CCS,

El proyecto de simulacion ha sido adjuntado

El problema es que en Proteus funciona de maravilla; pero al grabar el *.hex al PIC ya no funciona correctamente, es decir, yo doy la combinación binaria por el puerto B no mayor o igual a 180 y la señal es sacada por el RC0 a una frecuencia de 50 HZ, y no es asi.

Creo que el error esta en el tipo de variables que uso; para lo que estoy pidiendo ayuda, segun yo puede ser el retardo a 10 us o el incremento de la trancisión de alto a bajo en la funcion pulso. además que el servo comenzaba a vibrar, pero ya he corregido esto o al menos no se nota(vibraba porque la señal de control obligaba al servo a ir más alla de 180 grados, y las vibraciones, eran golpes con el tope que posee el servo), incluso logre mover el servo de 0 grados a 180, pero la varible “ajustar” solo puede tomar un valor menor o igual a 42 (es decir 0= 0 grados y 42 = 180 grados); esto no lo entiendo; por favor alguien que me ayuda a comprender porque mi simulación en proteus con el anterior programa si funcionaba y al cargarlo al PIC ya no lo hacia de la forma correcta. aunque como repito yo creo que son las variables.

Le hice algunas modificaciones para que funcionara al menos como lo necesito cambiando la constante de 2000 a 500.
Es poco codigo asi que espero sea comprendido con la menor explicación.

Código:

#include “C:\Circuito de prueba para un 16F876A\Programa para servo Futaba S3003 con CCS\Pic16F876A_01_1.h”

#use delay (clock=4000000)                //Fosc=4Mhz
#byte PORTA=5
#byte PORTB=6
#byte PORTC=7
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)

//////////////////////////////////////////////
//Variables externas y funciones
//////////////////////////////////////////////
void retardo (unsigned int32 y);
void pulso(unsigned int pulso_alto);
unsigned int32 high=0,low=0,ajustar=0;
unsigned int mover_a=0;
//////////////////////////////////////////////
//Programa inicial
//////////////////////////////////////////////
void main(void)
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_a(63);                     //Pin RA0,RA3 como entradas
   set_tris_b(255);                    //Todo el PUERTO B como entrada.
   set_tris_c(0);            //Todo el PUERTO C como salida
  while(1)
   {
   if(PORTA==33)               //Si A0 y A5 estan en 1
         {
              mover_a=PORTB;         //Guardar valor de PORTB en mover_a
              delay_us(1);         //Retardo de 5 microsegundos
              ajustar=mover_a;      //Pasar el valor mover_a hacia ajustar
                                //por seguridad pasa de int a int32
         }
    while(PORTA==0&&ajustar>=0&&ajustar<=180)
      {pulso(ajustar);}                        //Llamar funcion para generar pulso      �
   }
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//==========    Funcion retardo    ================
//=================================================
void retardo (unsigned int32 y)               �
{
  unsigned int32 z;     //Varible contador
  for(z=1;z<=y;z++)     //Realizar retardo de 10us “y” veces
   {                �
   delay_us(10);        //Retardo de 10 microsegundos
   }
}
////////////////////////////////////////////////

////////////////////////////////////////////////
//==========    Funcion pulso    ================
//===============================================
void pulso(unsigned int pulso_alto )
{
    high=pulso_alto+10;              //Calcula tiempo en alto “high”
                                     //   30 = 0 grados (constante)
                                     //   40 = 1 grado
                                     //   210 = 180 grados
    low=500-high;                   //Calcula tiempo en bajo
                                     //**High+low=(2000x10us)= 50Hz o 20 ms
    bit_set(PORTC,0);                //Activo el PIN 1 del puerto C
    retardo(high);                   //Llamar funcion de retardo
    bit_clear(PORTC,0);              //Limpio el PIN 1 del puerto C
    retardo(low);                    //Llamar funcion de retardo        �
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////

Ahora. Lo que necesito es que al recibir una combinación binaria por el puerto B, el servomotor Futaba S3003 se desplace segun sea el valor por RC0; cabe mencionar que la aceptación de dicho valor es controlado por RA0 y RA1.

Por favor y gracias.

cualquier duda o aclaración estoy a sus ordenes Dmag00

 

Fuente: http://www.forosdeelectronica.com/f24/control-servo-futaba-s3003-ccs-18407/

Escribe un comentario

Tu comentario