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
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 20 años

Wolfskin, te voy a responder al segundo caso (el primero supongo que se diferencia según el servo que uses.

Para evitar que vibre tienes que dejar de enviarle pulsos (la vibración viene dada por ruido eléctrico, desviaciones térmicas etc que "desajustan" la comparación). Lo que tienes que hacer es sensar la posición del servo (si no le has quitado el potenciómetro puedes hacerlo ahí) y compararla con lo que le estas enviando, si es igual dejas de enviar pulsos (ten en cuenta que cuando dejes de enviar pulsos el motor dejará de hacer fuerza).

S2

Ranganok Schahzaman

Responder
luison
Respuestas: 495
(@luison)
Reputable Member
Registrado: hace 17 años

Respondiendo a si puedes dejar de enviar pulsos una vez fijada la posición, la respuesta es NO. Si dejas de enviar pulso el servo se debe de quedar en Stamby, a menos que compres algún servo super bueno y super caro que permite programarlo o comunicarte vía serie, o uno muy muy malo que está mal diseñado, caso que no es el tuyo.

El servo debe de moverse al menos 180º al menos ese modelo que tienes tú... ¿no habrás roto algo al quitar el tope no?
Por otro lado las vibraciones continuas NO suelen ser por tema de ruidos como anotan. Depende mucho del servo que uses y de su estado, si en analógico o digital, la mecánica. Los ruidos producen over-burst (creo que lo denominan) que son espasmos.
¿las vibraciones también las hace cuando está ejerciendo fuerza? por ejemplo manteniendo un peso de 400g?, si aún así vibra, prueba que tu código está correcto con otro servo en perfecto estado.

Un saludo

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

Luison, el servo si le envio pulsos variados repetidamente se mueve 360 grados.
El problema es que al enviarle pulsos de 1ms de 1.5ms i de 2ms de mueve muy poco. Eso me pasa con dos servos distintos. Así que no creo que vayan mal los dos.

Saludos.

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

Wolfskin, la quitarle el tope ¿has quitado también el potenciómetro? o ¿le has cortado el eje?, lo digo porque si no puedes estar forzando el eje del potenciómetro.

S2

Ranganok Schahzaman

Responder
Página 1 / 8
Compartir: