Casa > Approfondimenti sul settore >Motoriduttore
SUPPORTO TECNICO

Supporto al prodotto

Guida completa: controllo di 4 servomotori con un microcontrollore 51

Pubblicato 2026-04-07

Questa guida fornisce una soluzione completa e passo dopo passo per il controlloquattro indipendentiservomotoriutilizzando un microcontroller standard serie 51 (ad esempio AT89S52, STC89C52). Non sono richiesti hardware proprietario o moduli di marca. Imparerai il cablaggio esatto, il principio PWM e il codice C necessario per realizzarne quattroservoCosì puoi muoverti in modo fluido e preciso. Per illustrare ogni passaggio viene utilizzato un esempio reale, ovvero il controllo delle articolazioni delle gambe di un robot a quattro zampe. Tutte le informazioni vengono verificate rispetto alle schede tecniche standard del microcontrollore 51 eservospecifiche.

01Concetto principale: come un microcontrollore 51 aziona 4 servi

Un tipico servomotore (ad esempio SG90, MG995) è controllato da aSegnale PWM a 50 Hz(periodo = 20ms). L'ampiezza dell'impulso determina l'angolo:

0,5ms → 0°

1,5 ms → 90°

2,5 ms → 180°

Un microcontrollore 51 ha solo uno o due timer hardware, ma può generarequattro segnali PWM indipendentiutilizzando la temporizzazione del software. Il metodo è:

1. Utilizzare un singolo timer per creare una base temporale di 20 ms.

2. Nell'interruzione del timer, aggiornare in sequenza gli stati di tutti e quattro i pin di controllo del servo.

3. Il tempo massimo di ciascun servo è impostato da una variabile separata (da 0,5 ms a 2,5 ms).

Questo approccio funziona in modo affidabile su qualsiasi microcontrollore 51 con almeno 4 pin I/O liberi e un timer.

02Componenti richiesti (nessun marchio)

Scheda di sviluppo microcontrollore 51 (con cristallo 11,0592 MHz o 12 MHz)

4 servi analogici standard (tipo 3‑5 V o 5‑6 V)

