Hogar > Perspectivas de la industria >BLDC
APOYO TÉCNICO

Soporte de producto

¿Cuál es el código del servocontrolador pwm? Guía completa del código de servocontrol PWM: principios, ejemplos y mejores prácticas

Publicado 2026-04-01

Esta guía proporciona una explicación práctica y completa del código de modulación de ancho de pulso (PWM) para controlarservomotores. Si está buscando el código exacto, las instrucciones de cableado y los principios de sincronización para hacer unservomuévete a un ángulo preciso, has venido al lugar correcto. Este artículo se centra en el estándar universalmente aceptado paraservocontrol (la señal PWM de 50 Hz con un ancho de pulso entre 1 ms y 2 ms) y proporciona ejemplos de código de trabajo que son independientes del hardware, lo que garantiza que pueda aplicarlos a cualquier plataforma de microcontrolador.

El principio básico: decodificar la señal PWM

En esencia, controlar un servo analógico estándar no se trata de enviar paquetes de datos complejos, sino de generar un pulso eléctrico específico y repetido. El circuito interno del servo interpreta el ancho de este pulso para determinar la posición objetivo de su eje de salida.

La señal de control estándar está definida por dos parámetros clave:

1. Periodo (Frecuencia):La señal se repite cada 20 milisegundos (ms). Esto equivale a una frecuencia de 50 Hz (1/0,02 s = 50 Hz).

2. Ancho de pulso (ciclo de trabajo):La duración de la señal es alta (lógica 1) dentro de ese período de 20 ms. Este valor se asigna directamente al ángulo del servo.

El mapeo entre el ancho y el ángulo del pulso es la información crítica. Para la gran mayoría de servos estándar, la relación es lineal y sigue esta especificación estándar de la industria:

Pulso de 1,0 ms:Gira el servo a 0 grados (completamente en sentido antihorario).

Pulso de 1,5 ms:Gira el servo a 90 grados (posición central).

Pulso de 2,0 ms:Gira el servo a 180 grados (completamente en el sentido de las agujas del reloj).

Si bien muchos servos cumplen con este estándar, es esencial verificar el rango exacto para su modelo específico, ya que algunos servos especializados o de alto torque pueden tener puntos finales ligeramente diferentes (por ejemplo, de 0,9 ms a 2,1 ms). Los ejemplos de código siguientes están estructurados para permitir un fácil ajuste de estas constantes de ancho de pulso mínimo y máximo.

Estructura del código de servocontrol universal PWM

La lógica del código es consistente en todas las plataformas: inicialice un temporizador/contador para generar una señal de 50 Hz y luego module el "tiempo de encendido" de esa señal para establecer el ángulo del servo. El siguiente pseudocódigo demuestra la lógica central, que puede adaptar a cualquier entorno de programación.

// --- Constantes de configuración --- #define PWM_FREQUENCY_HZ 50 #define PERIOD_MS (1000 / PWM_FREQUENCY_HZ) // Calcula hasta 20 ms #define PULSE_MIN_MS 1.0 // Ancho de pulso para 0 grados #define PULSE_MAX_MS 2.0 // Ancho de pulso para 180 grados #define ANGLE_MIN 0 #define ANGLE_MAX 180 // --- Función para asignar un ángulo a un ancho de pulso --- float ánguloToPulseWidth(int ángulo_grados) { // Restringir el ángulo a un rango válido if (ángulo_grados ANGLE_MAX) ángulo_grados = ANGLE_MAX; // Mapeo lineal desde el rango de ángulos hasta el rango de ancho de pulso float pulse_width = PULSE_MIN_MS + ( (float)(angle_grados - ANGLE_MIN) / (ANGLE_MAX - ANGLE_MIN) )(PULSE_MAX_MS-PULSE_MIN_MS); devolver ancho_pulso; } // --- Concepto de bucle de control principal --- // En una implementación real, lo siguiente sería manejado por un temporizador de hardware. // 1. Establezca el pin de salida en ALTO. // 2. Espere (retraso) el ancho de pulso calculado (por ejemplo, 1,5 ms). // 3. Establezca el pin de salida en BAJO. // 4. Espere el resto del período de 20 ms (PERIOD_MS - pulse_width).

Ejemplos de código prácticos para plataformas comunes

Para que esto sea factible de inmediato, a continuación presentamos implementaciones concretas para dos de las plataformas de desarrollo más comunes. Los principios siguen siendo idénticos, lo que demuestra la portabilidad del estándar de 50 Hz, 1-2 ms.

Ejemplo 1: Arduino (usando la servobiblioteca incorporada)

Este es el punto de entrada más común para los aficionados. el arduinoservoLa biblioteca abstrae la complejidad del temporizador de hardware y proporciona una interfaz limpia. Este ejemplo se basa en la práctica estándar de conectar el cable de señal del servo a un pin digital compatible con PWM.

#incluir// Crea un objeto servo Servo myServo; // Definir el pin conectado al cable de señal del servo const int servoPin = 9; void setup() { // Adjunte el objeto servo al pin // La biblioteca configura automáticamente la señal de 50 Hz myServo.attach(servoPin); // --- Escenario común: centrar el servo al iniciar --- // En muchas aplicaciones robóticas, es crucial comenzar desde una // posición conocida y segura para evitar tensiones mecánicas. Centrar a 90 grados // es una mejor práctica universal. miServo.write(90); // Pasar a la posición central delay(1000); // Permitir tiempo para alcanzar la posición } void loop() { // Barrido de 0 a 180 grados para (int ángulo = 0; ángulo = 0; ángulo--) { myServo.write(angle); retraso(15); } }

Nota: Elescribir()La función convierte automáticamente el ángulo (0-180) al ancho de pulso correcto (1-2 ms).

Ejemplo 2: Raspberry Pi (usando Python y RPi.GPIO)

En una Raspberry Pi, normalmente generas la señal PWM en el software, lo que requiere una sincronización precisa. ElRPi.GPIOLa biblioteca proporciona una interfaz PWM respaldada por hardware en pines específicos para señales más precisas. Este ejemplo refleja el enfoque estándar para el control de un solo servo en una computadora de placa única basada en Linux.

importar RPi.GPIO como tiempo de importación GPIO # Definiciones de pines servo_pin = 18 # Utilice un pin que admita hardware PWM, como GPIO 18 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # Configuración de PWM: frecuencia de 50 Hz pwm = GPIO.PWM(servo_pin, 50) pwm.start(0) # Comience con 0% de ciclo de trabajo def set_angle(angle): """Convertir un ángulo (0-180) en un ciclo de trabajo para una señal de 50 Hz.""" # Restringir ángulo ángulo = max(0, min(180, ángulo)) # Mapear ángulo (0-180) a ancho de pulso (1-2 ms) # Para un período de 20 ms (50 Hz), ciclo de trabajo = (pulse_width_ms / 20) 100 pulse_width_ms = 1,0 + (ángulo / 180,0)1.0 # Se asigna a 1.0-2.0 ms duty_cycle = (pulse_width_ms / 20.0)100.0 pwm.ChangeDutyCycle(duty_cycle) # --- Escenario común: calibrar un nuevo servo --- # Al integrar un servo por primera vez, es fundamental verificar sus verdaderos # límites mecánicos. El siguiente código demuestra una rutina de calibración segura. try: # Pruebe la posición central print("Moviéndose a 90 grados...") set_angle(90) time.sleep(2) # Pruebe la posición de 0 grados (pulso de 1,0 ms) print("Moviéndose a 0 grados...") set_angle(0) time.sleep(2) # Pruebe la posición de 180 grados (pulso de 2,0 ms) print("Moviéndose a 180 grados...") set_angle(180) time.sleep(2) # Regresar al centro print("Regresar al centro.") set_angle(90) time.sleep(1) excepto KeyboardInterrupt: print("Detenido por el usuario") finalmente: pwm.stop() GPIO.cleanup()

Nota: Este método utiliza el cálculo del ciclo de trabajo. Para una señal de 50 Hz, un pulso de 1 ms corresponde a un ciclo de trabajo de (1/20)100 = 5%. Un pulso de 2 ms es (2/20)100 = 10%.

Errores comunes y solución de problemas

Incluso con el código correcto, varios problemas relacionados con el hardware pueden impedir que un servo funcione. Comprender estos escenarios comunes le ayudará a diagnosticar y resolver problemas rápidamente.

1. Fuente de alimentación insuficiente:Este es el problema más frecuente. Un servo típico puede consumir entre 200 y 500 mA cuando se mueve e incluso corrientes de pérdida más altas. Los puertos USB del microcontrolador (normalmente 500 mA) suelen ser insuficientes, especialmente para múltiples servos.

Solución:Utilice una fuente de alimentación externa dedicada (por ejemplo, 5 V de un paquete de baterías o una fuente de alimentación regulada). Asegúrese de que la tierra (GND) del microcontrolador esté conectada a la tierra de la fuente de alimentación externa.

2. Valores de sincronización incorrectos:Si el servo tiembla, zumba o no se mueve en el rango completo, es probable que los límites de ancho de pulso no coincidan con las especificaciones del servo.

Solución:Consulte la hoja de datos del servo para conocer el rango exacto de ancho de pulso. Una variación común es de 0,9 ms a 2,1 ms. Ajustar elPULSE_MIN_MSyPULSE_MAX_MSconstantes en su código en consecuencia.

3. Deriva de frecuencia en el software PWM:En plataformas como Raspberry Pi sin pines PWM de hardware dedicados, el PWM generado por software puede sufrir inconsistencias de tiempo debido a la multitarea del sistema operativo.

Solución:Para aplicaciones críticas o de alta velocidad, utilice una placa de servocontrolador dedicada (como una PCA9685) que descarga la sincronización a un chip de hardware dedicado, lo que garantiza una generación estable de 50 Hz.

Conclusión procesable

Para controlar con éxito un servo con código PWM, recuerde estos tres principios básicos:

1. Estandarizar la señal:Trate siempre de generar una señal precisa de 50 Hz. El ancho del pulso es la única variable que controla la posición.

2. Asignar ángulos a pulsos:Utilice el mapeo lineal de 1,0 ms (0°) a 2,0 ms (180°) como línea base. Esta fórmula funciona para más del 90% de los servos estándar.

3. Priorizar el poder:Verifique que su fuente de energía pueda entregar la corriente requerida. Un servo que se contrae erráticamente casi siempre es un problema de energía, no un problema de código.

Paso de acción:Comience con el código de barrido simple en la plataforma elegida usando un solo servo. Una vez que el barrido funcione, reemplace los ángulos codificados con entradas de sensores, valores de joystick o posiciones calculadas para integrar el servo en su proyecto más grande. Al cumplir con el estándar de 50 Hz y verificar su suministro de energía, crea una base sólida para cualquier aplicación de control de movimiento.

Hora de actualización: 2026-04-01

Impulsando el futuro

Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.

Correo a Kpower
Enviar consulta
+86 0769 8399 3238
 
kpowerMapa