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.
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.
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.
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.
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.
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.
#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.
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).
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.
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.
> 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.
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
Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.