Asservissement en position d'un moteur à courant continu

Bonjour à tous,

Je suis sur un projet qui demande un asservissement en position, j’ai déjà visité le forum, mais je ne trouve pas la solution appropriée à mon problème et je me suis lancé à écrire un new topics. Voici la situation.

Le but est de commander un moteur à courant continu à l’aide d’une interface graphique (déjà, réaliser) et de donner une instruction par exemple 1500 et le moteur essaye de trouver cette valeur sur le potentiomètre (potentiomètre linéaire) une fois 1500 trouver le moteur s’arrête. Je voulais alors un genre de régulateur numérique P qui effectue cet asservissement.

Je me suis documenté et j’ai trouvé que pour pouvoir le faire on a besoin de comparer la valeur voulue et la valeur du potentiomètre à chaque lecture (du potentiomètre) sur le port analogique (qui signifie toutes les 110µs si on ne modifie pas le préscalaire).

Mais toutes solutions possibles sont les bienvenues. :slight_smile:

Bonjour,

Un codeur ne serait-il pas mieux adapter pour ce type d'asservissement ?

De plus je pense que tu seras plus précis avec un codeur qu'un potar.

Je ne sais pas quelle forme a ton moteur mais pour ma part je travaille avec ce type de moteurs et je n'utilise que les codeurs pour me positionner.

Merci pour votre réponse Akuma8. Oui c'est vrai l'utilisation d'un codeur est une solution. Mais sur la machine que je voulais commander elle utilise un potar. à vrai dire le potar joue le rôle d'une règle graduée.

La machine est une ancienne table traçante et je ne voulais rien changer sauf la partie commande.

Tu peux me suggérer d'autre solution?

Bonjour,

A tu penser a un moteur pas a pas ? il te suffit alors de connaitre ton rapport de déplacement par "pas" pour en déduire une position exacte , mais tout ça dépend de ton projet...

Sinon il est relativement simple de lire ton potentiomètre et de placer ton "curseur" a l'endroit souhaité...

Il te suffi de crée une variable "position voulu" et de chercher ce point avec des décisions en cascade , ca pourrait donner quelque chose comme ca :

int _ABVAR_1_Position_voulu = 0 ;

void setup()
{
}

void loop()
{
  _ABVAR_1_Position_voulu = 1500 ; // valeur demandé
  while ( ( ( ( ( _ABVAR_1_Position_voulu + 5 ) ) > ( analogRead(1) ) ) || ( ( ( _ABVAR_1_Position_voulu - 5 ) ) < ( analogRead(1) ) ) ) )
  {
    if (( ( _ABVAR_1_Position_voulu ) < ( analogRead(1) ) ))
    {
      //tourner dans un sens
    }
    else
    {
      //tourner dans l'autre sens
    }
  }

}

les adisions dans mon petit code permette d’éviter un effet rebond (régler le gain enfaite) , plus elle serons élevé plus ton moteur s’arrêtera calmement mais plus tu sera imprecis.

tu peut aussi améliorer ton code en augmentant la vitesse de translation lorsque tu est loin de ton "point d'arrivé" et la réduire quand tu t'en approche (régler la vitesse de ton moteur est un simple en PWM).

peut tu en dire plus sur ton projet ?

En espérant t'avoir aidé
Guillaume

Stifen:
Merci pour votre réponse Akuma8. Oui c'est vrai l'utilisation d'un codeur est une solution. Mais sur la machine que je voulais commander elle utilise un potar. à vrai dire le potar joue le rôle d'une règle graduée.

La machine est une ancienne table traçante et je ne voulais rien changer sauf la partie commande.

Tu peux me suggérer d'autre solution?

Dans ce cas là c'est tout aussi simple.
Ton potar te renvoie une valeur de tension analogique qui dépend de la position.
En utilisant les entrées analogiques de l'arduino tu devrais t'en sortir mais attention au niveau de tension de ton potar 5V max !

Lecureuil744:
Bonjour,

A tu penser a un moteur pas a pas ? il te suffit alors de connaitre ton rapport de déplacement par "pas" pour en déduire une position exacte , mais tout ça dépend de ton projet...

Sinon il est relativement simple de lire ton potentiomètre et de placer ton "curseur" a l'endroit souhaité...

Il te suffi de crée une variable "position voulu" et de chercher ce point avec des décisions en cascade , ca pourrait donner quelque chose comme ca :

int _ABVAR_1_Position_voulu = 0 ;

void setup()
{
}

void loop()
{
 _ABVAR_1_Position_voulu = 1500 ; // valeur demandé
 while ( ( ( ( ( _ABVAR_1_Position_voulu + 5 ) ) > ( analogRead(1) ) ) || ( ( ( _ABVAR_1_Position_voulu - 5 ) ) < ( analogRead(1) ) ) ) )
 {
   if (( ( _ABVAR_1_Position_voulu ) < ( analogRead(1) ) ))
   {
     //tourner dans un sens
   }
   else
   {
     //tourner dans l'autre sens
   }
 }

}





