Courbe accélération / décélération moteur CC

Bonjour à tous,

Je viens vers vous car je rencontre un blocage dans la programmation d'une courbe d'accélération/décélération d'un moteur CC.

Je suis en train de faire un petit robot avec 4 roues motrices. Les moteurs sont indépendant et sont pilotés par une carte de contrôle ou j'envoi la vitesse du moteur via une liaison série (nombre de 0 à 254).

Le principe est que le robot lit un ordre sur une carte SD : avancer de X pas / tourner à gauche / tourner à gauche / avancer de X pas....

J'essaye de coder une fonction pour faire accélérer et freiner le robot mais je ne vois pas comment faire.
Je ne vois pas comment faire pour que la formule prenne en compte aussi bien une courte distance à parcourir, qu'une longue distance. J'ai aussi une fonction pour mettre en pause, mais du coup le robot ne décélère pas, il "pile" et quand je reprend, ma fonction ne tient pas compte qu'il est à l'arret et il repart donc plein pot.

J'ai fait une bête fonction qui coupe la distance en 3 : une partie accélération entre 0% et X% du trajet parcouru, entre X% et Y% vitesse constante et au delà décélération. mais ce qui veut dire que sur de "longue" distance, le robot est dans sa phase d'accélération pendant beaucoup plus longtemps.
Je pense que je ne résonne pas du tout comme il faut !

Si vous avez donc un exemple ou quelque-chose pour m'aiguiller, je suis preneur :slight_smile:

 //Determination de la vitesse
    if (nbPasEffectue <= 0)
    {
      vitesseCorrigee = 1;
    }
    else if (nbPasEffectue > 0 && nbPasEffectue <= t1) // Accel
    {
      vitesseCorrigee = mot_a * nbPasEffectue;
      vitesseCorrigee = constrain(vitesseCorrigee, 1, consigneVitesse);
    } else if (nbPasEffectue > t1 && nbPasEffectue <= (t1 + t2)) //Regime constant
    {
      vitesseCorrigee = consigneVitesse;
    } else if (nbPasEffectue > (t1 + t2) && nbPasEffectue <= (t1 + t2 + t3)) //Decelleration
    {
      vitesseCorrigee = (-mot_c * nbPasEffectue) + (mot_c * (t1 + t2 + t3));
      vitesseCorrigee = constrain(vitesseCorrigee, 1, consigneVitesse);
    }

Merci.

Salut,

Comment fait tu pour vérifier que le robot a bien fait le bon nombre de pas lors des dépalcements ?

Sachant que le robot lit sur la carte SD les différents ordres de commandes, tu connais normalement la distance à parcourir, donc en fonction de la longueur à faire, il serait envisageable d'avoir plusieurs lois d'accélerations.

  • déplacement de faible distance (à determiner) : loi en triangle --> accélération, decéleration.
  • déplacement moyen ou important : loi en trapeze --> accéleration, vitesse Cst, décéleration.

Un deplacement sur un grande distance induit pas forcement une phase d'accéleration plus longue, mais un temps de déplacement à vitesse constante plus important,

Pourquoi ne pas rajouter dans la SD en plus des ordres de commande des deplacements, un paramètre de gestion des phases accéleration - décéleration.

@+

Bonjour,

Je me suis mal exprimé, quand je parle de "pas", c'est le retour des encodeurs qui sont sur mes moteurs CC. Je connais donc le nombre de tour de roue effectué et ainsi la distance théorique parcourue (car pour un calcul exacte il faudrait le diamètre de roue exacte) et ça ne prend pas en compte s'il y a un glissement.

Oui, je connais bien la distance à parcourir.

Je peux en effet tout à fait rajouter sur la SD les param d'accel/deccel.
Le seul soucis, c'est ce côté "math" sur lequel je fais un blocage.

Je vais regarder avec ces lois en triangle / trapèze ce que je trouve sur le net, car je ne connaissais pas du tout (je suis fâché avec les math :slight_smile: )
Si quelqu'un à un site bien fait sur ces lois, je suis preneur.

Merci.

Salut,

Exemple de graphique traduisant une loi de vitesse type trapeze :


1 : phase accélération
2 : phase à vitesse constante
3 : phase de freinage ou décélération

Si la distance à parcourir est faible, il n'y a plus de phase (2), donc le graphique ressemble à un triangle.
Concernant les équations reliant vitesse, accélaration et deplacememnt je peux vous aidez.
cdt

Salut,

Merci pour ces infos, j'ai fouillé un peu sur Google et j'avoue être un peu perdue avec toutes ces formules.
Et je me demande si dans mon cas, utiliser le temps est judicieux ou non (ou alors peut etre que c'est obligatoire pour utiliser une loi en trapeze) : En effet, actuellement je me basais sur le retour des encodeurs pour savoir où j'étais précisément par rapport à ma consigne. Si j'utilise le temps, j'ai peur de perdre en précision et donc m'arrêter trop tot ou trop tard.

Si je comprend bien la loi, il faut en fait déterminer t1 et t2, afin de savoir pendant combien de temps accélérer et à partir de quel moment entrer en phase de décélération ?

Est-ce possible de remplacer le temps par le retour de mes encodeurs ?
Et à la place d'une valeur en Km/h, je dois envoyer un chiffre compris entre 0 (arrêt total) et 254 (vitesse maximale).

Bonjour,

J'ai beau essayer, je suis complètement perdu avec ces formules mathématiques et le parallèle pour le passer sous Arduino, notamment comment passe t'on de la phase d'accélération à la phase vitesse constante.

Quelle est la méthodologie pour trouver cette loi ?

Je connais ma vitesse max, qui pour moi est un nombre allant de 0 à 255. L'accélération est un paramètre à définir selon mes essais.

Merci beaucoup pour toutes ces infos !
Je vais digérer un peu tout ça et essayer de mettre en application. :slight_smile: