Simulatore interattivoIntermedio

Simulatore di profili di movimento: trapezoidale e a S

Pianifica e confronta un profilo trapezoidale e uno a S con jerk limitato, osservando posizione, velocità, accelerazione e jerk mentre trascini i limiti.

Categoria
Controlli automatici
Tempo
30–60 min
Piattaforma
Browser · Arduino
Schema tecnico: Simulatore di profili di movimento: trapezoidale e a SVELOCITY OVER TIMETIME

01 / Inizia qui

Introduzione

Ogni comando del motore nasconde una pianificazione. Quando un asse deve spostarsi, qualcosa decide quanto rapidamente raggiunge la velocità, quanto la mantiene e quando inizia a rallentare. Questo laboratorio mostra un profilo trapezoidale e uno a S che pianificano lo stesso movimento affiancati, inclusi i casi in cui non è possibile rispettare tutti i limiti contemporaneamente.

Live lab / Analytic profile planner

Motion profile simulator

Set a move and watch both profiles plan it. Drag the limits to push the move into a triangle, starve the jerk until acceleration never saturates, and read what the S-curve costs.

Browser native
This lab plots position, velocity, acceleration and jerk for the same move under a trapezoidal and an S-curve profile. Use the controls below to change the move, or read the full theory and algorithm after this lab.

Four stacked plots share a time axis. Each is the derivative of the one above it, so a corner in velocity becomes a step in acceleration and an impulse in jerk. The trapezoidal profile is drawn in the accent colour, the S-curve alongside it.

Playhead

Drag any limit — the plan updates as you drag. Press Play to run the move.

The move
Machine limits

Both profiles reach every limit you set.

Trapezoidal
1.200 s
S-curve
1.300 s
Jerk cost
+0.100 s
Peak speed
100 mm/s
Peak accel
500 mm/s²
Cruise
0.700 s

Keyboard: focus the plots, then use Space to play/pause, B to rewind, R to reset, M to cycle which profiles are shown, and F for full screen.

Controlli

Distanza e velocità massima descrivono il movimento desiderato. Accelerazione e limite di jerk descrivono ciò che la macchina può effettivamente fare. Il laboratorio ripianifica a ogni trascinamento: non devi premere nulla prima che le curve rispondano.

Mostra alterna tra entrambi i profili e uno solo. Riproduci fa scorrere un cursore temporale sui grafici in tempo reale, il modo più rapido per percepire che il profilo a S termina più tardi.

La nota sotto i limiti ti dice quando un limite non è più raggiungibile: è il motivo per cui vale la pena trascinare i cursori.

Teoria

Quattro grafici impilati, ciascuno la derivata di quello sopra. Quell’impilamento è la dimostrazione: un angolo nella velocità è un gradino nell’accelerazione, e un gradino nell’accelerazione è un impulso nel jerk. La discontinuità non scompare quando si differenzia: scende finché non diventa illimitata.

Un profilo trapezoidale accelera con un’accelerazione costante, mantiene la velocità e poi decelera. La velocità è un trapezio, l’accelerazione è un’onda quadrata e il jerk è una serie di impulsi agli angoli. Sono proprio questi impulsi che una macchina percepisce come un colpo e a cui un gruppo di trasmissione flessibile risponde con oscillazioni.

Un profilo a S limita anche il jerk. L’accelerazione aumenta in rampa per t_j = a_max / j_max, rimane costante e poi diminuisce, così la velocità acquisisce angoli arrotondati. Costa esattamente un tempo di jerk e ottiene uno shock limitato.

Nessun profilo può sempre rispettare ogni limite. Un movimento più breve di v²/a non raggiunge mai la velocità massima. Un profilo a S la cui velocità massima è inferiore a a²/j non raggiunge mai il limite di accelerazione. Entrambi i casi sono normali e sono visibili qui.

Algoritmo

Il laboratorio risolve il profilo invece di integrarlo. Ogni segmento ha un jerk costante, quindi all’interno di un segmento:

a(τ) = a₀ + j·τ
v(τ) = v₀ + a₀·τ + j·τ²/2
x(τ) = x₀ + v₀·τ + a₀·τ²/2 + j·τ³/6

Queste equazioni sono esatte: ecco perché il movimento arriva sul bersaglio e non solo vicino, e perché trascinando un cursore il profilo viene ripianificato immediatamente.

La scelta della velocità di picco usa una sola identità: una rampa di velocità è simmetrica rispetto al suo punto medio, quindi copre sempre esattamente v_peak/2 × duration, qualunque forma abbia. Questo trasforma la domanda «c’è una fase di velocità costante?» in un unico confronto e rende la velocità di picco limitata dalla distanza risolvibile in forma chiusa: un’equazione di secondo grado mentre l’accelerazione è ancora saturata, una radice cubica quando non lo è più.

Codice sorgente

Un generatore trapezoidale abbastanza piccolo da incollare in uno sketch. Restituisce la posizione che il ciclo di controllo deve inseguire al tempo t:

// Target position t seconds into a trapezoidal move of `d` mm.
float profilePosition(float t, float d, float vMax, float a) {
  float tAcc = vMax / a;
  float dAcc = vMax * vMax / (2 * a);

  if (2 * dAcc > d) {                      // too short to reach vMax
    float tPeak = sqrtf(d / a);            // triangular profile
    if (t >= 2 * tPeak) return d;
    if (t < tPeak) return 0.5f * a * t * t;
    float left = 2 * tPeak - t;
    return d - 0.5f * a * left * left;
  }

  float tCruise = (d - 2 * dAcc) / vMax;
  float tTotal  = 2 * tAcc + tCruise;
  if (t >= tTotal) return d;
  if (t < tAcc)           return 0.5f * a * t * t;
  if (t < tAcc + tCruise) return dAcc + vMax * (t - tAcc);

  float left = tTotal - t;
  return d - 0.5f * a * left * left;
}

Chiamalo una volta per ogni periodo di controllo e passa il risultato a ciò che chiude il ciclo. AccelStepper fa equivalentemente il lavoro internamente per i motori passo-passo; non ha un’opzione S-curve, quindi un profilo con jerk limitato devi generarlo tu.

Ipotesi e differenze hardware

I profili ipotizzano un asse rigido e non vincolato: nessun attrito, nessun gioco di inversione, nessun allungamento della cinghia e nessun passo perso, e la corrente di picco è disponibile su richiesta. Un vero motore passo-passo o un asse DC ha una coppia che diminuisce con la velocità, una flessibilità che trasforma il jerk in oscillazioni e un driver che satura: è per questo che un profilo a S aiuta un braccio azionato da cinghia, ma è tempo sprecato su una slitta breve e rigida. Anche la frequenza di campionamento è ideale; su un microcontrollore la stabilità del timer è il limite di precisione. Leggi il movimento come il valore di riferimento che il controllore esistente deve inseguire, poi verificalo rispetto alla meccanica che sta effettivamente azionando.

Schema elettrico

Non esiste uno schema unico per questo laboratorio: il profilo è uno strato di aritmetica, non un componente. Si trova tra la sorgente del comando e il ciclo che hai già:

target position  →  PROFILE  →  setpoint  →  controller  →  driver  →  motor
                                                 ↑                        │
                                                 └────── encoder ─────────┘

Il cablaggio è quello di cui il tuo motore ha già bisogno: un driver dimensionato per la corrente di picco richiesta dalla rampa e retroazione dell’encoder se vuoi chiudere il ciclo. Cambia solo ciò che il controllore deve seguire.

La derivazione completa, la confusione tra “jerk” in Marlin e il motivo per cui la profilazione spesso risolve un PID che sembrava regolato male sono in profili di movimento: accelerazione trapezoidale e a S.

Checklist hardware

Componenti

  • Un motore passo-passo o un motore DC con encoder
  • Un driver del motore dimensionato per la corrente di picco richiesta dal profilo
  • Un controllore con un timer abbastanza stabile da mantenere la frequenza di campionamento
  • Un supporto rigido: la flessibilità è ciò che trasforma il jerk in oscillazioni

Esplora il grafo

Dove si usa questo simulatore

I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.

Continua a costruire

Scarica le risorse

Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.

Domande comuni

Domande frequenti

Perché il mio asse non raggiunge mai la velocità massima impostata?

Perché il movimento è troppo breve. Raggiungere una velocità massima richiede una rampa di v²/2a e altrettanta per fermarsi, quindi qualsiasi movimento più breve di v²/a termina prima che la rampa sia completa. Il profilo di velocità diventa triangolare invece che trapezoidale, con picco √(a·d), indipendentemente dalla configurazione. Aumentare il limite di velocità non cambia nulla per questi movimenti: bisogna aumentare l'accelerazione. Trascina il cursore della distanza sotto la soglia e il laboratorio lo segnalerà.

Un profilo a S è sempre migliore di un profilo trapezoidale?

No. È sempre più lento e la macchina non soffre sempre dell'elemento che corregge. Un profilo a S limita il jerk, il che conta quando il gruppo di trasmissione ha flessibilità: cinghie, bracci lunghi, uno strumento pesante all'estremità di un braccio. Un salto dell'accelerazione eccita quella flessibilità, che poi oscilla. Su un asse breve, rigido e a trazione diretta l'oscillazione può essere impercettibile e il tempo aggiuntivo è una pura perdita. Usa il laboratorio per vedere il costo e poi decidi se la tua macchina sta pagando qualcosa di cui ha bisogno.

Quanto tempo costa davvero la limitazione del jerk?

Esattamente un tempo di jerk, t_j = a_max / j_max, purché entrambi i profili raggiungano la stessa velocità massima e la stessa accelerazione. Non due e, per la parte sorprendente, indipendentemente dalla distanza del movimento. Il segmento di accelerazione del profilo a S è più lungo, quindi percorre più distanza prima della velocità costante e la fase di crociera si riduce, restituendo gran parte del tempo. Solo il tempo di jerk è irrecuperabile. Trascina il cursore della distanza e osserva che il costo del jerk rimane costante.

Perché l'accelerazione non raggiunge mai il mio limite di accelerazione?

Perché il limite di jerk è troppo basso. Passare da zero ad a_max e poi tornare indietro richiede una variazione di velocità pari a a_max²/j_max; quindi, se la velocità massima è inferiore, l'accelerazione stessa diventa triangolare e ha un picco di √(v·j). È la stessa storia dello spazio esaurito di un movimento breve, ma a una derivata di ordine superiore. Il laboratorio lo segnala ogni volta che accade.

Dove devo inserire il profilo nel codice?

Prima del controllore, non al suo interno. Il profilo genera un valore di riferimento, cioè dove l'asse dovrebbe trovarsi in questo momento, e ciò che avevi già lo segue: un pianificatore dei passi, un ciclo PID, una scrittura del servomotore. Ecco perché la profilazione spesso risolve un asse che sembrava regolato male. Un comando a gradino chiede al PID un'uscita infinita, quindi il suo errore parte dall'intera distanza del movimento e il termine integrale si accumula mentre l'uscita è saturata. Contro un riferimento profilato l'errore resta piccolo e gli stessi guadagni si comportano bene.

Per approfondire

Fonti

Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.