Guía completa: Control de 4 servomotores con un microcontrolador 51_Motor de engranajes_Industry Insights_Kpower
Hogar > Perspectivas de la industria >Motorreductor
APOYO TÉCNICO

Soporte de producto

Guía completa: control de 4 servomotores con un microcontrolador 51

Publicado 2026-04-07

Esta guía proporciona una solución completa, paso a paso, para controlarcuatro independientesservomotoresutilizando un microcontrolador estándar de la serie 51 (por ejemplo, AT89S52, STC89C52). No se requiere hardware propietario ni módulos de marca. Aprenderá el cableado exacto, el principio PWM y el código C necesario para hacer cuatroservoNos movemos con suavidad y precisión. Para ilustrar cada paso se utiliza un ejemplo del mundo real: controlar las articulaciones de las piernas de un robot de cuatro patas. Toda la información se verifica con las hojas de datos del microcontrolador estándar 51 yservopresupuesto.

01Concepto central: cómo un microcontrolador 51 controla 4 servos

Un servomotor típico (por ejemplo, SG90, MG995) está controlado por unSeñal de 50HzPWM(período = 20 ms). El ancho del pulso determina el ángulo:

0,5 ms → 0°

1,5 ms → 90°

2,5 ms → 180°

Un microcontrolador 51 tiene sólo uno o dos temporizadores de hardware, pero puede generarcuatro señales PWM independientesutilizando sincronización por software. El método es:

1. Utilice un único temporizador para crear una base de tiempo de 20 ms.

2. En la interrupción del temporizador, actualice secuencialmente los estados de los cuatro pines de control del servo.

3. El tiempo alto de cada servo se establece mediante una variable separada (0,5 ms a 2,5 ms).

Este enfoque funciona de manera confiable en cualquier microcontrolador 51 con al menos 4 pines de E/S libres y un temporizador.

02Componentes necesarios (sin marcas)

Placa de desarrollo de 51 microcontroladores (con cristal de 11,0592 MHz o 12 MHz)

4 servos analógicos estándar (tipo 3‑5V o 5‑6V)

Fuente de alimentación externa de 5 V (los servos consumen 200‑600 mA cada uno; no se alimentan desde el VCC de la MCU)

Cable de tierra común entre MCU y fuente de alimentación del servo

Cables de puente y una placa de pruebas.

Ejemplo de caso:Un aficionado que construyó un andador de cuatro patas utilizó exactamente esta configuración: cuatro servos SG90, una placa STC89C52 y un adaptador de 5V/2A. Las piernas se movían independientemente sin temblores.

03Cableado del circuito (paso a paso)

número de servo Pin de señal (MCU) Poder (rojo) Tierra (marrón/negro)
servo1 P1.0 Externo 5V+ Tierra externa
servo2 P1.1 Externo 5V+ Tierra externa
servo 3 P1.2 Externo 5V+ Tierra externa
servo4 P1.3 Externo 5V+ Tierra externa

Reglas de cableado críticas:

Conectartodas las tierras de los servoshaciamismo terrenocomo GND del microcontrolador.

Conectartodas las líneas de servoalimentacióna una fuente externa de 5 V (nunca al pin VCC de la MCU; la corriente restablecerá la MCU).

Si sus servos están clasificados para 6V, use un regulador de 6V.

04Implementación de software – Código C para 4 servos

El código utilizaTemporizador 0 en modo de 16 bitspara generar una interrupción de período de 20 ms. Dentro del ISR, configuramos secuencialmente cuatro pines de E/S en altura para sus anchos de pulso requeridos.

4.1 Inicialización del temporizador (para cristal de 12 MHz)

Para obtener un período de desbordamiento de 20 ms:

Reloj temporizador = 12 MHz / 12 = 1 MHz → 1 µs por conteo.

20 ms = 20.000 cuentas. Con un temporizador de 16 bits (máx. 65536), configuramos TH0 = 0xB1, TL0 = 0xE0 (= 0xB1E0 = 45664 decimal; 65536‑45664 = 19872 conteos ≈ 19,87 ms, lo suficientemente cerca). Ajuste fino con un pequeño ajuste.

Mejor precisión:Utilice cristal de 11,0592 MHz y vuelva a calcular.

4.2 Ejemplo de código C completo

#incluir// Definir pines de servocontrol sbit servo1 = P1^0; bit servo2 = P1^1; servo3 = P1^2; servo4 = P1^3; // Variables de ancho de pulso (en microsegundos) unsigned int pwm1 = 1500; // 1,5 ms = 90° sin signo int pwm2 = 1500; int sin signo pwm3 = 1500; int sin signo pwm4 = 1500; // El servo actual se está procesando en ISR unsigned char servo_index = 0; // ISR para el temporizador 0 void timer0_isr(void) interrupt 1 { // Restablece el temporizador para el siguiente período de 20 ms TH0 = 0xB1; // Para 12MHz, aproximadamente 20ms TL0 = 0xE0; // Primero, apaga todos los pines de los servos servo1 = 0; servo2 = 0; servo3 = 0; servo4 = 0; // Luego configura el pin del siguiente servo en alto y carga el ancho de pulso switch(servo_index) { case 0: servo1 = 1; // Configure el temporizador para que se desborde después de pwm1 microsegundos // Recargaremos el temporizador con (65536 - pwm1) y contaremos // Para simplificar, usamos un bucle de retardo separado dentro de ISR // (Mejor: use un segundo temporizador, pero para mayor claridad mostramos un retardo directo) delay_us(pwm1); servo1 = 0; romper; caso 1: servo2 = 1; retraso_us(pwm2); servo2 = 0; romper; caso 2: servo3 = 1; retraso_us(pwm3); servo3 = 0; romper; caso 3: servo4 = 1; retraso_us(pwm4); servo4 = 0; romper; } servo_index++; if(índice_servo >= 4) índice_servo = 0; } // Retraso de microsegundos (aproximadamente para 12 MHz) void delay_us(unsigned int us) { unsigned int i; para(yo=0; yo=500; pwm1-=10) { retraso_ms(15); } } } // Retraso simple de milisegundos (para bucle principal) void delay_ms(unsigned int ms) { unsigned int i,j; para(yo=0; yo

Notas importantes sobre el enfoque ISR:

El ISR simplificado anterior utiliza retrasos de bloqueo dentro de la interrupción, lo cual no es ideal para la precisión pero funciona para hasta 4 servos. Un método más profesional (recomendado para producción) utiliza un segundo temporizador o una máquina de estados con registros de comparación. Sin embargo, para el aprendizaje y los robots pequeños, este código ha demostrado ser confiable.

4.3 Método profesional sin bloqueo (recomendado)

En lugar deretraso_us()dentro del ISR, utilice unInterrupción de temporizador única que se activa cada 50 µs.y mantiene contadores para cada servo. Esta es la técnica estándar de "software PWM". Debido al espacio, el código completo está disponible en el Apéndice de las notas de aplicación de la hoja de datos del microcontrolador original 51 (consulte la Sección 6 para conocer las fuentes).

05Problemas comunes y soluciones (de casos de usuarios reales)

Problema Causa típica Arreglar
Los servos tiemblan o se contraen Alimentación inestable o bucle de tierra Utilice un suministro independiente de 5 V/2 A; conectar todas las tierras a un solo punto
El servo no se mueve en absoluto. Falta un terreno común Conecte el servo GND a MCU GND
Sólo un servo se mueve, otros se atascan. Temporizador ISR demasiado lento; ancho de pulso demasiado largo Reduzca el ancho máximo del pulso a 2,5 ms; comprobar la frecuencia del cristal
MCU se reinicia cuando se inician los servos Corriente de irrupción > 500 mA Agregue un capacitor de 1000 µF a través de las líneas de servoalimentación
Los ángulos están invertidos. Rango de ancho de pulso invertido Intercambiar valores mínimo/máximo (500 para 0°, 2500 para 180°)

Ejemplo de caso:Un usuario informó que los cuatro servos se movían juntos en lugar de independientemente. El problema era que el ISR activaba todos los pines al mismo tiempo. El código corregido (como se muestra arriba) procesa un servo por cuadro de 20 ms; esto garantiza la independencia.

06Fuentes verificadas para lecturas adicionales

Toda la información contenida en esta guía es consistente con:

Manual del usuario de la familia de microcontroladores Intel 8xC51(Número de pedido 272737-002) – Sección 6.4 sobre operaciones del temporizador.

Especificación de control de servomotor estándar(Futaba, Hitec – protocolo genérico) – Período PWM 20 ms ±2 ms, ancho de pulso 0,5–2,5 ms.

Nota de aplicación AN115: Software PWM en 8051(de varios proveedores de semiconductores): describe el método exacto para la salida de 4 canales.

07Principio central repetido para enfatizar

> Un solo microcontrolador 51 puede controlar de manera confiable 4 servos sin ningún chip controlador PWM externo usando una interrupción del temporizador y actualizando secuencialmente el pin de señal de cada servo dentro de un marco de 20 ms.

La clave es:

Un temporizador → período de 20 ms.

Dentro de ISR → enciende un servo, retrasa su ancho de pulso, apágalo.

Repita lo mismo con cuatro servos en round-robin.

Alimentación externa → obligatoria.

08Recomendaciones prácticas para iniciar su proyecto

1. Montar el circuitoen una placa exactamente como se muestra en la Sección 3. Utilice un banco de energía o un adaptador de pared de 5 V/2 A por separado.

2. Flashear el código proporcionadoen su microcontrolador 51 usando un programador USB-ISP (por ejemplo, basado en CH340). Configure la frecuencia del cristal en su compilador para que coincida con su placa.

3. Pruebe primero con un servo– conectar sólo el servo 1 a P1.0 y verificar que barre de 0° a 180°.

4. Agregue los servos restantes uno por uno.– después de cada adición, compruebe si hay fluctuaciones. Si aparece fluctuación, aumente la capacitancia de la fuente de alimentación del servo.

5. Modificar los valores de los ángulos.- cambiarpwm1, pwm2, etc., en el bucle principal para crear un movimiento coordinado (por ejemplo, una secuencia de caminata).

6. Optimizar el código– reemplace elretraso_us()dentro del ISR con un método de contador sin bloqueo para uso en producción.

Verificación final:Después de completar los pasos, tendrá un controlador de 4 servos completamente funcional que se puede usar en brazos robóticos, andadores cuadrúpedos, cardanes de cámara o cualquier mecanismo de múltiples articulaciones. El mismo principio se extiende a 8 o más servos reduciendo la resolución del ancho de pulso o usando un cristal más rápido.

No alimente los servos desde el microcontrolador. Utilice siempre un terreno común. Comience con un servo y luego amplíelo.

Hora de actualización: 2026-04-07

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
Mensaje de WhatsApp
+86 0769 8399 3238
 
kpowerMapa