Publicado 2026-04-04
Este artículo proporciona una guía práctica y completa para escribir un programa que controle un estándar.servomotor. Aprenderá la estructura exacta del código, los parámetros críticos de la señal PWM y cómo implementar un ejemplo funcional utilizando microcontroladores comunes. No se requieren plataformas patentadas o específicas de marca; Los principios se aplican universalmente.
AservoLa posición del motor está determinada únicamente por el ancho de un pulso repetido (Modulación de ancho de pulso, PWM).Para escribir cualquier programa de servocontrol, debe generar una señal de 50 Hz (período = 20 milisegundos) y variar el ancho del pulso alto entre 1,0 ms y 2,0 ms.Esta única regla es la base de toda la programación de servos estándar.
Pulso de 1,0 ms → 0 grados(completamente en sentido antihorario)
Pulso de 1,5 ms → 90 grados(posición central)
Pulso de 2,0 ms → 180 grados(completamente en el sentido de las agujas del reloj)
Para seguir esta guía, prepare los siguientes componentes (descripciones genéricas, sin nombres de marca):
Un servomotor estándar de 5 V (3 cables: alimentación, tierra, señal)
Una placa de microcontrolador (cualquier placa lógica común de 5 V)
Una fuente de alimentación externa de 5 V (si el servo consume mucha corriente)
Cables de puente y una placa de pruebas.
Antes de cualquier código, establezca las conexiones físicas:
Ejemplo de caso común:Un principiante suele conectar la alimentación del servo directamente al pin de 5 V del microcontrolador. Cuando el servo se mueve, la placa se reinicia debido a un aumento de corriente. La solución: utilice un suministro externo de 5 V (por ejemplo, 4 pilas AA) con tierra compartida.
Cada servoprograma debe primero configurar los parámetros de la señal PWM. A continuación se muestra una estructura de código genérica (adaptable a cualquier entorno tipo C):
// 1. Defina constantes (no cambie estos valores) #define SERVO_PIN 9 #define PWM_FREQUENCY_HZ 50 // 50 Hz = periodo de 20 ms #define PULSE_MIN_US 1000 // 1,0 ms para 0° #define PULSE_MID_US 1500 // 1,5 ms para 90° #define PULSE_MAX_US 2000 // 2,0 ms para 180°// 2. Función de configuración (se ejecuta una vez al encender)void setup() { // Configurar el pin como salida pinMode(SERVO_PIN, OUTPUT); // Configurar el hardware PWM para pulso inicial de 50 Hz y 1,5 ms (posición central) configurePWM(SERVO_PIN, PWM_FREQUENCY_HZ, PULSE_MID_US); retraso(1000); // Permitir que el servo se estabilice }// 3. Ayudante: convierte el ángulo (0-180) en ancho de pulso en microsegundosint angleToPulse(int ángulo) { // Mapeo lineal: ángulo 0 -> 1000us, ángulo 180 -> 2000us return PULSE_MIN_US + (ángulo(PULSE_MAX_US - PULSE_MIN_US) / 180); }
La lógica principal que mueve el servo a un ángulo específico:
// Mueve el servo a un ángulo determinado (0 a 180) y mantén esa posiciónvoid setServoAngle(int ángulo) { // Sujeta el ángulo dentro del rango válido if (ángulo 180) ángulo = 180; int pulseWidthUs = ánguloToPulse(ángulo);// Genera un único ciclo de 20 ms con el pulso alto especificadogenerarPulse(SERVO_PIN, pulseWidthUs); // Alto para pulseWidthUs microsegundos de retrasoMicrosegundos(pulseWidthUs); escritura digital(SERVO_PIN,BAJO); retraso(20 - (pulseWidthUs / 1000.0)); // Resto del período de 20 ms }
![]()
Nota:ElgenerarPulse()la abstracción representa la manipulación directa del registro de hardware. En implementaciones reales, se utilizaría el periférico PWM integrado del microcontrolador o un método de bit-banging de software.
A continuación se muestra un programa completo que barre el servo de 0° a 180° y viceversa, con retrasos para observar el movimiento. Este ejemplo utiliza un enfoque común de bit-banging que funciona en cualquier pin digital.
// Código de trabajo completo (no se requiere biblioteca, independiente de la plataforma) int servoPin = 9; micros anteriores largos sin firmar = 0; int ánguloactual = 0; int direcciónpaso = 1; // 1 = ángulo creciente, -1 = disminución de vacío setup() { pinMode(servoPin, SALIDA); // Comienza en 90° (centro) currentAngle = 90; } bucle vacío() { micros actuales largos sin firmar = micros(); // Actualiza la posición del servo cada 20 ms (50 Hz) if (currentMicros - anteriorMicros >= 20000) { anteriorMicros = currentMicros; // Envía el pulso PWM para el ángulo actual int pulseWidth = 1000 + (currentAngle 1000/180); // 1000us a 2000us digitalWrite(servoPin, ALTO); retrasoMicrosegundos(ancho de pulso); escritura digital (servoPin, BAJO); // Cambiar ángulo para efecto de barrido (opcional) currentAngle += stepDirection; if (ánguloactual >= 180) {ánguloactual = 180; dirección de paso = -1; retraso(500); // Pausa en el extremo } else if (currentAngle
Ejemplo de caso común:Un usuario escribe código que envía pulsos cada 5 ms en lugar de 20 ms. El servo recibe señales demasiado rápido, se sobrecalienta y vibra. La solución es garantizar exactamente 20 ms entre el inicio de cada pulso.
Para proyectos que necesitan realizar múltiples tareas (por ejemplo, leer sensores mientras se mueve el servo), use una máquina de estado sindemora():
lastPulseTime largo sin firmar = 0; int ángulodestino = 90; int currentPulseWidth = 1500; // comienza en el centro void updateServoNonBlocking() { unsigned long now = micros(); if (ahora - lastPulseTime >= 20000) { // 20 ms transcurridos lastPulseTime = ahora; // Calcular el ancho del pulso objetivo a partir de targetAngle int targetPulse = 1000 + (targetAngle * 1000/180); // Muévete gradualmente al objetivo (movimiento más suave) if (currentPulseWidth targetPulse) currentPulseWidth--; escritura digital (servoPin, ALTA); retrasoMicrosegundos(currentPulseWidth); escritura digital (servoPin, BAJO); } }
LlamaractualizarServoNonBlocking()repetidamente en su bucle principal.
1. La posición del servo depende exclusivamente del ancho de pulso alto.– 1,0 ms (0°), 1,5 ms (90°), 2,0 ms (180°). Nada más cambia el ángulo.
2. El pulso debe repetirse cada 20 ms (50 Hz)– Cualquier desviación provoca fluctuaciones, sobrecalentamiento o ausencia de movimiento.
Comience con un programa de prueba mínimoeso solo ajusta el servo a 90° y lo mantiene. Verifique con un transportador que la bocina esté en el centro. Esto confirma que su sincronización es correcta antes de agregar barridos o lógica de sensor.
Utilice un analizador lógico u osciloscopio.para medir la señal real en el pin de señal. Compare el ancho de pulso medido con los valores previstos de su código. Este es el método de depuración más confiable.
Utilice siempre una fuente de alimentación independientepara servos que consumen más de 200 mA. Compartir energía con el microcontrolador provoca reinicios y un comportamiento errático. Conecte todos los terrenos juntos.
Agregue un condensador electrolítico de 100-470 µFa través de los terminales de alimentación y tierra del servo cerca del servo. Esto reduce el ruido eléctrico y estabiliza la señal de control.
Documente las constantes de sincronización de su pulsoen microsegundos directamente en el código. Esto ayuda cuando vuelves a visitar el proyecto meses después.
Siguiendo esta guía, podrá escribir un programa de servocontrol confiable en cualquier plataforma de microcontrolador sin depender de bibliotecas prefabricadas. El principio básico de PWM sigue siendo idéntico en todos los sistemas. Implemente el ejemplo sin bloqueo para aplicaciones en tiempo real y valide siempre los anchos de pulso con herramientas de medición.
Hora de actualización: 2026-04-04
Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.