Controle de sinal PWM para servo motores: um guia de programação completo_Servo_Industry Insights_Kpower
Lar > Informações do setor >Servo
SUPORTE TÉCNICO

Suporte ao produto

Controle de sinal PWM para servomotores: um guia completo de programação

Publicado 2026-04-02

Este guia explica como controlar um padrãoservomotor usando sinais de modulação por largura de pulso (PWM). Você aprenderá os parâmetros PWM exatos (período, largura de pulso, ciclo de trabalho) necessários para definir umservopara qualquer ângulo de 0 a 180 graus. As instruções são baseadas em plataformas de microcontroladores amplamente disponíveis e foram verificadas com sistemas analógicos e digitais comuns de 50 Hz.servoé usado em robótica de hobby. Seguindo os exemplos de código passo a passo e os métodos de calibração, você pode posicionar um servo com segurança, sem oscilações ou desvios.

01Parâmetros PWM principais para controle servo

Um servo motor padrão espera um sinal PWM com as seguintes características fixas:

Período de sinal: 20 ms (milissegundos), o que equivale a uma frequência de50Hz.

Largura de pulso (tempo alto): varia entre1,0mse2,0ms.

Ciclo de trabalho= (largura de pulso / 20 ms) × 100%.

Ângulo servo desejado Largura de pulso Ciclo de trabalho (aprox.)
0° (mínimo) 1,0ms 5.0%
90° (neutro) 1,5ms 7.5%
180° (máximo) 2,0ms 10.0%

Nota: Alguns servos podem aceitar 0,5 ms a 2,5 ms para alcance estendido, mas o padrão 1,0–2,0 ms funciona para quase todos os servos comuns.

02Programando Saída PWM – Passo a Passo

A estrutura de código a seguir funciona em qualquer plataforma que forneça PWM de hardware (por exemplo, Arduino, STM32, ESP32, Raspberry Pi com PWM de hardware). Usamos pseudocódigo genérico para que você possa adaptá-lo ao seu microcontrolador específico.

2.1 Configure o periférico PWM

Escolha um pino compatível com PWM.

Defina a frequência PWM para50Hz(período = 20 ms).

Defina a resolução para pelo menos 8 bits (0–255) ou 16 bits para um controle mais preciso.

2.2 Converta o ângulo desejado em valor do ciclo de trabalho

Para um PWM de 8 bits (0 = 0% de serviço, 255 = 100% de serviço):

Ciclo de trabalho para 1,0 ms = (1,0 / 20,0) × 255 = 12,75 → arredondar para13

Ciclo de trabalho para 1,5 ms = (1,5 / 20,0) × 255 = 19,125 → arredondar para19

Ciclo de trabalho para 2,0 ms = (2,0 / 20,0) × 255 = 25,5 → arredondar para26

Fórmula geral para qualquer ângulo (0–180°):

largura_de_pulso_ms = 1,0 + (ângulo / 180,0)(2,0 - 1,0) valor_de_serviço = (largura_de_pulso_ms / 20,0)(2 ^ resolução - 1)

Exemplo para resolução de 8 bits e 45°:

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

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

valor_de_serviço = (1,25/20)255 = 15,9375 → número inteiro16

2.3 Escreva o valor de serviço no registro PWM

// Pseudocódigo pwm_set_frequency(PWM_PIN, 50); // 50Hz pwm_set_resolution(PWM_PIN, 8); // ângulo interno de 8 bits = 90; // ângulo alvo int duty = map(angle, 0, 180, 13, 26); // usando dever mínimo/máximo pré-calculado pwm_write(PWM_PIN, dever);

2.4 Calibração no mundo real (elimina jitter)

Como não existem dois servos exatamente idênticos, sempre meça os limites reais de largura de pulso:

1. Escreva um pulso de 1,0 ms – observe a posição do servo. Se não atingir a parada física, aumente a largura do pulso em passos de 0,05 ms até parar de se mover (grave comomeu_pulso).

2. Escreva um pulso de 2,0 ms – da mesma forma, encontre a largura máxima do pulso que fornece rotação completa (pulso_max).

3. Use esses valores medidos em seu código em vez dos 1,0/2,0 ms teóricos.

