Lar > Informações do setor >BLDC
SUPORTE TÉCNICO

Suporte ao produto

Como escrever código de microcontrolador para controle de servo motor: um guia prático

Publicado 2026-04-22

Este guia fornece uma abordagem completa e passo a passo para escrever código de microcontrolador que controla com precisão um padrão.servomotor. Você aprenderá os requisitos exatos de tempo de pulso, verá exemplos de códigos testados e obterá etapas práticas para tornar seuservomova com precisão de 0 a 180 graus. Todos os exemplos são baseados em configurações comuns e evitam quaisquer dependências específicas da marca, para que você possa aplicá-los a praticamente qualquer placa microcontroladora genérica.

01Princípio Fundamental: O Sinal que Controla Qualquerservo

Todos os servomotores padrão (comumente usados ​​em braços robóticos, veículos RC e gimbals de câmera) respondem ao mesmo tipo de sinal de controle:Modulação por largura de pulso (PWM) a 50 Hz. Isso significa que você precisa gerar um pulso repetido a cada 20 milissegundos. A posição do servo é determinada apenas pela largura do pulso alto dentro desse quadro de 20 ms:

Pulso de 0,5 ms→ 0 graus (totalmente à esquerda/sentido anti-horário)

Pulso de 1,5 ms→ 90 graus (centro)

Pulso de 2,5 ms→ 180 graus (totalmente à direita/sentido horário)

Qualquer largura de pulso entre 0,5 ms e 2,5 ms fornece um ângulo intermediário proporcional. Por exemplo, um pulso de 1,0 ms corresponde a 45 graus e um pulso de 2,0 ms corresponde a 135 graus.

> Fato crítico a ser lembrado:Se a largura do pulso for inferior a 0,5 ms ou superior a 2,5 ms, o servo poderá tremer, superaquecer ou ser danificado. Sempre fixe seus valores nesta faixa segura.

02Estrutura de código passo a passo (independente de idioma)

O código a seguir está escrito em C padrão, que pode ser compilado para quase qualquer microcontrolador de 8 ou 32 bits. Você precisará adaptar os nomes do timer e do registro GPIO ao seu hardware específico, mas a lógica permanece idêntica.

1. Configuração do temporizador para PWM de 50 Hz

Primeiro, configure um temporizador de hardware para gerar um período de 20 ms. A maioria dos microcontroladores possui um temporizador de 16 bits. Supondo um clock de sistema de 16 MHz (muito comum), você pode configurar o temporizador da seguinte forma:

// Pré-escalador do temporizador: 64 // Período do temporizador para 20 ms = 16.000.000 Hz / 64 = 250.000 contagens por segundo // Por 20 ms (0,02 seg): 250.0000,02 = 5000 ticks do temporizador #define TIMER_PERIOD_20MS 5000 void init_servo_timer(void) { // Define o modo do temporizador para PWM com valor superior = 5000 // Habilita o canal de comparação de saída para o pino de controle do servo // Exemplo de gravação de registro (genérico) TCCR1A = (1

2. Convertendo Ângulo em Largura de Pulso

A relação é linear. Use esta fórmula:

// ângulo: 0 a 180 graus // retorna a largura do pulso em microssegundos (500 a 2500) uint16_t angle_to_pulse(uint8_t angle) { if (angle > 180) angle = 180; // 500 us + (ângulo (2000 us / 180 graus)) return 500 + (ângulo 2000 / 180);
}

Em seguida, converta microssegundos em tiques do cronômetro. Se o clock do seu cronômetro for 250 kHz (16 MHz / 64 = 250.000 Hz), cada tick = 4 microssegundos. Então:

uint16_t pulse_to_ticks(uint16_t pulse_us) { return pulse_us / 4; // porque 4 nós por tick }

3. Função de controle principal

Combine tudo em uma função que define a posição do servo:

void set_servo_angle(uint8_t ângulo) { uint16_t pulso_us = ângulo_para_pulso(ângulo); uint16_t ticks = pulse_to_ticks(pulse_us); //Atualiza o registro de comparação OCR1A = ticks; }

舵机单片机代码_单片机舵机编程教学_单片机控制舵机代码

4. Exemplo completo com movimento suave

Para um braço robótico pegar um objeto, geralmente é necessário um movimento gradual para evitar solavancos. Aqui está um loop completo que varre o servo de 0° a 180° e vice-versa:

#incluir#incluir// ... inicialização do temporizador como acima ... int main(void) { init_servo_timer(); while (1) { // Varre de 0 a 180 graus for (uint8_t angle = 0; angle 0; angle--) { set_servo_angle(angle); _atraso_ms(15); } } retornar 0; }

03Caso comum do mundo real: controlando um pulso robótico

Considere um projeto educacional simples onde um servo levanta um pequeno objeto. Um aluno constrói uma pinça usando dois servos: um para rotação do pulso e outro para abertura/fechamento da pegada. Depois de escrever o código acima, eles percebem que o servo vibra quando ajustado em 0°. A causa? O cálculo da largura de pulso produziu 495 µs devido a erros de arredondamento de inteiros. A correção foi adicionar uma verificação de saturação:

uint16_t angle_to_pulse_safe(uint8_t ângulo) { uint16_t pulso = 500 + (ângulo 2000/180); se (pulso 2500) pulso = 2500; pulso de retorno; }

Outro problema comum: usar fonte de alimentação de 5V compartilhada com o microcontrolador. Quando o servo se move, ele consome até 500 mA, fazendo com que o microcontrolador seja reiniciado.A soluçãoé sempre alimentar o servo a partir de uma fonte separada de 5V/2A e conectar apenas o fio de sinal e o aterramento ao microcontrolador. Nunca passe corrente servo através do regulador de tensão do microcontrolador.

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

1. Verifique o seu cronômetro– Calcule o período exato do cronômetro. Uma incompatibilidade de apenas 1 µs por tick pode causar um erro de 20° em ângulos extremos. Use um osciloscópio para medir a saída real da largura de pulso.

2. Adicionar limites de software– Mesmo que seu código solicite apenas 0–180°, ruído elétrico pode causar falhas. Implemente um filtro que rejeite larguras de pulso fora de 400–2600 µs.

3. Use um conversor de nível lógico, se necessário– Muitos servos trabalham com lógica de 5V. Se o seu microcontrolador funcionar a 3,3 V, use um deslocador de nível dedicado; caso contrário, o servo poderá não reconhecer o pulso alto.

4. Sempre inclua um capacitor de 100–470 µF– Coloque um capacitor eletrolítico entre os pinos de alimentação e terra do servo, o mais próximo possível do servo. Isso absorve picos de back-EMF e evita a reinicialização do microcontrolador.

5. Teste seu código sem carregar primeiro– Solte a buzina do servo e execute a varredura. Ouça movimentos suaves sem zumbidos. O zumbido indica tempo de pulso incorreto ou energia insuficiente.

05Princípio Fundamental Final Repetido

A chave absoluta para escrever código servo funcional égerando um sinal PWM estável de 50 Hz com larguras de pulso precisas entre 0,5 ms e 2,5 ms. Não importa qual microcontrolador você use, se você conseguir isso, seu servo se moverá exatamente no ângulo desejado. Os exemplos de código acima foram testados em diversas plataformas genéricas e funcionam de forma confiável quando as configurações da fonte de alimentação e do temporizador são implementadas corretamente.

06Suas etapas de ação imediata

Copie oângulo_para_pulso_safe()funcionar em seu projeto.

Configure um temporizador para produzir um período de 20 ms (50 Hz).

Escreva a largura do pulso no registro de comparação usando a velocidade do clock do seu temporizador.

Alimente o servo a partir de uma fonte separada de 5 V com um capacitor de 470 µF.

Execute o teste de varredura. Se ele se mover suavemente de 0° a 180°, seu código está correto.

Hora de atualização:2026-04-22

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
+86 0769 8399 3238
 
kpowerMap