Servo de control: ¿cómo determinar el ángulo y el ancho de pulso necesario?

Soy un poco nuevo cuando se trata de usar servos con una Raspberry Pi. Aunque tengo algo de experiencia, me gustaría entender las cosas un poco mejor. Por lo tanto, me gustaría compartir algunas preguntas con usted y espero obtener mejores conocimientos sobre cómo trabajar con servos.

Las preguntas con las que estoy luchando actualmente:

1. Dadas las especificaciones del servo, ¿cómo puedo deducir los valores mínimo y máximo (ángulos) del servo?
2. Usando el PWM Hat que se describe a continuación, y la biblioteca de python que viene con él, ¿cómo calculo exactamente el tiempo que el pulso PWM debe establecerse en Alto para lograr un cierto ángulo? Por ejemplo: ¿cuál sería la longitud alta del pulso PWM para enviar al servo para que esté en una posición de 90 grados? ¿Y cuál sería para una posición de 120 grados?

Cualquier pensamiento, observación o comentario es muy apreciado, ¡gracias de antemano!


Especificaciones de hardware y software

el servo

El servo que tenemos es este , el Power HD LF-20MG

Par (4,8 V): 16,5 kg-cm
Par (6,6 V): 20 kg-cm
Velocidad: 0,18 s (4,8 V) | 0,16 s (6,6 V)
Voltaje de funcionamiento: 4,8 - 6,6 voltios de CC
Peso: 60 g
Frecuencia de funcionamiento: 1520 us (= 1,52 ms) a 333 Hz
Recorrido máximo: 165 grados

El controlador PWM

Para controlar el Servo usando una Raspberry Pi, usamos este PWM/SERVO HAT de Adafruit para una sincronización precisa. El HAT debe controlarse utilizando su biblioteca de Python en la que las siguientes funciones controlan el servo:

El controlador de software PWM

En primer lugar, establecer la frecuencia. Según las especificaciones del servo, supongo que debería ser 333.

pwm.setPWMFreq(333)

En segundo lugar, hay una función que realmente controla el pulso PWM. Esto es donde realmente estoy dudando (ver la segunda pregunta anterior).

var port = 15
var tickHigh = 0
var tickLow = 1400 #For example; range from 0-4096
pwm.setPWM(port, tickHigh, tickLow)

Como se indica en los documentos (consulte este enlace ), los valores a usar se calculan en función del ancho de pulso necesario en microsegundos. Pero realmente estoy luchando aquí: parece que no puedo determinar cuál debería ser el ancho de pulso necesario para este servo (de ahí las preguntas).
SI supiera eso, el cálculo para el software se vuelve mucho más fácil:
(1 / frecuencia) / 4096 = tiempo por pulso
Para la frecuencia de este servo sería: (1/333) / 4096 = 0,00000073315503
Entonces podría use la siguiente fórmula, dada la longitud de ancho de pulso necesaria:
longitud de pulso necesaria / tiempo por tic = tickHigh

> If you need to calculate pulse-width in microseconds, you can do that
> by first figuring out how long each cycle is. That would be 1/freq
> where freq is the PWM frequency you set above. For 1000 Hz, that would
> be 1 millisecond. Then divide by 4096 to get the time per tick, eg 1
> millisecond / 4096 = ~0.25 microseconds. If you want a pulse that is
> 10 microseconds long, divide the time by time-per-tick (10us / 0.25 us
> = 40) then turn on at tick 0 and turn off at tick 40.

Respuestas (2)

Su pregunta era demasiado larga para leer.

Este tipo de servomotores de hobby están controlados por el ancho de un pulso. El rango estándar es de 1 a 2 ms, y debe repetirse cada 20-50 ms. El ancho de pulso de 1,5 ms pondrá el servo en el medio de su rango, con 1 ms en un extremo y 2 ms en el otro. Algunos servos pueden ir un poco más lejos en respuesta a valores un poco más allá del rango de 1-2 ms.

La mayoría le dirá el rango de ángulo en el que están destinados a trabajar, por lo que le da una idea del cambio de ángulo por incremento de ancho de pulso en su extremo.

Al final, recuerde que estos son servos de hobby , así que no espere una hoja de datos real con todo correctamente explicado. La mejor manera de saber qué puede hacer un servo de hobby en particular es medirlo. Configure una plantilla que pueda variar el ancho de pulso de 500 µs a 2,5 ms y vea qué hace la unidad en respuesta.

Asumiendo desde esta línea - " Frecuencia de trabajo: 1520us (=1.52ms) a 333Hz ", 1.52ms es el ancho de pulso requerido para la rotación máxima de su servo, es decir, 165 grados.

en ese caso:

Como ya calculó, el período de tiempo de su pulso será 1/333 = 0.003003 seg. Su tiempo alto requerido en el período es 1.52 ms = 0.00152 seg. Como ya calculó el tiempo por tick = 1/333/4096 = 0.000000733

Entonces, para crear un pulso alto de 0.00152 segundos de ancho, necesita 0.00152/0.000000733 = 2073 tics

intente dar tickHigh = 0 y tickLow = 2073

o tickHigh = 4096-2073 = 2023 y tickLow = 4096

No. Estás partiendo de una suposición incorrecta. 1,5 milisegundos suele ser el punto medio , con desviación a ambos lados. No se ha indicado la magnitud de la desviación, pero tradicionalmente es del orden de 0,5 mS a cada lado. Los 333 Hz son un máximo, no un requisito; Las velocidades de actualización tradicionales son de 50 Hz, aunque es probable que algunos conjuntos RC modernos basados ​​en MCU se actualicen más rápido, ya que podrían diseñarse para generar pulsos de servo para múltiples canales en paralelo en lugar de robar turnos.