Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Servos y PWM

40 Respuestas
10 Usuarios
0 Reactions
15.4 K Visitas
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Buenas a todos.

Últimamente he estado mirándome el tema del PWM estoy intentando controlar un servomotor FUTABA 3003, pero tengo dos problemas.

En primer lugar, la mecánica del servo tiene un ángulo de 360 grados (ya que le quite el tope al trucarlo). Pero controlándolo por PWM el ángulo que puedo recorrer del máximo al mínimo es de menos de 50 grados. Me gustaría saber cómo puedo hacerlo para ampliar ese rango.

En segundo lugar, cuando el servo llega a la posición (media, mínima o máxima), se queda vibrando. ¿Eso es normal? En caso de que no lo sea me gustaría saber cómo puedo evitar que vibre. He comprobado que vibra ya que estoy todo el rato enviándole pulsos. ¿Como lo puedo hacer para que cuando el servo este posicionado donde lo quiero pare de enviar pulsos?

Adjunto el código que utilizo para controlar el servo:


#include <16F876A>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES RC //Resistor/Capacitor Osc with CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

//------------------------------------------------------------------------------

//Registros
#byte PORTB = 0x06
#byte TRISB = 0x86

//LED
#bit LED = PORTB.1

//SERVOS
#bit servo1 = PORTB.0

//Otros
#define ON 1
#define OFF 0

const int AJUSTE_FINO_DE_RTCC = 61;
const int ticks_PULSO_MINIMO = 62;
const int ticks_PULSO_MEDIO = 93;
const int ticks_PULSO_MAXIMO = 125;

int1 flagRTCC = 0;
int contRTCC = 0;
int1 flagSERVO1 = 0;
int tSERVO1 = ticks_PULSO_MEDIO;
int ValTIMER0;

#int_RTCC
void RTCC_isr()
{

++contRTCC;

if(contRTCC == 4)
{
set_TIMER0(AJUSTE_FINO_DE_RTCC);
}
if(contRTCC == 5)
{
flagRTCC = 1;
contRTCC = 0x00;
}

}

void main(){

//Configuracion
//---------------------------------------------------------------------------

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);

//---------------------------------------------------------------------------

setup_counters(RTCC_INTERNAL,RTCC_DIV_16);

// Configura les interrupciones.
enable_interrupts(global);
enable_interrupts(int_RTCC);

// Inicialitza el timer a 0
set_TIMER0(0);

TRISB = 0x00;
PORTB = 0

while(1){

// DISPARO DEL PULSO PWM
if(flagRTCC == 1)
{
flagRTCC = 0;
servo1 = ON;
flagSERVO1 = 1;
}

// CONTROL DE ANCHO DEL PULSO PWM
if(flagSERVO1 == 1)
{
valTIMER0 = get_TIMER0();

if(valTIMER0 > tSERVO1)
{
flagSERVO1 = 0;
servo1 = OFF;
}

}

}

}

Saludos y gracias.

Responder
39 respuestas
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Ranganok, no lo quite ni le corte el eje.
Lo que no entiendo es que en teoria el potenciometro tiene un tope (no se si son unos 200 grados). En cambio el servo gira 360 grados.
Como no lo entenia desmonte el servo porque creia que me lo habia cargado, pero estaba todo perfecto.

Tengo que sacar el potenciometro?

Saludos.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 18 años

Wolfskin, creo que no te entendemos bien o tú no has entendido bien lo de trucar los servos.

Primero, Qué quieres hacer exactamente? Tener un servo (con rotación de 180º) o Usar el servo como si fuera un motor normal y corriente (que gire indefinidamente hacia delante o hacia atrás).

Aclara esto, ya que sino quizá hablemos de cosas distintas.

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 20 años

Wolfskin, estas pasando de rosca el potenciómetro.

S2

Ranganok Schahzaman

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 18 años

Hay potenciómetros que son totalmente lisos por dentro por lo que no les afecta el darle una vuelta completa al eje. Yo he visto alguno. Lo que ya no se si el que tiene Wolfskin será así o no.

Wolfskin, puedes confirmar si lo que quieres es un motor o un servo?

Responder
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Lo que quiero es un servo. 🙂

Responder
Página 2 / 8
Compartir: