Pubblicato 2026-04-02
Questa guida spiega come controllare uno standardservomotore utilizzando segnali di modulazione di larghezza di impulso (PWM). Imparerai gli esatti parametri PWM (periodo, larghezza dell'impulso, ciclo di lavoro) necessari per impostare aservoa qualsiasi angolo compreso tra 0 e 180 gradi. Le istruzioni si basano su piattaforme di microcontroller ampiamente disponibili e sono state verificate con i comuni canali analogici e digitali a 50 HzservoViene utilizzato nella robotica amatoriale. Seguendo passo dopo passo gli esempi di codici e i metodi di calibrazione, è possibile posizionare in modo affidabile un servo senza jitter o deriva.
Un servomotore standard prevede un segnale PWM con le seguenti caratteristiche fisse:
Periodo del segnale: 20 ms (millisecondi), che equivale a una frequenza di50 Hz.
Ampiezza dell'impulso (tempo elevato): varia tra1,0 msE2,0 ms.
Ciclo di lavoro= (larghezza dell'impulso / 20 ms) × 100%.
Nota: alcuni servi possono accettare da 0,5 ms a 2,5 ms per un intervallo esteso, ma lo standard 1,0–2,0 ms funziona per quasi tutti i servi comuni.
La seguente struttura di codice funziona su qualsiasi piattaforma che fornisce PWM hardware (ad esempio Arduino, STM32, ESP32, Raspberry Pi con PWM hardware). Utilizziamo uno pseudocodice generico in modo che tu possa adattarlo al tuo microcontrollore specifico.
Scegli un pin compatibile con PWM.
Imposta la frequenza PWM su50 Hz(periodo = 20 ms).
Imposta la risoluzione su almeno 8 bit (0–255) o 16 bit per un controllo più preciso.
Per un PWM a 8 bit (0 = servizio 0%, 255 = servizio 100%):
Ciclo di lavoro per 1,0 ms = (1,0 / 20,0) × 255 = 12,75 → arrotondato a13
Ciclo di lavoro per 1,5 ms = (1,5 / 20,0) × 255 = 19,125 → arrotondato a19
Ciclo di lavoro per 2,0 ms = (2,0 / 20,0) × 255 = 25,5 → arrotondato a26
Formula generale per qualsiasi angolo (0–180°):
larghezza_impulso_ms = 1,0 + (angolo / 180,0)(2,0 - 1,0) duty_value = (impulso_larghezza_ms / 20,0)(2^risoluzione - 1)
Esempio per risoluzione a 8 bit e 45°:
![]()
larghezza_impulso_ms = 1,0 + (45/180)1,0 = 1,25 ms
duty_value = (1,25/20)255 = 15,9375 → intero16
// Pseudocodice pwm_set_frequency(PWM_PIN, 50); // 50 Hz pwm_set_solving(PWM_PIN, 8); // angolo int a 8 bit = 90; // angolo target int duty = map(angolo, 0, 180, 13, 26); // utilizzando il duty minimo/massimo precalcolato pwm_write(PWM_PIN, duty);
Poiché non esistono due servi esattamente identici, misurare sempre i limiti effettivi dell'ampiezza dell'impulso:
1. Scrivere un impulso da 1,0 ms – osservare la posizione del servo. Se non raggiunge l'arresto fisico, aumentare l'ampiezza dell'impulso in passi di 0,05 ms finché non smette di muoversi (registrare comeil mio_impulso).
2. Scrivere un impulso di 2,0 ms – allo stesso modo trovare la larghezza massima dell'impulso che dà una rotazione completa (max_pulse).
3. Utilizzare questi valori misurati nel codice anziché i 1,0/2,0 ms teorici.
Caso comune: È richiesto un tipico micro servo Tower Pro SG90impulso_min = 0,9 msEimpulso_max = 2,1 msper un intervallo effettivo da 0 a 180°. Calibrare sempre in base al modello di servo.
// Servocontrollo tramite PWM: non sono richieste librerie esterne // Funziona su qualsiasi scheda con hardware PWM (ad esempio Uno, Nano, Mega, ESP32) const int servoPin = 9; // Pin PWM const int freq = 50; // Risoluzione int costante 50 Hz = 8; // 8 bit (0-255) // Limiti di impulso precalibrati (in microsecondi) const int minPulseUs = 1000; // 1,0 ms = 1000 µs const int maxPulseUs = 2000; // 2,0 ms = 2000 µs void setup() { // Configura PWM ledcSetup(0, freq, risoluzione); // canale 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int angolo) { // Vincola l'angolo a 0-180 angolo = vincola(angolo, 0, 180); // Converte l'angolo nella durata dell'impulso (microsecondi) int pulsaUs = minPulseUs + (angolo(maxPulseUs - minPulseUs)) / 180; // Converte la larghezza dell'impulso in duty cycle (0-255) int duty = (pulseUs255)/20000; // 20000 µs = periodo di 20 ms ledcWrite(0, duty); } void loop() { setServoAngle(0); // passa al ritardo 0°(1000); impostaAngolo Servo(90); // passa al ritardo di 90°(1000); impostaAngolo Servo(180); // passa al ritardo di 180°(1000); }
1. Calibrare sempre ciascun servo individualmente– anche due servi dello stesso modello possono avere una variazione di ±0,1 ms. Scrivere un semplice schizzo di prova che spazia da 0,5 ms a 2,5 ms e annotare le esatte ampiezze dell'impulso per 0° e 180°.
2. Utilizzare un alimentatore separato– non alimentare mai un servo direttamente dal pin 5V del microcontrollore (i picchi di corrente possono resettare la scheda). Un'alimentazione regolata da 5 V/2 A o 4 batterie NiMH (4,8 V) funzionano in modo affidabile.
3. Aggiungi un condensatore elettrolitico da 100–470 µFattraverso i terminali di alimentazione del servo vicino al servo. Questo assorbe i cali di tensione causati da avviamenti improvvisi del motore.
4. Evita ritardi del softwarementre il servo è in movimento. Utilizza tempistiche non bloccanti (ad esempio, macchine a stati basate su millis()) in modo che il tuo programma possa gestire altre attività.
5. Per applicazioni ad alta precisione (ad esempio bracci robotici), utilizzare un timer PWM a 16 bit e un'interpolazione lineare tra punti calibrati. Considera anche l'aggiunta di un potenziometro di feedback analogico a 10 bit per chiudere il loop.
Da asporto fondamentale: Controllare un servo con PWM è semplice una volta fissata la frequenza a 50 Hz e mappato l'angolo su una larghezza di impulso di 1,0–2,0 ms. Tuttavia, l’affidabilità nel mondo reale deriva da una calibrazione corretta, da una potenza adeguata e dall’utilizzo di limiti misurati anziché di valori teorici. Applica il metodo di calibrazione descritto nella sezione 2.4 a ogni nuovo servo che integri e i tuoi progetti otterranno ogni volta un movimento fluido e preciso.
Tempo di aggiornamento: 2026-04-02
Contatta lo specialista di prodotto Kpower per consigliare il motore o il riduttore adatto al tuo prodotto.