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.
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%.
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.
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.
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.
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°:
![]()
ancho_pulso_ms = 1,0 + (45/180)1,0 = 1,25 ms
valor_deber = (1,25/20)255 = 15,9375 → entero16
// 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);
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.
// 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); }
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
Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.