Casa > Approfondimenti sul settore >Servo
SUPPORTO TECNICO

Supporto al prodotto

Controllo del segnale PWM per servomotori: una guida completa alla programmazione

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.

01Parametri PWM principali per il servocontrollo

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%.

Angolo del servo desiderato Larghezza dell'impulso Ciclo di lavoro (circa)
0° (minimo) 1,0 ms 5.0%
90° (neutro) 1,5 ms 7.5%
180° (massimo) 2,0 ms 10.0%

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.

02Programmazione dell'uscita PWM – Passo dopo passo

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.

2.1 Configurare la periferica PWM

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.

2.2 Convertire l'angolo desiderato nel valore del ciclo di lavoro

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°:

舵机pwm控制源码_pwm控制舵机程序_pwm波控制舵机转动程序

larghezza_impulso_ms = 1,0 + (45/180)1,0 = 1,25 ms

duty_value = (1,25/20)255 = 15,9375 → intero16

2.3 Scrivere il valore del duty nel registro PWM

// 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);

2.4 Calibrazione nel mondo reale (elimina il jitter)

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.

03Codice di esempio completo (stile Arduino, indipendente dall'hardware)

// 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); }

04Risoluzione dei problemi comuni del servo PWM

Problema Causa più probabile Soluzione
Il servo non si muove Frequenza PWM errata (non 50 Hz) Impostare la frequenza esattamente su 50 Hz
Movimento a scatti/spasmo Alimentazione insufficiente Utilizzare un'alimentazione separata da 5 V (ad esempio, 4 batterie AA o un regolatore da 5 V/2 A)
Angoli imprecisi I limiti teorici degli impulsi differiscono da quelli effettivi del servo Eseguire la calibrazione (passaggio 2.4) e utilizzare gli impulsi min/max misurati
Il servo ronza ma non gira Risoluzione del ciclo di lavoro troppo bassa (Aumenta la risoluzione PWM a 10 bit o 12 bit
Si sposta solo tra 0° e 90° Periodo del segnale troppo breve o intervallo di larghezza dell'impulso non corrispondente Verificare che il periodo sia = 20 ms e che si inviino impulsi compresi tra 1,0 e 2,0 ms

05Raccomandazioni attuabili per un servocontrollo affidabile

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

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