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.
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%.
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.
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.
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.
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°:
![]()
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
// 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);
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.
// 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); }
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
Entre em contato com o especialista de produtos da Kpower para recomendar um motor ou caixa de engrenagens adequado para o seu produto.