Simulateur interactifIntermédiaire

Simulateur de profils : trapézoïdal et courbe en S

Profils trapézoïdal et en S à secousse limitée côte à côte : position, vitesse, accélération et secousse changent quand vous tirez les limites.

Catégorie
Systèmes de commande
Durée
30–60 min
Plateforme
Navigateur · Arduino
Schéma technique : Simulateur de profils : trapézoïdal et courbe en SVELOCITY OVER TIMETIME

01 / Commencez ici

Introduction

Chaque commande moteur cache un programme. Envoyez un axe quelque part : il faut décider à quelle vitesse il accélère, combien de temps il reste en croisière et quand il ralentit. Ce labo rend ce programme visible : définissez un mouvement et les capacités de la machine, et regardez les profils trapézoïdal et en S le planifier côte à côte — y compris quand vos limites ne peuvent pas être tenues ensemble.

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.

Commandes

Distance et top speed décrivent le mouvement voulu. Acceleration et jerk limit décrivent ce que la machine peut réellement faire. Le labo replanifie à chaque traction — il n’y a rien à presser avant que les courbes ne réagissent.

Show bascule entre les deux profils et chacun séparément. Play fait défiler un curseur de lecture sur les tracés en temps réel, ce qui est le moyen le plus rapide de sentir que la courbe en S finit plus tard.

La note sous les limites vous dit quand une limite cesse d’être atteignable, ce qui est toute la raison de tirer les curseurs.

Théorie

Quatre tracés, empilés, chacun la dérivée de celui du dessus. Cet empilement est l’argument : un coin dans la vitesse est un échelon dans l’accélération, et un échelon dans l’accélération est une impulsion dans la secousse. La discontinuité ne disparaît jamais en dérivant — elle descend jusqu’à devenir non bornée.

Un profil trapézoïdal accélère à taux constant, croise, puis décélère. La vitesse est un trapèze, l’accélération est un créneau, et la secousse est un ensemble d’impulsions aux coins. Ces impulsions sont ce qu’une machine entend comme un cognement et ce à quoi une transmission souple répond par des vibrations.

Un profil en courbe en S limite aussi la secousse. L’accélération monte en t_j = a_max / j_max, tient, puis redescend, donc la vitesse gagne des coins arrondis. Cela coûte exactement un temps de secousse et achète un choc borné.

Aucun profil ne peut toujours honorer chaque limite. Un mouvement plus court que v²/a n’atteint jamais la vitesse maximale. Une courbe en S dont la vitesse maximale est sous a²/j n’atteint jamais la limite d’accélération. Les deux sont ordinaires et les deux sont visibles ici.

Algorithme

Le labo résout le profil plutôt que de l’intégrer. Chaque segment a une secousse constante, donc dans un segment :

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

Elles sont exactes, c’est pourquoi le mouvement atterrit sur la cible au lieu d’à côté, et pourquoi tirer un curseur replanifie instantanément.

Choisir la vitesse maximale utilise une identité : une rampe de vitesse est impaire-symétrique autour de son milieu, donc elle couvre toujours exactement v_peak/2 × durée quelle que soit sa forme. Cela ramène « y a-t-il une phase de croisière ? » à une seule comparaison, et rend le pic limité par la distance soluble en forme fermée — une quadratique tant que l’accélération sature encore, une racine cubique une fois qu’elle ne sature plus.

Code source

Un générateur trapézoïdal assez petit pour être collé dans un croquis. Il renvoie la position que votre boucle de commande devrait poursuivre au temps 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;
}

Appelez-le une fois par période de commande et transmettez le résultat à ce qui ferme la boucle. AccelStepper fait l’équivalent en interne pour les pas à pas ; il n’y a pas d’option de courbe en S, donc un profil à secousse limitée est à générer vous-même.

Hypothèses et différences avec le matériel

Les profils supposent un axe rigide et sans contrainte : pas de frottement, pas de jeu, pas d’allongement de courroie ni de perte de pas, et un courant maximal disponible sur demande. Un vrai axe pas à pas ou à courant continu a un couple qui chute avec la vitesse, une souplesse qui transforme la secousse en vibrations, et un pont qui sature — c’est pourquoi une courbe en S aide un bras entraîné par courroie mais est du temps perdu sur un coulisseau court et rigide. La fréquence d’échantillonnage est aussi idéale ici ; sur un microcontrôleur, la stabilité de votre horloge est le plancher de précision. Lisez le mouvement comme la consigne que votre contrôleur existant devrait poursuivre, puis vérifiez face à la mécanique qu’il tire réellement.