les adisions dans mon petit code permette d’éviter un effet rebond (régler le gain enfaite) , plus elle serons élevé plus ton moteur s’arrêtera calmement mais plus tu sera imprecis.

tu peut aussi améliorer ton code en augmentant la vitesse de translation lorsque tu est loin de ton "point d'arrivé" et la réduire quand tu t'en approche (régler la vitesse de ton moteur est un simple en PWM).

peut tu en dire plus sur ton projet ?

En espérant t'avoir aidé
Guillaume

Merci Lecureuil744

Mon projet consiste à réanimer une ancienne table traçante et la précision est utile d’où je devrais faire une sorte de régulateur numérique pour avoir une bonne précision. J’ai déjà essayé ton algorithme mais je voudrais avoir plus de précision.

Changer les moteurs par des moteurs pas à pas?? Je voudrais rien changer sur les actionneurs mais seulement les commander.

Tu peux me donner d’autre solution?

akuma8:
Dans ce cas là c'est tout aussi simple.
Ton potar te renvoie une valeur de tension analogique qui dépend de la position.
En utilisant les entrées analogiques de l'arduino tu devrais t'en sortir mais attention au niveau de tension de ton potar 5V max !

Oui c'est vrai, mais j'ai besoin d'une précision. j'ai besoin d'une valeur la plus proche de la valeur voulue.

bonsoir
en fait tu cherche à (re)creer le comportement d'un servo
les moteurs sont commandés actuellement sous quelle tension ? quelle consommation ?
les potentiomètres sont déjà implantés mécaniquement ?
quelle refrence cette table traçante ?

selon les reponses, Il y a peut etre une solution simple : simplement reutiliser l'electronique de commande d'un servo.

Artouste:
bonsoir
en fait tu cherche à (re)creer le comportement d'un servo
les moteurs sont commandés actuellement sous quelle tension ? quelle consommation ?
les potentiomètres sont déjà implantés mécaniquement ?
quelle refrence cette table traçante ?

selon les reponses, Il y a peut etre une solution simple : simplement reutiliser l'electronique de commande d'un servo.

Bonsoir

Les moteurs sont commandés sous 12V. Voici une image qui montre l’emplacement du potentiomètre et du moteur. Je souhaiterai faire un asservissement en position utilisant un régulateur numérique P. (comment faire le code d’un régulateur numérique qui sort avec ce problème ?)

Stifen:
Les moteurs sont commandés sous 12V. Voici une image qui montre l’emplacement du potentiomètre et du moteur. Je souhaiterai faire un asservissement en position utilisant un régulateur numérique P. (comment faire le code d’un régulateur numérique qui sort avec ce problème ?)

https://drive.google.com/file/d/0Bw5hPDX51EIlNzFOYmE0OEtMYTQ/view?usp=sharing

il te faut un pont en H par moteur (quelle puissance les moteurs ?)
la programmation reste relativement simple , si tu utilise l'acquisition AD native de l'arduino , tu dispose de 1024 points de positionnement par axe.
Bien verifier que les potentiometres du traceur sont bien en course lineaire , c'est facile à verifier

Stifen:
Bonsoir

Les moteurs sont commandés sous 12V. Voici une image qui montre l’emplacement du potentiomètre et du moteur. Je souhaiterai faire un asservissement en position utilisant un régulateur numérique P. (comment faire le code d’un régulateur numérique qui sort avec ce problème ?)

https://drive.google.com/file/d/0Bw5hPDX51EIlNzFOYmE0OEtMYTQ/view?usp=sharing

Bonjour,

Il nous manque certaines données en ce qui concerne ton problème.
Quel est l'état de ta table actuellement ? Tu arrives déjà à piloter tes moteurs dans les 2 sens ?
Quel est le courant max des moteurs ? Quelle carte Arduino tu as ?
Un régulateur numérique P (P pour proportionnel) est facilement implémentable avec l'Arduino, les pins analogiques te permettent d'avoir cette proportionnalité que tu veux puisque la position sera proportionnelle à la tension que te renverra le potentiomètre.

akuma8:
Bonjour,

Il nous manque certaines données en ce qui concerne ton problème.
Quel est l'état de ta table actuellement ? Tu arrives déjà à piloter tes moteurs dans les 2 sens ?
Quel est le courant max des moteurs ? Quelle carte Arduino tu as ?
Un régulateur numérique P (P pour proportionnel) est facilement implémentable avec l'Arduino, les pins analogiques te permettent d'avoir cette proportionnalité que tu veux puisque la position sera proportionnelle à la tension que te renverra le potentiomètre.

Bonsoir,

À propos des moteurs ce sont des moteurs à courant continu, le système de commande n’est pas un problème, car j’utilise un driver (varier la vitesse, faire tourner dans les deux sens n’est pas un problème). Le problème est l’implémentation du régulateur numérique P. Tu as une idée ? J’utilise une carte Arduino UNO la machine fonctionne, en ce moment, mais j'ai une envie d'augmenter la précision.

Bonjour,
Un peu de lecture

Merci beaucoup icare. Je vais essayé de trouver une solution avec ces documents. :wink: