Go Down

Topic: Asservissement moteur (Read 2548 times) previous topic - next topic

Latnac

Bonjour, je débute depuis quelque temps en matière d'arduino et j'aurais besoin d'un peu d'aide.

Mon projet est de réaliser un asservissement pour moteur à courant continu à l'aide de ma carte arduino.
J'ai un circuit principal sur lequel est branché mon moteur, avec une alimentation continu et un transistor MOSFET.
Je veux donc contrôler le transistor à l'aide de mon arduino pour réguler la vitesse du moteur. J'arrive à réaliser ce montage en faisant varier le pas cyclique de ma MLI (PWM) grâce à un potentiomètre.

Maintenant j'aimerais donc réaliser un asservissement autonome, en envoyant à l'arduino une tension de consigne et une tension image de la vitesse de rotation du moteur, dont elle ferait la différence afin de générer un pas cyclique variable pour adapter la vitesse du moteur.
J'ai donc besoin d'aide car je ne sais pas comment récupérer ces deux tensions pour en faire la soustraction et générer mon pas cyclique, mes essais mon pour l'instant conduit à la mort de ma première carte =(

Merci d'avance pour votre aide.
Latnac


fdufnews

Peut être un petit schéma de ce que tu avais fait pour que l'on t'aiguille sur la bonne piste

taddot

pour éviter la mort de ta carte, plutot que de générer une "tension image", pourquoi ne pas simplement faire un "compte-tour" (1 à plusieurs impulsions par tour, selon la réactivité souhaité), la vitesse de rotation pouvant être déduite soit du nombre d'impulsions, soit du temps entre 2 impulsions.

C'est une solution simple (qui a dit "simpliste" ?) mais ça peut marcher. Tout dépend de la réactivité/sensibilité souhaitée.
pas taper... sauf application de l'article 35 ...

Latnac

Voilà le schéma de mon montage.

Mon principal soucis est que je ne sais pas comment récupérer la tension aux bornes du moteur par exemple et l'envoyer à l'arduino.

@ taddot : je ne suis pas sûr qu'un compte tour convienne dans mon cas, l'asservissement se ferait alors de façon saccadée, l'avantage de la tension image c'est qu'il me suffit simplement de faire la différence entre la consigne et la réponse pour asservir le moteur.

cutprod

#4
Mar 20, 2012, 08:08 pm Last Edit: Mar 20, 2012, 08:20 pm by cutprod Reason: 1
Bonjour, l'alim externe de ton moteur a quelle tension ?
Si elle excède 5 Vcc utilise un pont diviseur et lis la avec une de tes entrées analogique.
"et une tension image de la vitesse de rotation du moteur" c'est la tension aux bornes du moteur ?, même technique.
Pourquoi tu as relié le 5 v et le 3.3 v de ta carte ?

Latnac

Bonsoir cutprod, mon alim externe me donne du 15V. J'utilise un pont diviseur de tension pour diviser la tension par 5.
Sur mon schéma le 5V et le 3.3V ne sont pas reliés, juste une erreur dans le tracé.

Comment fais tu pour utiliser les entrées analogiques? Parce que j'ai essayé d'envoyer par exemple sur l'entrée A1 la tension aux bornes de ma résistance, mais je me suis rendu compte que ma carte pouvait fonctionner alors sans alimentation, simplement en branchant les bornes du pont diviseur de tension à l'entrée A1 et au GND, la carte restait allumé.
Est-ce normal?

cutprod

#6
Mar 20, 2012, 09:12 pm Last Edit: Mar 20, 2012, 09:14 pm by cutprod Reason: 1
Pour lire une tension, utilise la fonction "analogRead" (tu trouvera des exemples dans l'ide: fichier>exemples...).
un schéma pour le cablage la : http://arduino.cc/en/Tutorial/AnalogInput
Pour la carte qui reste allumée sans alim  :smiley-slim: ma foi je te crois, faux faire des tests... ou un exorcisme

Latnac

Je peux donc brancher mon arduino comme ceci, et j'observerais la tension aux bornes de la résistance sur la pate A3?

zoroastre

Yep!

Quote from: Latnac
simplement en branchant les bornes du pont diviseur de tension à l'entrée A1 et au GND, la carte restait allumé.
Est-ce normal?


:smiley-eek:

Je dirais que cela n'est pas normal. Il doit y avoir quelques portes logiques forcées. Dans ce cas de figure, quelle tension as tu entre ton port analogique et Gnd ???

Ton schema n'est pas complet, et même si dans le principe, il semble correcte. Un peu plus de détails pourrait nous aider à peaufiner ton montage. La liste des composants aussi, mos ? diode ? moteur ?

Tu ne nous as pas fournis de code non plus. Il serait ainsi plus aisé de comprendre à quel endroit tu rencontres des difficultés.

cutprod ayant répondu à l'essentiel, nous attendons tes retours ;)

EDIT 1 : Le dernier schema n'est pas bon. Tu envoies 15 volts direct à l'arduino.

@+

Zoroastre.
Gné! ;)

68tjs

Quote
Je dirais que cela n'est pas normal.