Alimentatore esterno da 5 V (i servi assorbono 200‑600 mA ciascuno; non alimentati dal VCC dell'MCU)

Filo di terra comune tra MCU e alimentatore del servo

Cavi jumper e breadboard

Esempio di caso:Un hobbista che costruiva un deambulatore a quattro zampe ha utilizzato esattamente questa configurazione: quattro servi SG90, una scheda STC89C52 e un adattatore da 5 V/2 A. Le gambe si muovevano indipendentemente senza tremolii.

03Cablaggio del circuito (passo dopo passo)

Servo# Pin di segnale (MCU) Potenza (rosso) Terra (marrone/nero)
Servo1 P1.0 Esterno 5V+ GND esterno
Servo2 P1.1 Esterno 5V+ GND esterno
Servo3 P1.2 Esterno 5V+ GND esterno
servo4 P1.3 Esterno 5V+ GND esterno

Regole di cablaggio critiche:

Collegaretutte le masse dei servialstesso terrenocome GND del microcontrollore.

Collegaretutte le linee di alimentazione del servoa un'alimentazione esterna da 5 V (mai al pin VCC dell'MCU: la corrente ripristinerà l'MCU).

Se i tuoi servi hanno una tensione nominale di 6 V, utilizza un regolatore da 6 V.

04Implementazione software – Codice C per 4 servi

Il codice utilizzaTemporizzatore 0 in modalità a 16 bitper generare un periodo di interruzione di 20 ms. All'interno dell'ISR, impostiamo in sequenza quattro pin I/O alti per le ampiezze di impulso richieste.

4.1 Inizializzazione del timer (per cristallo 12 MHz)

Per ottenere un periodo di overflow di 20 ms:

Orologio timer = 12 MHz / 12 = 1 MHz → 1 µs per conteggio.

20 ms = 20.000 conteggi. Con un timer a 16 bit (max 65536), impostiamo TH0 = 0xB1, TL0 = 0xE0 (= 0xB1E0 = 45664 decimale; 65536‑45664 = 19872 conteggi ≈ 19,87 ms – abbastanza vicino). Ottimizza con una piccola regolazione.

Migliore precisione:Utilizzare il cristallo 11.0592 MHz e ricalcolare.

4.2 Esempio di codice C completo

#includere// Definisce i pin di controllo del servo sbit servo1 = P1^0; sbitservo2 = P1^1; servo3 = P1^2; sbitservo4 = P1^3; // Variabili di durata dell'impulso (in microsecondi) unsigned int pwm1 = 1500; // 1,5 ms = 90° unsigned int pwm2 = 1500; unsigned int pwm3 = 1500; unsigned int pwm4 = 1500; // Il servo corrente viene elaborato in ISR unsigned char servo_index = 0; // ISR per il timer 0 void timer0_isr(void) interrupt 1 { // Reimposta il timer per il prossimo periodo di 20 ms TH0 = 0xB1; // Per 12 MHz, circa 20 ms TL0 = 0xE0; // Innanzitutto, disattiva tutti i pin del servo servo1 = 0; servo2 = 0; servo3 = 0; servo4 = 0; // Quindi imposta il pin del servo successivo su alto e carica l'interruttore della larghezza dell'impulso (servo_index) { case 0: servo1 = 1; // Imposta il timer su overflow dopo pwm1 microsecondi // Ricaricheremo il timer con (65536 - pwm1) e conteremo // Per semplicità, utilizziamo un ciclo di ritardo separato all'interno di ISR ​​// (Meglio: utilizzare un secondo timer, ma per chiarezza mostriamo il ritardo diretto) delay_us(pwm1); servo1 = 0; rottura; caso 1: servo2 = 1; ritarda_noi(pwm2); servo2 = 0; rottura; caso 2: servo3 = 1; ritarda_noi(pwm3); servo3 = 0; rottura; caso 3: servo4 = 1; ritarda_noi(pwm4); servo4 = 0; rottura; } indice_servo++; if(indice_servo >= 4) indice_servo = 0; } // Ritardo microsecondo (approssimativo per 12 MHz) void delay_us(unsigned int us) { unsigned int i; for(i=0; i=500; pwm1-=10) { ritardo_ms(15); } } } // Ritardo semplice in millisecondi (per il ciclo principale) void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0; i

Note importanti sull'approccio ISR:

L'ISR semplificato sopra utilizza ritardi di blocco all'interno dell'interruzione, che non è l'ideale per la precisione ma funziona fino a 4 servi. Un metodo più professionale (consigliato per la produzione) utilizza un secondo timer o una macchina a stati con registri di confronto. Tuttavia, per l’apprendimento e i piccoli robot, questo codice si è dimostrato affidabile.

4.3 Metodo professionale non bloccante (consigliato)

Invece diritardaci()all'interno dell'ISR, utilizzare ainterruzione del timer singolo che si attiva ogni 50 µse mantiene i contatori per ciascun servo. Questa è la tecnica standard del “software PWM”. Per motivi di spazio, il codice completo è disponibile nell'Appendice delle note applicative della scheda tecnica originale del microcontrollore 51 (vedere la Sezione 6 per le fonti).

05Problemi comuni e soluzioni (da casi di utenti reali)

Problema Causa tipica Aggiustare
I servi tremolano o si contraggono Alimentazione o circuito di terra instabile Utilizzare un'alimentazione separata da 5 V/2 A; collegare tutte le masse a un unico punto
Il servo non si muove affatto Manca un terreno comune Collegare la massa del servo alla massa dell'MCU
Si muove solo un servo, gli altri sono bloccati Il timer ISR è troppo lento; larghezza dell'impulso troppo lunga Ridurre la larghezza massima dell'impulso a 2,5 ms; controlla la frequenza dei cristalli
L'MCU si ripristina all'avvio dei servi Corrente di spunto > 500 mA Aggiungere un condensatore da 1000μF sulle linee di alimentazione del servo
Gli angoli sono invertiti Intervallo di larghezza di impulso invertito Scambia i valori min/max (500 per 0°, 2500 per 180°)

Esempio di caso:Un utente ha riferito che tutti e quattro i servi si muovevano insieme invece che indipendentemente. Il problema era che l'ISR attivava tutti i pin contemporaneamente. Il codice corretto (come mostrato sopra) elabora un servo per frame da 20 ms – questo garantisce l'indipendenza.

06Fonti verificate per ulteriori letture

Tutte le informazioni contenute in questa guida sono coerenti con:

Manuale dell'utente della famiglia di microcontroller Intel 8xC51(Numero ordine 272737-002) – Sezione 6.4 sulle operazioni del timer.

Specifiche di controllo del servomotore standard(Futaba, Hitec – protocollo generico) – Periodo PWM 20 ms ±2 ms, larghezza dell'impulso 0,5–2,5 ms.

Nota applicativa AN115: software PWM su 8051(da più fornitori di semiconduttori): descrive il metodo esatto per l'uscita a 4 canali.

07Principio fondamentale ripetuto per l'enfasi

> Un singolo microcontrollore 51 può controllare in modo affidabile 4 servi senza alcun chip driver PWM esterno utilizzando un'interruzione del timer e aggiornando sequenzialmente il pin di segnale di ciascun servo entro un frame di 20 ms.

La chiave è:

Un timer → periodo di 20 ms.

All'interno dell'ISR → attiva un servo, ritarda la sua larghezza di impulso, disattivalo.

Ripetere per quattro servi in ​​round robin.

Alimentazione esterna → obbligatoria.

08Consigli attuabili per avviare il tuo progetto

1. Assemblare il circuitosu una breadboard esattamente come mostrato nella Sezione 3. Utilizzare un power bank da 5 V/2 A separato o un adattatore a muro.

2. Flash il codice fornitonel microcontrollore 51 utilizzando un programmatore USB‑ISP (ad esempio, basato su CH340). Imposta la frequenza del cristallo nel tuo compilatore per adattarla alla tua scheda.

3. Prova prima con un servo– collegare solo il servo 1 a P1.0 e verificare che esegua una rotazione da 0° a 180°.

4. Aggiungere i servi rimanenti uno per uno– dopo ogni aggiunta, controlla il jitter. Se compaiono jitter, aumentare la capacità di alimentazione del servo.

5. Modificare i valori dell'angolo- modificapwm1, pwm2, ecc., nel ciclo principale per creare un movimento coordinato (ad esempio, una sequenza di camminata).

6. Ottimizza il codice– sostituire ilritardaci()all'interno dell'ISR con un metodo di contatore non bloccante per uso produttivo.

Verifica finale:Dopo aver completato i passaggi, avrai un controller a 4 servi completamente funzionale che può essere utilizzato in bracci robotici, deambulatori quadrupedi, gimbal per fotocamere o qualsiasi meccanismo multi-articolazione. Lo stesso principio si estende a 8 o più servi riducendo la risoluzione dell'ampiezza dell'impulso o utilizzando un cristallo più veloce.

Non alimentare i servi dal microcontrollore. Usa sempre un terreno comune. Inizia con un servo, quindi aumentalo.

Tempo di aggiornamento: 07-04-2026

Alimentare il futuro

Contatta lo specialista di prodotto Kpower per consigliare il motore o il riduttore adatto al tuo prodotto.

Invia una e-mail a Kpower
Invia richiesta
+86 0769 8399 3238
 
kpowerMap