Publicado 2026-03-29
Ao se envolver na inovação de produtos, o maior medo é que, se o chip de controle principal for substituído, o chip originalmente bem ajustadoservoirá parar de girar. Muitos amigos adquiriram uma nova placa de desenvolvimento STM32 e queriam mudar aservoprograma originalmente usado em outras placas, mas descobriu que não respondia ou tremia violentamente. Na verdade, desde que você esclareça alguns pontos-chave do transplante, não será nada complicado. Hoje falaremos sobre como "mover" suavemente oservoprograma entre diferentes modelos STM32.
O núcleo do servocontrole é gerar uma onda PWM com um período de cerca de 20ms e um tempo de alto nível variando de 0,5ms a 2,5ms. Portanto, o primeiro passo na migração do código é encontrar os temporizadores e canais na nova placa que possam gerar PWM. Seu programa original usava CH1 do TIM2, mas agora pode ser necessário alterá-lo para CH2 do TIM3. Esta correspondência deve ser confirmada claramente na ficha técnica do chip. A mudança é, na verdade, apenas uma questão de alguns parâmetros. Depois que o número do temporizador e o número do canal forem alterados, a maior parte do código poderá ser usada.
Após alterar a configuração do temporizador, não se esqueça de verificar a frequência do clock. Diferentes modelos de STM32 podem ter diferentes fontes de relógio para o relógio e temporizador do sistema. Por exemplo, a frequência principal original de 72 MHz usada na série F1 pode se tornar 48 MHz quando mudada para a série F0. Neste momento, você precisa recalcular o coeficiente de divisão de frequência PWM e recarregar o valor para garantir que o período PWM de saída final ainda seja de 20 ms. Simplificando, os dois parâmetros ARR e PSC são recalculados com base no clock do novo chip para garantir que o servo possa receber os sinais que reconhece.
Ao selecionar os pinos, não basta encontrar um GPIO e conectá-lo. Você deve primeiro procurar os pinos com a função "", que são pinos de saída PWM de hardware. A vantagem de usar PWM de hardware é que ele não ocupa recursos da CPU, a saída de pulso é muito estável e o servo gira suavemente. Se você tiver que usar GPIO comum para simular através da função de atraso, a CPU ficará exausta e se o programa se tornar um pouco mais complicado, o tempo será facilmente confuso e o servo definitivamente irá tremer.
Depois de selecionar o pino, na parte de inicialização do programa, você precisa definir o modo de trabalho do GPIO para saída push-pull multiplexada. É como atribuir responsabilidades de trabalho a esse pino e dizer "você é responsável pela saída do sinal PWM". Além disso, se a placa de circuito original tiver um resistor pull-up, mas a nova não, você precisará considerar se deve habilitar o pull-up interno no código para garantir que o pino tenha um determinado estado de nível quando ocioso para evitar interferência de sinal.
Muitas pessoas têm dor de cabeça na hora de calcular a frequência. Na verdade, existe uma maneira simples. O ciclo PWM exigido pelo servo é de 50 Hz, que é um ciclo de 20 ms. Não importa qual temporizador você use, o objetivo é levar a frequência para 50Hz. A fórmula de cálculo é simples: frequência de saída do temporizador = relógio do sistema / (PSC+1) / (ARR+1). Primeiro você define o PSC para um número conveniente, como 7200-1, e depois inverte o valor ARR para que o resultado final fique próximo de 50Hz.
Por exemplo, se o clock do sistema for 72 MHz e você definir o PSC para 7200-1, a frequência de contagem do temporizador será de 10 kHz. Para que a frequência de saída chegue a 50 Hz, o ARR deve ser ajustado para 200-1, para que sejam contados a cada 200 números, o que equivale a 20 ms. Chips diferentes têm frequências principais diferentes, então você pode calcular de acordo com esta ideia para garantir que o ARR e PSC calculados finais sejam ambos inteiros, e o ARR não deve exceder o valor máximo de contagem do temporizador, para que o programa seja executado sem problemas.
Se você deseja que uma placa controle vários servos ao mesmo tempo, depende de quantos canais o temporizador possui. Um temporizador geralmente possui 4 canais, cada canal pode produzir um PWM de forma independente e a frequência é compartilhada. Portanto, desde que todos os seus servos funcionem a 50 Hz, você pode usar um temporizador para acionar 4 servos, o que pode economizar muitos recursos do temporizador. Você só precisa configurar vários canais durante a inicialização e definir seus valores de comparação respectivamente.
Se mais de 4 servos precisarem ser controlados, um segundo temporizador deverá ser habilitado. Ao transplantar, você pode escrever o código de inicialização para controlar um único servo como uma função, chamá-lo quantas vezes forem necessárias para controlar e passar o número do temporizador e o número do canal como parâmetros. Dessa forma, o código é altamente reutilizável e fácil de manter, independentemente de quantos servos forem adicionados no futuro. Lembre-se, o registro de comparação de cada canal é independente e você pode operá-lo separadamente ao definir o ciclo de trabalho.
O programa está gravado, mas o servo não responde? Não se preocupe, comece com o hardware mais simples. Use um multímetro para verificar se a fonte de alimentação e o aterramento do servo estão conectados corretamente. O servo possui altos requisitos de corrente, portanto você deve usar uma fonte de alimentação externa. Não espere que os 3,3 V da placa de desenvolvimento sejam capazes de ligar. Se não houver problema com a fonte de alimentação, use um osciloscópio ou analisador lógico para ver se há uma forma de onda de saída nos pinos do chip e veja se o período e a largura do pulso estão corretos.
Se a forma de onda estiver correta, mas o servo ainda não girar, pode haver um problema com a lógica do código. Você pode escrever primeiro o programa de teste mais simples e gerar um nível alto fixo de 1,5 ms para retornar o servo à posição intermediária. Se isso puder ser ativado, significa que não há problema com o driver subjacente e que o problema está na sua lógica de controle. Adicione funções gradualmente, altere um pouco de cada vez e use o método de eliminação para localizar rapidamente o problema, o que é muito mais rápido do que adivinhar sozinho.
Agora que o transplante básico foi feito, podemos fazer alguns truques. Por exemplo, se você deseja que o servo gire para um ângulo específico, você pode escrever uma função de conversão de ângulo para mapear de 0 a 180 graus para um valor de largura de pulso de 0,5ms a 2,5ms. Dessa forma, você não precisa se lembrar desses valores de tempo complicados. Você pode chamar a função diretamente e passar o ângulo. A legibilidade e portabilidade do código serão bastante melhoradas e outros irão entendê-lo rapidamente.
Para outro exemplo, você também pode adicionar filtragem de software para evitar mudanças repentinas no sinal de controle, fazendo com que o servo “treme”. Em projetos reais, os dados enviados de volta pelo sensor inevitavelmente apresentarão jitter. Se você adicionar um filtro de média móvel simples ao programa e depois enviá-lo para o servo, o movimento será muito mais suave. Encapsule essas funções estendidas em módulos independentes. Ao transplantar para outros projetos na próxima vez, essas “acumulações” poderão ser usadas diretamente e a eficiência do desenvolvimento será duplicada.
Onde seu projeto de transplante de servo está parado? É porque a configuração dos pinos não é clara ou o cálculo da frequência está sempre errado? Bem-vindo a deixar uma mensagem na área de comentários para falar sobre sua experiência. Se você acha que este artigo é útil para você, lembre-se de curtir e salvá-lo. Você também pode pesquisar no site oficial da nossa empresa casos mais práticos e modelos de código!
Hora de atualização: 29/03/2026
Entre em contato com o especialista de produtos da Kpower para recomendar um motor ou caixa de engrenagens adequado para o seu produto.