Go Down

Topic: Manejar Servos a más hercios (Read 1 time) previous topic - next topic

edorin77

Hola a todos, este es mi primer mensaje en el foro.

Estoy haciendo un proyecto con una placa arduino Duemilanove y unos mini servos 9g ( http://dx.com/p/9g-mini-servo-with-accessories-translucent-blue-121343 ) y tengo una duda.

Tras ir probando la librería de servos de arduino y ver que todo va perfectamente a los 500 hz que funciona por defecto la placa, probé también a mover los servos sin necesidad de la librería, simplemente con analogwrite(valor microsegundos entre 1000 y 2000) con el retarde de 20 ms de cada ciclo. Y todo perfecto.

Ahora me gustaría saber si cambiando la frecuencia por defecto (500 hz) del arduino, a por ejemplo, 32khz (ya lo he consegudo mediante programación a bajo nivel controlando los timers de cada pin pwm   ( http://playground.arduino.cc/Main/TimerPWMCheatsheet )), puedo mandarle al servo las señales para que se mueva.

He estado probando pero se queda colgado el servo.

Estos servos solo funcionan a una frecuencia máxima de los 500 hz del arduino? O pueden trabajar a más frecuencia, aunque se le manden los anchos de los pulsos más grandes para que equivalgan a los 1000 microsegundos o 2000 microsegundos de posición 0 o 180 grados?

Gracias

Cheyenne

La librería servo de Arduino no funciona a 500 Hz (no te confundas con la frecuencia de las salidas PWM, no tienen nada que ver), funciona a 50 Hz (tiempo de ciclo 20 ms como luego indicas).

El pulso que recibe un servo puede durar hasta 2,5 ms y por tanto eso ya limita la frecuencia máxima que probablemente también depende de cada servo. Puedes emplear tu código empezando en 50 Hz y comprobando que funciona el servo para ir aumentando la frecuencia y ver cuál es la máxima que admite. Te adelanto que no creo que admita mucho más de 200 Hz.

edorin77

#2
Mar 26, 2013, 05:10 pm Last Edit: Mar 26, 2013, 05:12 pm by edorin77 Reason: 1
Gracias por la respuesta.

Creo que me había confundido al explicarlo.

Realmente lo que quería saber es si mandando señales PWM a más frecuencia (por ejemplo, 1khz, 21khz, 32khz...), el servo funcionaba igual.

He estado probando, y sin usar la librería servo, y subiendo las frecuencias de las salidas PWM (9 y 10 , que son las que estoy probando), me funciona perfectamente. Aquí parte del código

Code: [Select]


....

int pinservo1 = 9;
int pinservo2 = 10;

......

void setup()
{

.........
 pinMode(pinservo1, OUTPUT);           // pone el pin como salida    
 pinMode(pinservo2, OUTPUT);           // pone el pin como salida
TCCR1B = TCCR1B & 0b11111000 | 0x01; //timer 1 de los pins 9 y 10 a 31.250 hz

}

void loop()
{

     ai = Serial.read();
     ad = Serial.read();
     bytes_ms = Serial.read();

     pulsoai = map(180 - ai, 0, 180, 500, 2500); // calculamos el ancho del pulso en      microsegundos
     pulsoad = map(180 - ad, 0, 180, 500, 2500); // calculamos el ancho del pulso en microsegundos

     digitalWrite(pinservo1, HIGH); // activamos el pin de salida
     delayMicroseconds(pulsoai); // esperamos el tiempo que dura el pulso en microsegundos
     digitalWrite(pinservo1, LOW); // desactivamos el pin de salida

     digitalWrite(pinservo2, HIGH); // activamos el pin de salida
     delayMicroseconds(pulsoad); // esperamos el tiempo que dura el pulso en microsegundos
     digitalWrite(pinservo2, LOW); // desactivamos el pin de salida

     //retardo calculado para sincronizar con envio de vbnet por puerto serie
     milisegundos = int(bytes_ms);
     tiempo_final=micros();
     delayMicroseconds((milisegundos*1000) - (tiempo_final - tiempo_inicial));[/s]


Cheyenne

Realmente no sé si controlas el tema de los servos y no te entiendo o si confundes las cosas.

Vuelves a hablar de enviar señales PWM al servo de hasta 32 kHz. Tal como he indicado antes el máximo teórico está en menos de 400 Hz y en la práctica no creo que un servo en general admita frecuencias mayores de 200 Hz.

Hablas de la frecuencia PWM de las salidas 9 y 10. En el código que muestras le cambias la frecuencia pero en realidad después NO usas ese PWM (se usa mediante la instrucción analogwrite). Simplemente te construyes tú la señal mediante estados HIGH y LOW y delay.

edorin77

#4
Mar 27, 2013, 01:18 pm Last Edit: Mar 27, 2013, 01:28 pm by edorin77 Reason: 1
Toda la razón. Me acabo de dar cuenta de lo de digitalwrite.

Gracias por las indicaciones.

Saludos

pd=

he cambiado los valores de digitalwrite a analogwrite, colocando 255 durante x microsegundos y despues a 0, y me funciona. Es correcto entonces?

Code: [Select]

      analogWrite(pinservo1, 255); // activamos el pin de salida
     delayMicroseconds(pulsoai); // esperamos el tiempo que dura el pulso en microsegundos
     analogWrite(pinservo1, 0); // desactivamos el pin de salida

     analogWrite(pinservo2, 255); // activamos el pin de salida
     delayMicroseconds(pulsoad); // esperamos el tiempo que dura el pulso en microsegundos
     analogWrite(pinservo2, 0); // desactivamos el pin de salida

Go Up