Schéma de câblage

Il n’y a pas de circuit propre à ce labo — le profil est une couche d’arithmétique, pas un composant. Il se situe entre votre source de commande et la boucle que vous avez déjà :

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

Le câblage est celui dont votre moteur a déjà besoin : un pont calibré pour le courant maximal exigé par la rampe, et une rétroaction par codeur si vous voulez boucler. Seul ce que le contrôleur doit suivre change.

La démonstration complète, la confusion « jerk » de Marlin, et la raison pour laquelle profiler répare souvent un PID qui semblait mal réglé sont dans profils de mouvement : accélération trapézoïdale et en courbe en S.

Liste de vérification du matériel

Composants

  • Un moteur pas à pas ou un moteur à courant continu avec codeur
  • Un pont calibré pour le courant maximal demandé par le profil
  • Un contrôleur avec une horloge assez stable pour tenir la fréquence d'échantillonnage
  • Un montage rigide — la souplesse est ce qui transforme la secousse en vibrations

Explorer le graphe

Où ce simulateur est utilisé

Les projets, parcours d'apprentissage et tutoriels qui s'appuient sur ce labo.

Continuer la construction

Ressources à télécharger

Utilisez ces références sur la page pendant que vous avancez dans le projet. Les archives de projet téléchargeables ne seront ajoutées qu'une fois leur source et leur version publiées.

Questions courantes

Questions fréquentes

Pourquoi mon axe n'atteint-il jamais la vitesse maximale que j'ai réglée ?

Parce que le mouvement est trop court. Atteindre une vitesse maximale exige une distance d'élan de v²/2a et autant pour s'arrêter, donc tout mouvement plus court que v²/a est terminé avant la fin de la rampe. Le profil de vitesse devient un triangle plutôt qu'un trapèze, et son pic vaut √(a·d) quelle que soit votre configuration. Augmenter la limite de vitesse ne change rien à ces mouvements — seule l'augmentation de l'accélération le fait. Tirez le curseur de distance sous le seuil et le labo vous le dira.

Une courbe en S est-elle toujours meilleure qu'un profil trapézoïdal ?

Non. Elle est toujours plus lente, et la machine n'est pas toujours gênée par ce qu'elle corrige. Une courbe en S limite la secousse, ce qui compte quand la transmission est souple — courroies, bras longs, outil lourd au bout d'un bras — car un échelon d'accélération excite cette souplesse et elle vibre ensuite. Sur un axe court, rigide, à entraînement direct, la vibration peut être immesurable et le temps supplémentaire est une perte sèche. Utilisez le labo pour voir le coût, puis décidez si votre machine paie pour quelque chose dont elle a besoin.

Combien coûte réellement la limitation de la secousse en temps ?

Exactement un temps de secousse, t_j = a_max / j_max, à condition que les deux profils atteignent la même vitesse maximale et la même accélération. Pas deux, et — la partie surprenante — indépendamment de la distance du mouvement. Le segment d'accélération de la courbe en S est plus long, donc elle couvre plus de distance avant de croiser, donc la phase de croisière rétrécit et rend la majeure partie du temps. Seul le temps de secousse lui-même est irrécupérable. Tirez le curseur de distance et regardez le coût de secousse rester en place.

Pourquoi l'accélération n'atteint-elle jamais ma limite d'accélération ?

Parce que la limite de secousse est trop basse pour elle. Monter dans a_max et en redescendre exige une variation de vitesse de a_max²/j_max, donc si votre vitesse maximale est sous cela, l'accélération elle-même devient triangulaire et culmine à √(v·j) à la place. C'est la même histoire de « manque de place » qu'un mouvement court, une dérivée plus haut. Le labo le signale chaque fois que cela arrive.

Où va le profil dans mon code ?

Avant le contrôleur, pas dedans. Le profil génère une consigne — où l'axe devrait être maintenant — et ce que vous aviez déjà le suit : un séquenceur de pas, une boucle PID, une écriture servo. C'est pourquoi profiler répare souvent un axe qui semblait mal réglé. Une commande en échelon demande une sortie infinie à un PID, donc son erreur démarre à la distance complète du mouvement et l'intégrale s'emballe pendant que la sortie est saturée. Face à une cible profilée, l'erreur reste petite et les mêmes gains se comportent.

Pour aller plus loin

Références

Des sources faisant autorité pour aller plus loin que le modèle pédagogique, borné, de ce simulateur.