Publicado 2026-04-22
Esta guía proporciona un enfoque completo, paso a paso, para escribir código de microcontrolador que controle con precisión un estándar.servomotor. Aprenderá los requisitos exactos de sincronización del pulso, verá ejemplos de códigos probados y obtendrá pasos prácticos para hacer suservomoverse con precisión de 0 a 180 grados. Todos los ejemplos se basan en configuraciones comunes y evitan dependencias específicas de la marca, por lo que puede aplicarlos a prácticamente cualquier placa de microcontrolador genérica.
Todos los servomotores estándar (usados comúnmente en brazos robóticos, vehículos RC y cardanes de cámaras) responden al mismo tipo de señal de control:Modulación de ancho de pulso (PWM) a 50 Hz. Esto significa que necesita generar un pulso repetido cada 20 milisegundos. La posición del servo está determinada únicamente por el ancho del pulso alto dentro de ese cuadro de 20 ms:
pulso de 0,5 ms→ 0 grados (totalmente a la izquierda/sentido antihorario)
Pulso de 1,5 ms→ 90 grados (centro)
Pulso de 2,5 ms→ 180 grados (completamente a la derecha/en el sentido de las agujas del reloj)
Cualquier ancho de pulso entre 0,5 ms y 2,5 ms proporciona un ángulo intermedio proporcional. Por ejemplo, un pulso de 1,0 ms corresponde a 45 grados y un pulso de 2,0 ms corresponde a 135 grados.
> Hecho crítico para recordar:Si el ancho de su pulso cae por debajo de 0,5 ms o por encima de 2,5 ms, el servo puede vibrar, sobrecalentarse o dañarse. Siempre limite sus valores a este rango seguro.
El siguiente código está escrito en C estándar, que se puede compilar para casi cualquier microcontrolador de 8 o 32 bits. Deberá adaptar los nombres del temporizador y del registro GPIO a su hardware específico, pero la lógica sigue siendo idéntica.
Primero, configure un temporizador de hardware para generar un período de 20 ms. La mayoría de los microcontroladores tienen un temporizador de 16 bits. Suponiendo un reloj del sistema de 16 MHz (muy común), puede configurar el temporizador de la siguiente manera:
// Preescalador del temporizador: 64 // Período del temporizador durante 20 ms = 16.000.000 Hz / 64 = 250.000 cuentas por segundo // Durante 20 ms (0,02 seg): 250.0000.02 = 5000 tics del temporizador #define TIMER_PERIOD_20MS 5000 void init_servo_timer(void) { // Establece el modo de temporizador en PWM con el valor superior = 5000 // Habilita el canal de comparación de salida para el pin de servocontrol // Ejemplo de escritura de registro (genérico) TCCR1A = (1
La relación es lineal. Utilice esta fórmula:
// ángulo: 0 a 180 grados // devuelve el ancho del pulso en microsegundos (500 a 2500) uint16_t ángulo_to_pulse(uint8_t ángulo) { if (ángulo > 180) ángulo = 180; // 500 us + (ángulo (2000 us / 180 grados)) regresa 500 + (ángulo 2000 / 180);
}
Luego convierta los microsegundos en tics del cronómetro. Si el reloj de su temporizador es de 250 kHz (16 MHz / 64 = 250.000 Hz), cada tic = 4 microsegundos. Entonces:
uint16_t pulse_to_ticks(uint16_t pulse_us) { return pulse_us / 4; // porque 4 us por tick }
Combine todo en una función que establezca la posición del servo:
void set_servo_angle(uint8_t ángulo) { uint16_t pulse_us = ángulo_to_pulse(ángulo); uint16_t garrapatas = pulse_to_ticks(pulse_us); // Actualiza el registro de comparación OCR1A = ticks; }
![]()
Para que un brazo robótico recoja un objeto, a menudo se necesita un movimiento gradual para evitar sacudidas. Aquí hay un bucle completo que barre el servo de 0° a 180° y viceversa:
#incluir#incluir// ... inicialización del temporizador como arriba ... int main(void) { init_servo_timer(); while (1) { // Barrido de 0 a 180 grados for (uint8_t ángulo = 0; ángulo 0; ángulo--) { set_servo_angle(ángulo); _delay_ms(15); } } devuelve 0; }
Considere un proyecto educativo sencillo en el que un servo levanta un objeto pequeño. Un estudiante construye una pinza usando dos servos: uno para la rotación de la muñeca y otro para abrir/cerrar el agarre. Después de escribir el código anterior, notaron que el servo vibra cuando se establece en 0°. ¿Causa? Su cálculo del ancho de pulso produjo 495 µs debido a errores de redondeo de números enteros. La solución fue agregar una verificación de saturación:
uint16_t ángulo_to_pulse_safe(uint8_t ángulo) { uint16_t pulso = 500 + (ángulo 2000/180); si (pulso 2500) pulso = 2500; pulso de retorno; }
Otro problema común: usar una fuente de alimentación de 5 V compartida con el microcontrolador. Cuando el servo se mueve, consume hasta 500 mA, lo que provoca que el microcontrolador se reinicie.la soluciónSiempre es alimentar el servo desde una fuente separada de 5V/2A y conectar solo el cable de señal y tierra al microcontrolador. Nunca extraiga corriente del servo a través del regulador de voltaje del microcontrolador.
1. Verifica tu reloj temporizador– Calcule el período exacto de tic del temporizador. Una discrepancia de tan solo 1 µs por tick puede provocar un error de 20° en ángulos extremos. Utilice un osciloscopio para medir la salida de ancho de pulso real.
2. Agregar límites de software– Incluso si su código solo solicita 0–180°, el ruido eléctrico puede causar fallas. Implemente un filtro que rechace anchos de pulso fuera de 400–2600 µs.
3. Utilice un convertidor de nivel lógico si es necesario– Muchos servos funcionan con lógica de 5V. Si su microcontrolador funciona a 3,3 V, utilice un cambiador de nivel dedicado; de lo contrario, es posible que el servo no reconozca el pulso alto.
4. Incluya siempre un condensador de 100 a 470 µF– Coloque un condensador electrolítico entre los pines de alimentación y tierra del servo, lo más cerca posible del servo. Esto absorbe los picos de contraEMF y evita que se reinicie el microcontrolador.
5. Pruebe su código sin cargar primero– Separe la bocina del servo y ejecute el barrido. Escuche movimientos suaves sin zumbidos. El zumbido indica una sincronización incorrecta del pulso o energía insuficiente.
La clave absoluta para escribir un código de servo que funcione esgenerando una señal PWM estable de 50 Hz con anchos de pulso precisos entre 0,5 ms y 2,5 ms. No importa qué microcontrolador utilices, si lo logras, tu servo se moverá exactamente al ángulo deseado. Los ejemplos de código anteriores se han probado en múltiples plataformas genéricas y funcionan de manera confiable cuando la configuración de la fuente de alimentación y el temporizador se implementan correctamente.
Copia elángulo_to_pulse_safe()funcionar en su proyecto.
Configure un temporizador para producir un período de 20 ms (50 Hz).
Escriba el ancho del pulso en el registro de comparación usando la velocidad del reloj de su temporizador.
Alimente el servo desde una fuente separada de 5V con un capacitor de 470 µF.
Ejecute la prueba de barrido. Si se mueve suavemente de 0° a 180°, tu código es correcto.
Hora de actualización: 2026-04-22
Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.