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

Soporte de producto

Control de señal PWM para servomotores: una guía de programación completa

Publicado 2026-04-02

Esta guía explica cómo controlar un estándar.servomotor utilizando señales de modulación de ancho de pulso (PWM). Aprenderá los parámetros PWM exactos (período, ancho de pulso, ciclo de trabajo) necesarios para configurar unservoa cualquier ángulo de 0 a 180 grados. Las instrucciones se basan en plataformas de microcontroladores ampliamente disponibles y han sido verificadas con dispositivos analógicos y digitales comunes de 50 Hz.servoSe utiliza en robótica amateur. Siguiendo los ejemplos de código paso a paso y los métodos de calibración, puede posicionar de manera confiable un servo sin fluctuaciones ni derivas.

01Parámetros principales de PWM para el servocontrol

Un servomotor estándar espera una señal PWM con las siguientes características fijas:

Periodo de señal: 20 ms (milisegundos), lo que equivale a una frecuencia de50Hz.

Ancho de pulso (tiempo alto): varía entre1,0 msy2,0 ms.

ciclo de trabajo= (ancho de pulso / 20 ms) × 100%.

Ángulo de servo deseado Ancho de pulso Ciclo de trabajo (aprox.)
0° (mínimo) 1,0 ms 5.0%
90° (neutro) 1,5 ms 7.5%
180° (máximo) 2,0 ms 10.0%

Nota: Algunos servos pueden aceptar de 0,5 ms a 2,5 ms para un rango extendido, pero el estándar de 1,0 a 2,0 ms funciona para casi todos los servos comunes.

02Programación de la salida PWM – Paso a paso

La siguiente estructura de código funciona en cualquier plataforma que proporcione hardware PWM (por ejemplo, Arduino, STM32, ESP32, Raspberry Pi con hardware PWM). Utilizamos pseudocódigo genérico para que puedas adaptarlo a tu microcontrolador específico.

2.1 Configurar el periférico PWM

Elija un pin compatible con PWM.

Establezca la frecuencia PWM en50Hz(período = 20 ms).

Establezca la resolución en al menos 8 bits (0–255) o 16 bits para un control más preciso.

2.2 Convertir el ángulo deseado al valor del ciclo de trabajo

Para un PWM de 8 bits (0 = 0 % de servicio, 255 = 100 % de servicio):

Ciclo de trabajo para 1,0 ms = (1,0 / 20,0) × 255 = 12,75 → redondear a13

Ciclo de trabajo de 1,5 ms = (1,5 / 20,0) × 255 = 19,125 → redondear a19

Ciclo de trabajo para 2,0 ms = (2,0 / 20,0) × 255 = 25,5 → redondear a26

Fórmula general para cualquier ángulo (0–180°):

pulse_width_ms = 1,0 + (ángulo / 180,0)(2,0 - 1,0) valor_deber = (ancho_pulso_ms / 20,0)(2^resolución - 1)

Ejemplo para resolución de 8 bits y 45°:

舵机pwm控制源码_pwm控制舵机程序_pwm波控制舵机转动程序

ancho_pulso_ms = 1,0 + (45/180)1,0 = 1,25 ms

valor_deber = (1,25/20)255 = 15,9375 → entero16

2.3 Escriba el valor de servicio en el registro PWM

// Pseudocode pwm_set_frequency(PWM_PIN, 50); // 50 Hz pwm_set_resolution(PWM_PIN, 8); // ángulo int de 8 bits = 90; // ángulo objetivo int duty = map(angle, 0, 180, 13, 26); // usando el deber mínimo/máximo calculado previamente pwm_write(PWM_PIN, deber);

2.4 Calibración en el mundo real (elimina la inquietud)

Debido a que no hay dos servos exactamente idénticos, mida siempre los límites reales de ancho de pulso:

1. Escriba un pulso de 1,0 ms; observe la posición del servo. Si no llega a la parada física, aumente el ancho del pulso en pasos de 0,05 ms hasta que deje de moverse (regístrelo comomi_pulso).

2. Escriba un pulso de 2,0 ms; de manera similar, encuentre el ancho de pulso máximo que proporciona una rotación completa (max_pulso).

3. Utilice estos valores medidos en su código en lugar de los 1,0/2,0 ms teóricos.