Caso comum: É necessário um micro servo Tower Pro SG90 típicopulso_min = 0,9 msepulso_máx = 2,1 mspara uma faixa real de 0–180°. Sempre calibre por modelo de servo.

03Código de exemplo completo (estilo Arduino, independente de hardware)

// Servo controle usando PWM – não são necessárias bibliotecas externas // Funciona em qualquer placa com hardware PWM (por exemplo, Uno, Nano, Mega, ESP32) const int servoPin = 9; // Pino PWM const int freq = 50; // resolução const int de 50 Hz = 8; // 8 bits (0-255) // Limites de pulso pré-calibrados (em microssegundos) const int minPulseUs = 1000; // 1,0 ms = 1000 µs const int maxPulseUs = 2000; // 2,0 ms = 2000 µs void setup() { // Configurar PWM ledcSetup(0, freq, resolução); // canal 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int angle) { // Restringir o ângulo para 0-180 angle = constrain(angle, 0, 180); // Converte ângulo em largura de pulso (microssegundos) int pulseUs = minPulseUs + (angle(maxPulseUs - minPulseUs)) / 180; // Converte a largura do pulso em ciclo de trabalho (0-255) int duty = (pulseUs255)/20.000; // 20.000 µs = período de 20 ms ledcWrite(0, duty); } void loop() { setServoAngle(0); // passa para 0° delay(1000); setServoAngle(90); // passa para 90° delay(1000); setServoAngle(180); // passa para 180° delay(1000); }

04Solução de problemas comuns do servo PWM

Problema Causa mais provável Solução
Servo não se move Frequência PWM errada (não 50 Hz) Defina a frequência para exatamente 50 Hz
Movimento espasmódico / espasmódico Fonte de alimentação insuficiente Use uma fonte de 5V separada (por exemplo, 4 pilhas AA ou regulador 5V/2A)
Ângulos imprecisos Os limites de pulso teóricos diferem dos servos reais Execute a calibração (etapa 2.4) e use pulsos medidos min/max
Servo zumbe, mas não gira Resolução do ciclo de trabalho muito baixa (Aumente a resolução PWM para 10 ou 12 bits
Move-se apenas entre 0° e 90° Período de sinal muito curto ou faixa de largura de pulso incompatível Verifique o período = 20 ms e se você envia pulsos entre 1,0–2,0 ms

05Recomendações práticas para servocontrole confiável

1. Sempre calibre cada servo individualmente– mesmo dois servos do mesmo modelo podem ter variação de ±0,1 ms. Escreva um esboço de teste simples que varra de 0,5 ms a 2,5 ms e observe as larguras exatas de pulso para 0° e 180°.

2. Use uma fonte de alimentação separada– nunca alimente um servo diretamente do pino 5V do seu microcontrolador (picos de corrente podem reiniciar a placa). Uma fonte regulada de 5V/2A ou 4 baterias NiMH (4,8V) funcionam de forma confiável.

3. Adicione um capacitor eletrolítico de 100–470 µFatravés dos terminais de potência do servo próximos ao servo. Isto absorve quedas de tensão causadas por partidas repentinas do motor.

4. Evite atrasos de softwareenquanto o servo está em movimento. Use temporização sem bloqueio (por exemplo, máquinas de estado baseadas em milis()) para que seu programa possa lidar com outras tarefas.

5. Para aplicações de alta precisão (por exemplo, braços robóticos), use um temporizador PWM de 16 bits e interpolação linear entre pontos calibrados. Considere também adicionar um potenciômetro de feedback analógico de 10 bits para fechar o circuito.

Conclusão principal: Controlar um servo com PWM é simples quando você fixa a frequência em 50 Hz e mapeia o ângulo para uma largura de pulso de 1,0–2,0 ms. No entanto, a confiabilidade no mundo real vem da calibração adequada, da potência adequada e do uso de limites medidos em vez de valores teóricos. Aplique o método de calibração descrito na seção 2.4 a cada novo servo que você integrar e seus projetos obterão sempre movimentos suaves e precisos.

Hora de atualização: 02/04/2026

Impulsionando o Futuro

Entre em contato com o especialista de produtos da Kpower para recomendar um motor ou caixa de engrenagens adequado para o seu produto.

Correio para Kpower
Enviar consulta
Mensagem do WhatsApp
+86 0769 8399 3238
 
kpowerMap