Ce n'est pas un fonctionnement normal dans le sens d'attendu mais c'est conforme au schéma exact du micro. En effet il existe sur toutes les pins des diodes de protection dont le but est d'empêcher de tuer le micro par électricité statique rien qu'en posant ses doigts sur une broche.
Ces diodes ne figurent généralement pas dans les schémas de principe mais la datasheet ne les passe pas sous silence pour autant:
Atmega328 -> voir page 75
Les deux diodes sont en inverse pour ne pas perturber le fonctionnement, ce n'est pas très clair sur le schéma mais la diode du haut est reliée au Vcc.
Si une porte à l'état haut est reliée à une entrée/sortie du micro elle pourra alimenter le micro (plus ou moins correctement selon le courant qu'elle peut délivrer).

al1fch

#10
Mar 20, 2012, 10:32 pm Last Edit: Mar 20, 2012, 11:13 pm by al1fch Reason: 1
Bonsoir

Mesurer la vitesse de rotation d'un moteur à courant continu par le bias de la force électromotrice de celui ci est en théorie , sur le papier, faisable ..... avec beaucoup de précautions, une bonne poignée de composants additionnels. Il faut, de plus, faire la mesure pendant les intervalles de temps ou le Mosfet est bloqué (non conducteur), brefs instants ou le moteur n'est plus alimenté et fonctionne en 'dynamo'
Bref  récupérer une "tension image de la vitesse de rotation du moteur", propre, valide, utilisable,  est tout sauf simple avec un moteur à courant continu (collecteur et 'charbons') vu le niveau très important des parasites.

Il est à mon avis hautement conseillé d'abandonner l'idée d'une mesure de vitesse analogique au profit d'une mesure numérique de la vitesse de rotation de l'arbre :
D'enlever les deux fils rouges .... qui de plus :
 -court-circuite le MosFet pour l'un (schéma de montage 2.png),
 -envoie une tension excessive sur l'entrée analogique de l'Arduino pour l'autre.
D'enlever la résistance en série avec le moteur
De mesurer la vitesse de rotation de l'arbre par un dispositif :
-optique (coupure de faisceau, réflexion...)
-ou magnétique.(Effet hall)  



zoroastre

Yep!

Ce n'est pas habituellement le chapitre du datasheet sur lequel je m'arrête  :smiley-mr-green:

Tes explications couplées au schema sont impéccables (les flêches sont bien Vcc).

Merci 68tjs pour ces précisions.

@+

Zoroastre.
Gné! ;)

zoroastre

#12
Mar 20, 2012, 10:47 pm Last Edit: Mar 20, 2012, 10:51 pm by zoroastre Reason: 1
Yep!

On ne pourrait pas partir sur un pont diviseur 15v -> 5v et une capa avec resistance en série afin de mesurer le temps de décharge du condo ???

15v
  |
  R
  |_____________Digital
  |          |
  R         C
  |          |
Gnd     Gnd

@+

Zoroastre.
Gné! ;)

Latnac

En fait voilà ce que j'aimerais réaliser, c'est un régulateur de vitesse sans capteur. On fait donc une estimation de la vitesse de rotation.

En écrivant que Westimé = (U(p)-Us(p))*F(p) avec F(p) la fonction de transfert des filtres, et en combinant les équations du moteur on arrive à trouver un rapport entre Westimé et Wréel, et donc on a Wréel. Il suffit ensuite de comparer Wréel et Wconsigne pour générer le rapport cyclique. (Si besoin je peux vous joindre la démonstration).

J'ai tapper ce code qui me parait un peu simple, et qui ne prend pas en compte les différent gain présent dans le système.

Code: [Select]
int analogUs = 3;   // tension induit   
int analogU  = 5;    // tension moteur
int out = 9;  // tension de sortie PWM             

int valUs = 0; // variable de type int pour stocker la valeur de la mesure Us
int valU = 0; // variable pour stopcker la valeur de U
int valAlpha = 0; // varible pour stocker la valeur de Alpha
int valWest = 0; // variable pour stocker Westimé
int valWcons = 100 ; // <--- variable pour stocker Wconsigne

void setup()
{
pinMode(out, OUTPUT);   // configure la broche en sortie 9 pour PWM
Serial.begin(9600);      // ouvre le port série à 9600 bauds
}

void loop()
{

valUs = analogRead(analogUs); // lit la valeur de la tension analogique présente sur la broche 3
valU = analogRead(analogU); // lit valeur tension analogique broche 5

valWest = valUs - valU; // valeur de Westimé avec la différence des tensions
valAlpha = (valWcons - valWest) /  valWcons; // valeur de Aplha

analogWrite(out, valAlpha); // sortie branche 9 modulation PWM
  // sortie branche 2 valeur de alpha
  Serial.print(valAlpha);
  Serial.print("\t");
}

Artouste


En fait voilà ce que j'aimerais réaliser, c'est un régulateur de vitesse sans capteur

Vouloir réguler une situation, sans faire de captation,  c'est en l'état impossible  :smiley-mr-green:
il faut à minima boucler quelque part  8) que ce soit ouvert ou fermé  :smiley-mr-green:

Go Up