Caso común: Se requiere un micro servo típico Tower Pro SG90pulso_mínimo = 0,9 msypulso_máx = 2,1 mspara un rango real de 0 a 180°. Calibre siempre por modelo de servo.

03Código de ejemplo completo (estilo Arduino, independiente del hardware)

// Servocontrol usando PWM – no se requieren bibliotecas externas // Funciona en cualquier placa con hardware PWM (por ejemplo, Uno, Nano, Mega, ESP32) const int servoPin = 9; // constante del pin PWM int frecuencia = 50; // 50 Hz resolución int constante = 8; // 8 bits (0-255) // Límites de pulso precalibrados (en microsegundos) const int minPulseUs = 1000; // 1,0 ms = 1000 µs const int maxPulseUs = 2000; // 2,0 ms = 2000 µs void setup() { // Configurar PWM ledcSetup(0, frecuencia, resolución); // canal 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int ángulo) { // Restringir el ángulo a 0-180 ángulo = restringir(ángulo, 0, 180); // Convertir ángulo a ancho de pulso (microsegundos) int pulseUs = minPulseUs + (ángulo(maxPulseUs - minPulseUs)) / 180; // Convierte el ancho del pulso al ciclo de trabajo (0-255) int duty = (pulseUs255) / 20000; // 20000 µs = periodo de 20 ms ledcWrite(0, duty); } bucle vacío() { setServoAngle(0); // pasar a 0° retardo(1000); setServoAngle(90); // pasar a 90° de retraso(1000); setServoAngle(180); // pasar a 180° retardo(1000); }

04Solución de problemas comunes del servo PWM

Problema causa más probable Solución
El servo no se mueve. Frecuencia PWM incorrecta (no 50 Hz) Establezca la frecuencia exactamente a 50 Hz
Movimiento espasmódico/espasmódico Suministro de energía insuficiente Utilice un suministro de 5 V independiente (por ejemplo, 4 pilas AA o un regulador de 5 V/2 A)
Ángulos inexactos Los límites de pulso teóricos difieren del servo real. Realice la calibración (paso 2.4) y utilice los pulsos mínimos y máximos medidos.
El servo tararea pero no gira. Resolución del ciclo de trabajo demasiado baja (Aumente la resolución PWM a 10 o 12 bits
Sólo se mueve entre 0° y 90° Período de señal demasiado corto o rango de ancho de pulso no coincidente Verifique el período = 20 ms y que envíe pulsos entre 1,0 y 2,0 ms

05Recomendaciones prácticas para un servocontrol confiable

1. Calibre siempre cada servo individualmente– incluso dos servos del mismo modelo pueden tener una variación de ±0,1 ms. Escriba un boceto de prueba simple que barre de 0,5 ms a 2,5 ms y observe los anchos de pulso exactos para 0° y 180°.

2. Utilice una fuente de alimentación separada– nunca alimente un servo directamente desde el pin de 5V de su microcontrolador (los picos de corriente pueden restablecer la placa). Un suministro regulado de 5 V/2 A o 4 pilas NiMH (4,8 V) funcionan de forma fiable.

3. Agregue un condensador electrolítico de 100 a 470 µFa través de los terminales de potencia del servo cerca del servo. Esto absorbe las caídas de voltaje causadas por arranques repentinos del motor.

4. Evite retrasos en el softwaremientras el servo está en movimiento. Utilice temporización sin bloqueo (por ejemplo, máquinas de estado basadas en milis()) para que su programa pueda manejar otras tareas.

5. Para aplicaciones de alta precisión (por ejemplo, brazos robóticos), utilice un temporizador PWM de 16 bits e interpolación lineal entre puntos calibrados. Considere también agregar un potenciómetro de retroalimentación analógica de 10 bits para cerrar el circuito.

Conclusión principal: Controlar un servo con PWM es sencillo una vez que fija la frecuencia en 50 Hz y asigna el ángulo a un ancho de pulso de 1,0 a 2,0 ms. Sin embargo, la confiabilidad en el mundo real proviene de una calibración adecuada, una potencia adecuada y el uso de límites medidos en lugar de valores teóricos. Aplique el método de calibración descrito en la sección 2.4 a cada nuevo servo que integre y sus proyectos lograrán un movimiento suave y preciso en todo momento.

Hora de actualización: 2026-04-02

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