Publicado 2026-05-06
Você já se deparou com essa situação?
Após o servo ser conectado à fonte de alimentação, não há resposta. Depois de escrever o programa, ocorreram tremores aleatórios. Obviamente segui as instruções, mas simplesmente não consegui virar.
Não entrar em pânico. Você não está sozinho.
Neste artigo de hoje, com a ajuda do microcontrolador 51, explicaremos detalhadamente o controle do servo. Não há conteúdo matemático complicado, nenhuma tabela de registro incompreensível, apenas as ideias mais diretas e a estrutura de código mais prática.
Lembre-se deste ponto-chave: se o servo permanecer parado, é em grande parte devido a um problema de temporização; se o servo se mover aleatoriamente, provavelmente será causado por fonte de alimentação insuficiente.
Você está pronto?
01 O que exatamente é uma caixa de direção?
Muitas pessoas pegam um servo pela primeira vez e pensam que é um motor. Pode ser ligado quando a eletricidade estiver ligada.
Errado.
A caixa de direção não é um motor comum. É mais como um pequeno robô com um “cérebro”.
Você dá um comando e ele gira para o ângulo especificado. Então pare. Pare imediatamente.
Como isso é conseguido com o pequeno potenciômetro e a placa de controle interna? Quando você envia um pulso, ele faz alguns gestos e trava ao atingir a posição.
Portanto, para controlar a caixa de direção, não há necessidade de escrever PID ou realizar cálculos em malha fechada. Você só precisa aprender uma coisa: enviar um pulso.
02 Princípio fundamental: Um número pode mudar o ângulo
Abra sua planilha de dados. Encontre esta frase: A largura do pulso de alto nível corresponde ao ângulo.
Em termos simples: um nível alto de 0,5 milissegundos girará para 0 graus, se durar 1,5 milissegundos, girará 90 graus, e se durar 2,5 milissegundos, girará 180 graus.
O período é fixado em 20 milissegundos.
Está claro? Controlar o servo, na verdade, significa controlar uma porta IO, puxá-la para cima, esperar um período de tempo, depois puxá-la para baixo e depois esperar o tempo restante.
É tão simples.
Por exemplo, o pulso que gira 90 graus:
Primeiro, execute uma operação pull-up para cima, depois execute um atraso com duração de 1,5 milissegundos e, em seguida, execute uma operação pull-down para baixo e, em seguida, execute um atraso com duração de 18,5 milissegundos e, em seguida, repita as etapas acima em um loop infinito.
Este é um ciclo de controle completo.
03 Antes de escrever um programa, configure primeiro o ambiente
Você não precisa de equipamentos sofisticados.
Um microcontrolador 51 (STC89C52 é suficiente)

