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;
#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.
#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/
Tuitear 3.436 Veces leído 0 comentarios |
28 noviembre 2009 en Electronica | tags: Electronica |