Simulador de motor de passo: perda de passo e atraso
Veja um rotor de motor de passo seguir o campo comandado, ultrapasse 90 graus elétricos e observe como a máquina perde posição sem perceber.
- Categoria
- Sistemas embarcados
- Tempo
- 20–40 min
- Plataforma
- Navegador · Arduino · ESP32
01 / Comece aqui
Introdução
Um motor de passo não dá passos: arrasta um rotor atrás de um campo magnético giratório, e o ângulo entre eles decide se o movimento chega ao destino. Este laboratório integra a equação de movimento do rotor: nada procura perda de passo; quando o ângulo de atraso ultrapassa o limite de perda de sincronismo de 90 graus, o motor perde sincronismo sozinho, como em uma bancada.
Live lab / Open-loop step integrity
Stepper motor simulator
Command a move and watch the rotor trail the field. Push the acceleration, drop the voltage or add load until the lag angle runs past the 90° pull-out limit — and the motor silently stops arriving.
Upper plot: the dashed line is where the driver thinks the axis is, the solid line is where the rotor actually is. Lower plot: the lag angle between them. The shaded band is where a steady load can sit — past ±90 electrical degrees the torque starts falling instead of rising, so there is no equilibrium out there, and a rotor that keeps going reaches 180° and slips a pole.
- Commanded (what the driver counted)
- Actual rotor position
- Where a load can sit (±90°e)
- Sync lost
- Full steps lost
- 0
- Peak lag
- 25°e
- Position error
- 0.000 mm
- Resolution
- 80 steps/mm
- Pull-out torque
- 0.311 N·m
- Corner speed
- 599 rpm
Every action has a button above. If you prefer the keyboard, focus the plots and press P for the next preset, M for the next microstepping setting, N to toggle the acceleration ramp, R to reset and F for full screen; sliders respond to the arrow keys.
Controles
O laboratório recalcula todo o movimento a cada entrada, portanto os traços acompanham o controle deslizante enquanto você o arrasta, em vez de esperar um botão Iniciar. Não há nada para iniciar — o movimento tem 30 000 passos de integração e termina antes de seu dedo se mover novamente.
| Controle | O que altera |
|---|---|
| Predefinição | Cinco situações resolvidas, de um movimento limpo a quatro maneiras diferentes de falhar |
| Taxa de passos | Uma rampa de aceleração trapezoidal ou a taxa de passos saltando diretamente para a máxima |
| Distância / Velocidade máxima / Aceleração | O movimento que você está pedindo |
| Tensão de alimentação | A tensão disponível para o driver de motor fornecer corrente ao enrolamento |
| Limite de corrente | O que você define com o potenciômetro — este é o torque de pico |
| Micropassos | Como o campo é dividido, de 1/1 a 1/16 |
| Mecanismo | Correia GT2 (40 mm/volta) ou parafuso sem-fim T8 (8 mm/volta) |
| Torque resistente | Atrito e carga no eixo do motor |
O gráfico superior é a posição: a linha tracejada é onde o driver de motor acredita que o eixo está, e a sólida é onde o rotor está de fato. O gráfico inferior é o ângulo de atraso entre eles, com a faixa estável de ±90° sombreada.
Teoria
Um motor de passo não dá passos. O driver de motor gira um campo magnético em incrementos e o rotor o segue, sempre atrás por algum ângulo — e o torque que ele produz é o seno desse ângulo:
T = T_peak(ω) × sin(δ)
δ é medido em graus elétricos. Um motor de 1,8° tem 50 dentes no rotor, portanto sua magnetização se repete 50 vezes por volta e um passo completo é exatamente 90 graus elétricos. Essa conversão é a única aritmética de todo o assunto.
Entre −90° e +90° o motor é uma mola: ficar mais atrás significa ser puxado com mais força. Essa região estável é a razão pela qual um motor de passo em malha aberta funciona, e é onde qualquer carga estável precisa ficar. Depois de 90° o seno muda de sinal, portanto ficar mais atrás produz menos torque restaurador, o que faz o rotor ficar ainda mais atrás — e aos 180° o torque inverte completamente e começa a puxar para o próximo polo. O rotor desliza para o próximo dente estável, um ciclo elétrico — quatro passos completos — adiante.
Esses são dois números diferentes, e o laboratório os mantém separados. 90° é onde o equilíbrio termina; uma breve ultrapassagem é tolerável, e é por isso que um comando de passo completo — um impulso de 90° a cada passo — não destrói a máquina. 180° é o ponto sem retorno.
Três coisas aumentam o ângulo de atraso:
- Carga. Em velocidade constante,
sin(δ) = demanded ÷ available. Uma carga com metade do torque disponível fica em 30°, deixando 60° de margem. - Aceleração. Colocar o rotor em movimento consome torque do mesmo orçamento, portanto o atraso é pior na rampa, não na velocidade.
- Velocidade, porque
T_peakcai quando o motor gira mais rápido.
A última é a menos óbvia. Um enrolamento é um indutor, e quanto mais rápido o motor gira, mais difícil é forçar corrente para dentro e para fora — a reatância cresce com a frequência elétrica, e a força contraeletromotriz do rotor girando consome a tensão de alimentação. O resultado é uma curva de torque plana até uma velocidade de inflexão que cai depois dela, e essa velocidade é definida pela tensão de alimentação.
Isso dá as duas regras que o laboratório existe para tornar óbvias: mais corrente fornece torque, mais tensão fornece velocidade.
Algoritmo
O rotor é integrado diretamente. Nada neste código detecta perda de passo, insere perda ou sabe que ela é possível — ela emerge da lei do seno.
// per 20 us tick
const ideal = sampleProfile(plan, time).position; // mm the planner wants
const command = Math.round(ideal * stepsPerMm) / stepsPerMm; // the driver only does whole microsteps
const lag = rotorTeeth * (commandAngle - theta); // electrical radians
const { torque } = peakTorque(setup, omega); // falls with speed
const friction = loadTorque * Math.tanh(omega / 0.5); // smooth Coulomb, one line
const accel = (torque * Math.sin(lag) - friction - damping * omega) / inertia;
theta += omega * dt + 0.5 * accel * dt * dt;
omega += accel * dt;
Dois detalhes importam mais do que parecem.
O comando é quantizado na grade de micropassos antes de ser visto pelo rotor. Essa escadaria é a fonte da excitação: em passo completo, cada comando é um impulso de 90 graus elétricos em uma ressonância muito pouco amortecida, e é exatamente por isso que um motor com passo completo zune e um com micropassos não.
O modelo do enrolamento define o teto de torque:
const backEmf = kT * speed;
const impedance = Math.hypot(resistance, rotorTeeth * speed * inductance);
const current = Math.min(currentLimit, Math.max(0, supplyVolts - backEmf) / impedance);
const torque = Math.SQRT2 * kT * current;
Ele é uma aproximação de regime estacionário concentrada de um driver de motor com chaveamento, e não uma simulação fase a fase. Reproduz a forma de uma curva de torque real e acerta as duas respostas de engenharia; é conservador na parte mais alta da curva.
A trajetória comandada vem do planejador de perfil de movimento existente no site, portanto “com rampa” e “sem rampa” são o mesmo caminho de código com um limite de aceleração diferente — não há um modo de falha separado escrito no código.
Experimentos guiados
Cada um isola uma única variável. Não altere mais nada.
1. A rampa é o fator decisivo. Deixe tudo nos valores padrão e alterne Taxa de passos entre Com rampa e Direto para a velocidade máxima.
| Com rampa | Direto para a velocidade máxima | |
|---|---|---|
| Pico de atraso | 25°e | além de 90° em 1,2 ms, desaparecendo em 3,0 ms |
| Passos completos perdidos | 0 | 280 |
| Onde o eixo termina | 60,00 mm | 4,0 mm |
Mesmo motor, mesmo driver de motor, mesma corrente, mesmo alvo. A única diferença é ter havido rampa na taxa de passos, e essa diferença é todo o movimento.
2. Encontre a taxa de partida. Defina Direto para a velocidade máxima e aumente Velocidade máxima a partir de 100 mm/s em etapas. Funciona por algum tempo e então, em algum ponto próximo de 200 mm/s, deixa de funcionar completamente — não gradualmente. Esse limite é a taxa de partida, e é um valor que também existe em motores reais.
3. Mais tensão aumenta a velocidade. Carregue a predefinição Alimentação de 12 V, execução rápida: o movimento trava. Agora aumente a Tensão de alimentação para 24 e veja-o concluir, sem tocar no limite de corrente. Depois volte para 12 V e tente recuperá-lo com o Limite de corrente — você não pode. Acima da velocidade de inflexão, o driver nunca estava alcançando a corrente definida.
4. Micropassos não aumentam a precisão. Fixe tudo e alterne Micropassos de 1/1 a 1/16, observando duas coisas:
| Micropassos | Tamanho do passo | Maior desvio do caminho | Erro de regime da carga |
|---|---|---|---|
| Passo completo | 0,200 mm | 0,127 mm | 0,049 mm |
| 1/4 | 0,050 mm | 0,061 mm | 0,044 mm |
| 1/16 | 0,0125 mm | 0,045 mm | 0,044 mm |
O acompanhamento melhora cerca de três vezes e depois para. O erro da carga permanece igual. Ele era 0,044 mm em passo completo e continua 0,044 mm com dezesseis micropassos — a diferença é que 0,044 mm é um quarto de um passo completo e três micropassos e meio, então micropassos finos fazem o mesmo erro parecer muito pior nas unidades que o driver de motor relata.
5. Perda de sincronismo. Aumente lentamente o Torque resistente com uma velocidade modesta. Observe o ângulo de atraso no gráfico inferior subir em direção à linha tracejada. Ele fica em 30°, depois 50°, depois 70° — e então, com um único pequeno incremento do controle, a sincronização acaba. Não existe uma região de aviso, porque não há equilíbrio além de 90° no qual ele possa se estabilizar.
7. Passo completo é um impulso de 90°. Carregue a predefinição Passo completo e leia o pico de atraso: cerca de 102°e. Cada passo comanda os 90° completos, e o momento do rotor o leva além. Ele ainda chega — nada se perde — mas gasta todo o movimento oscilando pela região em que um motor carregado não pode se dar ao luxo de entrar. Isso explica simultaneamente por que o passo completo faz tanto barulho e por que deixa tão pouca margem para a carga.
6. O mecanismo muda o problema. Mude Mecanismo para o parafuso sem-fim T8, com todo o restante fixo. A resolução passa de 80 para 400 passos/mm, e a mesma velocidade máxima agora exige cinco vezes a taxa de passos.
O que observar
- A falha é um precipício, não uma rampa. Nada se degrada. O ângulo de atraso cresce suavemente até 90° e então o movimento simplesmente acaba. Essa é a diferença definidora entre um motor de passo e um servo de malha fechada, que apenas desacelera sob carga.
- A máquina nunca sabe. A linha tracejada, que representa o comando, sempre termina exatamente no alvo, porque o driver de motor contou cada pulso que recebeu. Somente a linha sólida diz a verdade, e nenhuma máquina real tem essa linha.
- O erro da carga está sempre lá. Mesmo em uma execução perfeita, o rotor fica dezenas de micrômetros atrás de onde o driver de motor diz que está. Isso não é defeito; é o que
sin(δ) = load ÷ torqueexige. - Passos perdidos são sempre múltiplos de quatro. Tente produzir uma contagem que não seja.
Aplicação em hardware
| Neste laboratório | Um eixo real |
|---|---|
| Temporização ideal de passos a 50 kHz | Variação de temporização do temporizador de um microcontrolador e um teto próximo de 10–15 kHz em um Arduino Uno |
| Uma massa rígida | Alongamento da correia, folga de retorno e uma estrutura que flexiona |
| Torque resistente constante | Atrito que varia ao longo do eixo e arrasto dos cabos |
| Um modelo de enrolamento concentrado | Uma curva de torque real, com torque de detente e ressonância na banda intermediária |
| Regulação perfeita de corrente | Um driver de motor que reduz a saída por efeito térmico quando o limite é definido alto demais |
| Nada aquece | 8 W por motor continuamente, sempre que estiver energizado |
A diferença mais importante é a última em outro sentido: uma máquina real não oferece o gráfico inferior. Você não vê o ângulo de atraso, portanto não vê a margem de operação. O substituto prático é encontrar deliberadamente o ponto de falha — aumente velocidade e aceleração até o eixo perder passos e depois recue de 30 a 50 por cento e trabalhe ali.
Comece pelo guia de fiação e limite de corrente, calibre passos por milímetro com uma régua e junte tudo na construção do plotter de caneta.
Código-fonte
A rampa não é opcional em uma máquina real. A versão bloqueante abaixo se parece com a maioria dos primeiros esboços Arduino, e é a que zune:
// What not to ship: the step rate jumps from zero to full.
void moveBlocking(long steps, unsigned delayUs) {
for (long i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delayUs); // constant => no acceleration at all
}
}
A versão com rampa e sem bloqueio. Este é o mesmo trapézio que o laboratório planeja, gerado um passo por vez para que nada mais no microcontrolador pare:
#include <AccelStepper.h>
const float STEPS_PER_MM = 80.0; // 20T GT2 pulley at 1/16 stepping
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
void setup() {
pinMode(EN_PIN, OUTPUT);
digitalWrite(EN_PIN, LOW); // active low: energise
axis.setMaxSpeed(200 * STEPS_PER_MM); // 200 mm/s
axis.setAcceleration(2000 * STEPS_PER_MM);
}
void loop() {
if (axis.distanceToGo() == 0) {
axis.moveTo(axis.currentPosition() == 0 ? lround(60 * STEPS_PER_MM) : 0);
}
axis.run(); // returns immediately — call it constantly
checkEndstops(); // which is only possible because it does
}
setMaxSpeed e setAcceleration dão um perfil trapezoidal e nada mais — não há opção de curva em S no AccelStepper. Para um perfil limitado por jerk, você mesmo gera a referência e a envia para moveTo por um temporizador.
Se quiser saber se sua própria máquina está perto do limite, o teste barato é um teste de repetibilidade:
// Drive a long move out and back, N times, then check whether home moved.
// Anything other than a multiple of four full steps is not step loss.
for (int i = 0; i < 20; i++) { moveTo(LONG_MOVE); runToPosition(); moveTo(0); runToPosition(); }
// now re-home and compare the reported position against zero
Premissas e diferenças do hardware
A dinâmica do rotor é fiel: torque proporcional a sin(δ) é como um motor de passo híbrido funciona, e o comportamento de deslizamento é consequência de integrá-la, e não uma regra escrita no código. As constantes descrevem um NEMA 17 da classe 17HS4401 — 1,8°, 1,7 A, 2,8 Ω, 3,2 mH, 0,44 N·m de torque de retenção, com um carrinho refletido de 300 g no eixo.
O que o modelo simplifica: o enrolamento é representado por uma impedância de regime estacionário e por um termo de força contraeletromotriz, em vez de ser simulado fase a fase, portanto o trecho final da curva de torque é pessimista. O torque de detente — o pequeno dentado que você sente ao girar manualmente um motor de passo sem energia — não é modelado, nem a ressonância na banda intermediária, nem o comportamento do modo de decaimento do driver de motor, nem qualquer efeito térmico. A temporização é ideal, portanto a variação de temporização de passos de um microcontrolador real não aparece.
Nada disso altera qual ajuste usar. Todas essas são razões para verificar uma máquina real em vez de confiar em um número desta página.
Diagrama do circuito
A configuração física modelada consiste em quatro fios do motor conectados a um driver de motor, dois fios do driver de motor conectados a um microcontrolador e um capacitor que as pessoas continuam esquecendo:
Arduino 5V ──── VDD
Arduino GND ──── GND (logic) ──┬── GND (motor) ──── PSU −
PSU + (12–24 V) ──── VMOT ──┬──┴── 100 µF electrolytic, close to the board
Pin 3 ──── STEP RESET ──┬── SLEEP
Pin 4 ──── DIR MS1, MS2, MS3 ──── 5 V (1/16)
Pin 5 ──── ENABLE (active low)
Coil A ──── 1A, 1B Coil B ──── 2A, 2B
A página do componente A4988 tem o diagrama de pinos completo, a tabela de Vref para as duas variantes de resistor de medição e a razão pela qual esse capacitor não é opcional.
Lista de verificação de hardware
Componentes
- Um motor de passo bipolar — o tipo de 1,8°, 200 passos completos
- Um driver de motor com regulação de corrente e limite ajustável
- Uma alimentação de motor de 12 V ou mais e um instrumento para medi-la
- Um eixo com correia ou parafuso, porque a resolução em passos/mm é metade da resposta
Explore o grafo
Onde este simulador é usado
Os projetos, caminhos de aprendizagem e tutoriais que se apoiam neste laboratório.
Continue construindo
Baixar recursos
Use estas referências da página enquanto trabalha no projeto. Pacotes de projeto para download serão adicionados somente depois que seu código-fonte e sua versão forem publicados.
Dúvidas comuns
Perguntas frequentes
Por que meu motor de passo perde passos?
Porque o rotor ficou muito atrás do campo comandado. Dentro de 90 graus elétricos — um passo completo — o motor se realinha ao campo, portanto qualquer carga estável precisa ficar ali. Depois de 90°, o torque disponível diminui quanto mais atrasado o rotor fica e, aos 180°, ele inverte e passa a puxar para o próximo polo; o rotor desliza para o próximo ponto estável, um ciclo elétrico inteiro adiante. Três coisas o empurram para além desse limite: uma carga maior que o torque disponível, uma aceleração íngreme o bastante para que o rotor consuma mais torque do que resta ao ganhar velocidade e a velocidade, porque o torque disponível cai quando o motor gira mais rápido. O laboratório permite provocar cada uma delas separadamente.
Por que ele perde exatamente quatro passos por vez?
Porque o padrão magnético se repete a cada quatro passos completos. Quando o rotor perde a sincronização, ele não para em algum ângulo arbitrário — desliza até se prender no próximo dente estável, que está um ciclo elétrico inteiro adiante, e um ciclo elétrico são 360 graus elétricos, ou quatro passos completos. O laboratório nunca impõe isso; ele integra a lei do torque seno e a contagem de passos perdidos sempre resulta em um múltiplo de quatro por conta própria. Se sua máquina alguma vez estiver deslocada por um número que não seja múltiplo de quatro passos completos, a causa não é perda de passo.
Micropassos tornam minha máquina mais precisa?
Tornam o movimento mais suave, não mais preciso. Selecione os micropassos de 1/1 a 1/16 com uma carga fixa e observe separadamente os dois números: o desvio do caminho comandado cai cerca de três vezes, porque você parou de aplicar ao rotor um impulso de 90 graus elétricos de uma vez e ele parou de oscilar. O erro de regime causado pela carga permanece inalterado — ele é 0,044 mm em passo completo e 0,044 mm com dezesseis micropassos. Dividir o passo fez esse erro parecer maior em unidades de passo; não alterou o erro.
Devo aumentar a tensão ou a corrente para corrigir um travamento?
Depende de onde ocorre o travamento, e o laboratório torna a diferença óbvia. Abaixo da velocidade de inflexão, o driver de motor está mantendo o limite de corrente que você definiu, portanto o torque é definido pela corrente — aumente o limite. Acima da velocidade de inflexão, o driver de motor não consegue mais empurrar a corrente definida contra a reatância e a força contraeletromotriz, portanto o torque é definido pela tensão de alimentação e aumentar o limite de corrente não muda nada, além de elevar a temperatura de todos os componentes. Carregue a predefinição de 12 V e veja o mesmo movimento que falha a 12 V passar a 24 V sem tocar na corrente.
Por que o mesmo movimento funciona com uma rampa e falha sem ela?
Porque acelerar o rotor exige torque, e no instante em que o movimento começa o rotor está parado enquanto o campo comandado já se move rapidamente. Mude o controle da taxa de passos para velocidade máxima direta sem mudar mais nada, e o atraso estará além de 90 graus em cerca de um milissegundo e terá desaparecido após 3 ms: o driver de motor conta todo o movimento de 60 mm enquanto o eixo alcança 4 mm. Esse limite é a taxa de partida, a maior taxa de passos que você pode comandar a partir da parada, e uma rampa de aceleração é o que mantém você abaixo dela.
É isso que um motor real faz?
A dinâmica do rotor é fiel — torque proporcional ao seno do ângulo de atraso é como um motor de passo híbrido realmente funciona, e o comportamento de deslizamento decorre de integrá-la. O modelo do enrolamento é uma aproximação concentrada de regime estacionário de um driver de motor com chaveamento, e não uma simulação fase a fase, portanto reproduz a forma de uma curva de torque de uma folha de especificações e acerta as respostas de engenharia, mas é conservador na região final da curva. Use-o para criar intuição e ver qual ajuste importa; use uma curva de torque real ao dimensionar uma máquina.
Leitura complementar
Referências
Fontes confiáveis para ir além do modelo educacional limitado deste simulador.