Um servo (SG90 ou MG995 comum serve)
Alguns fios Dupont
Há uma fonte de alimentação de 5 V, então não espere que ela seja alimentada por um microcontrolador. Deixe-me dizer três coisas importantes: não espere que seja alimentado por um microcontrolador.
Os servos de muitas pessoas tremem e não giram corretamente. Não é um erro de programa, mas sim energia insuficiente.
Quando o servo está no momento da inicialização, a corrente pode atingir mais de 1A, e a pequena quantidade de energia consumida pelo USB não consegue alimentá-lo totalmente.
o que fazer? Fonte de alimentação externa. Terreno comum. Terreno comum. Terreno comum.
O terminal positivo da fonte de alimentação deve ser VCC e o terminal negativo da fonte de alimentação deve ser GND. O GND do microcontrolador também deve ser conectado ao GND da fonte de alimentação e, em seguida, a linha de sinal precisa ser conectada à porta IO do microcontrolador.
O circuito está conectado? Parabéns. A metade mais difícil está concluída.
04 Codificação prática: comece do mais simples
Nós não jogamos falso. Forneça diretamente o código que pode ser executado.
Pontos principais: Use um temporizador para gerar uma interrupção com período de 20 ms e controle flexível a duração do nível alto durante a interrupção.。
Ideia:
Defina uma variável para armazenar o tempo de alto nível atualmente necessário, assim como aquele 15, e este 15 representa 1.500 microssegundos, que é 1,5 ms。
No início de cada período de 20 ms, primeiro puxe a porta IO para cima.
Atrasar o tempo de alto nível.
Abaixe a porta IO.
Atrase o tempo restante.
Escrito como pseudocódigo:
void main() {Temporizador de inicialização (definir interrupção de 20ms); while(1) { // Não faça nada, confie em interrupções } } void timer interrupção () interrupção 1 { Puxar para cima; atraso (tempo de alto nível); puxe para baixo; atraso (20ms - tempo de alto nível); }
Importante: Atrasos precisos em nível de microssegundos exigem o uso de funções de atraso. Quando a frequência principal do microcontrolador 51 é 11,0592 MHz, um nop equivale aproximadamente a 1,085 microssegundos. Para escrever uma função delay_us, a função precisa passar o número de microssegundos e implementá-lo subtraindo-o por meio de um loop while.
Não tenha medo de problemas. Esse tipo de depuração por aproximação sucessiva é a norma em sistemas embarcados.
05 Deixe o leme se mover: para frente, para trás, em qualquer ângulo
Agora você precisa conseguir: pressione o botão 1, gire para 0 graus; pressione o botão 2, gire 90 graus; pressione o botão 3, gire para 180 graus.
Adicione detecção de chave no pseudocódigo:
se (botão 1 for pressionado) tempo de alto nível = 500; // 0,5ms -> 0 graus se (botão 2 for pressionado) tempo de alto nível = 1500; // 1,5ms -> 90 graus se (botão 3 for pressionado) tempo de alto nível = 2500; // 2,5ms -> 180 graus

Importante: A unidade de tempo de alto nível é microssegundos. 500, 1.500, 2.500.
Não escreva 1, 2, 3. São milissegundos. 1000 vezes pior.
Então o que? Então o servo girará obedientemente para o ângulo correspondente.
Não acredite? Você tenta.
06 armadilhas que você pode ter pisado (Perguntas/Respostas)
P: O servo não gira, apenas vibra?
Primeiro, A, há corrente de alimentação insuficiente ou a largura do pulso é imprecisa. É necessário trocar a fonte de alimentação para uma fonte acima de 5V/2A, e então verificar se o tempo de alto nível está entre 500 e 2500us.
P: O servo pode girar, mas treme muito?
Adicione um capacitor grande (valor 470uF) em ambas as extremidades da fonte de alimentação do servo devido à situação mencionada em A, ou seja, há uma diferença excessiva entre dois ciclos de controle adjacentes ou a fonte de alimentação apresenta ondulações.
P: Não há resposta quando o programa é gravado, mas ele se desvia quando o cabo de sinal é desconectado?
R: O estado de nível da porta IO no início é incerto ou o período de tempo em que está em nível alto excede o intervalo especificado. Ao ligar o dispositivo, você deve primeiro reduzir o nível da porta IO e, em seguida, fornecer o valor inicial.。
P: Quer controlar a rotação contínua (como servo de 360 graus)?
Se isso não funcionar, você precisará substituí-lo por um servo que possa girar continuamente 360 graus. Se o nível alto for 1,5 ms, o servo irá parar de girar. Se for superior a 1,5 ms, o servo girará para frente. Se for inferior a 1,5 ms, o servo girará inversamente.
P: Se eu não tiver um osciloscópio em mãos, como posso confirmar se os pulsos estão corretos?
Programe o servo para alternar entre 0 graus e 90 graus a cada 1 segundo. Use um analisador lógico ou um método simples de LED para observar se sua oscilação é regular.
07 Upgrade: Deixe o servo se mover de acordo com a curva que você desenhou
Um programa com ângulos codificados é muito elementar.
Uma maneira mais avançada de jogar: deixe o servo ir lentamente de 0 graus a 180 graus e depois voltar lentamente.
Como fazer isso?
Use uma variável de loop chamada ângulo para aumentar de 0 a 180, e o valor do passo não deve ser muito grande. Por exemplo, aumente 1 grau de cada vez.。
Para cada incremento de 1 grau, recalcule o tempo de nível alto:
O tempo de alto nível é igual a 500 mais o ângulo multiplicado por 2.000 dividido por 180.
Deve-se notar que 500 corresponde a 0 graus, 2.500 corresponde a 180 graus e o intervalo total é de 2.000 microssegundos, que é dividido em 180 partes iguais.
Então atrase 20ms. Faça de novo.
O efeito é um balanço suave. Como um robô acenando.
Você pode chamar isso de "servo cinemática", mas não se assuste com o nome. Em essência, é uma espécie de interpolação linear.
08 Dê um passo além: use a porta serial para controlar remotamente o servo
Adicione comunicação serial. O computador envia um número e o servo gira para o ângulo correspondente.
Por exemplo, pronuncie "0" e gire 0 graus. Diga "90" e gire 90 graus.
Pontos principais:
Na porta serial do microcontrolador recebendo interrupção, a string é analisada.
Observação: talvez você não consiga coletar tudo de uma vez. Para determinar se um caractere de nova linha será recebido.
Depois de receber o número completo, o intervalo é limitado a 0~180.
Converta para tempo de alto nível e atualize a variável.
Desta forma, o seu servo se torna um atuador programável. Depois de conectar ao módulo Bluetooth, até o seu celular pode controlá-lo.
09 Resumo: Três elementos para controlar a caixa de direção
fonte de energia. Forneça corrente suficiente e estabilize a tensão no aterramento comum.
Tempo. Período 20ms, alto nível 500-2500us.
Não execute operações de bloqueio, use interrupções de temporizador em vez de atrasos que ficam esperando, caso contrário você não conseguirá fazer nada.
Depois de dominar essas três coisas, você poderá controlar 99% dos servos do mercado.
Lembre-se: ao escrever um programa, pense mais um passo sobre "o que acontecerá se a fonte de alimentação falhar repentinamente" em vez de "é o suficiente para o programa funcionar sem problemas".
10 Agora é sua vez de agir
Não considere este artigo apenas como uma coleção. Ligue o Keil, conecte a placa de desenvolvimento corretamente e digite o código acima uma vez.
Há uma grande probabilidade de que as três primeiras vezes não girem. Não tenha pressa. Pegue um multímetro para medir a tensão e use um analisador lógico para capturar a forma de onda. Se realmente não houver outra maneira, tente trocar o servo.
Cada vez que você resolve um problema, sua compreensão da integração se aprofunda.
Olhando para trás, alguns anos depois, você descobrirá que o dia em que dominou o mecanismo de direção foi o ponto de partida para você realmente entender “controlar o mundo físico por meio de código”.。
O pequeno servo vibrante em sua mão é a primeira chave para o mundo dos robôs.
Não espere mais. Ligue agora.
Experimente.
Hora de atualização: 06/05/2026
Entre em contato com o especialista de produtos da Kpower para recomendar um motor ou caixa de engrenagens adequado para o seu produto.