Faire joujou avec un moteur pas à pas

Présentation

Moteur pas à pas type industriel

Le moteur pas à pas est un type particulier de moteur. On l’utilise quand on a besoin d’une précision angulaire. Et on en rencontre un peu partout! Par exemple, pour ceux qui ont déjà eu le bonheur de démonter une imprimante ou un scanner, les moteurs avec pleins de fils sont des moteurs pas à pas. Il y en a aussi dans les disques durs, les CNC, les distributeurs de boissons, les lecteurs disquettes… très certainement dans Bender aussi, faudra lui demander.
En fait le moteur pas à pas est constitué de plusieurs bobines sur lesquelles ont va appliquer les impulsions. On va ainsi faire tourner le moteur d’un certain angle.

À l’intérieur, les différentes bobines

L’avantage du moteur pas à pas est justement la précision angulaire. Certains moteurs pouvant descendre à moins de 0,5° de précision (là, ça en fait des bobines!  :P ).
En revanche il faut obligatoirement un circuit numérique pour le commander.

Encore une fois je préfère aiguiller vers le lien Wiki, sur lequel le fonctionnement est vachement mieux expliqué! Voici aussi une animation Flash détaillant les étapes des commandes.

Le but

Le but ici va être de faire le programme qui pilotera le moteur en mode pas complet et demi-pas.

Le moteur

Le moteur est un moteur 4 phases unipolaire (5 fils) récupéré dans une vielle imprimante. Plus précisément un M35SP-7T. Pour ceux qui ont lu l’article Wikipedia (ou qui connaissent déjà les moteurs pas à pas), c’est donc un moteur dit à point commun, et ça tombe bien, c’est plus simple à utiliser! :mrgreen:
Il a une résolution de 7,5° (en mode demi-pas) et en cherchant un peu sur le net, on se rend compte qu’il est en fait très courant.

Mon moteur

Il s’alimente normalement en 6V. N’ayant qu’une alim 5V sous la main, ça fera très bien l’affaire! :D

Le schéma

Le schéma est très simple. Les sorties du micro-contrôleur sont reliées au moteur à travers un ULN2003, qui sert à amplifier en courant les signaux. Sinon le micro ne pourrait pas fournir assez de courant et grillerait (ça serait dommage  :? ).
Voici donc le schéma que j’ai piqué sur un autre site :roll: :

schéma moteur pas à pas

Schéma de câblage

 

Concernant le brochage le point commun est le fil rouge. On le trouve à l’ohmmètre: c’est la broche ou l’on mesure toujours 40Ω entre elle et n’importe quelle autre broche. Et les autres broches sont par déduction les quatre phases.

Le micro-contrôleur utilisé est un ATmega48 mais n’importe quel micro AVR fonctionnera. Il suffit de réaffecter les E/S et/ou les registres.

Le programme

Le programme est basé sur une machine à état. Chaque fois que le compteur atteint une certaine valeur (définie dans OCR0A) il recommence à 0 et une interruption est levée.

CTC mode

CTC pour Clear On Compare Match

L’intérêt est de faire varier la fréquence de l’interruption, et donc la vitesse de rotation du moteur. Parce que c’est dans cette interruption que les différentes phases du moteur sont pilotées, selon l’état.
Ce réglage se fait avec à un potard branché en diviseur de tension sur l’entrée ADC5 du µC. La valeur de OCR0A change en fonction du potard (OCR0A = ADCH).

On peut définir au préalable le mode de fonctionnement du moteur: mode pas complet ou demi pas. Ça se fait en commentant ou non la ligne #define FULL_STEP_MODE_ON (ligne 55).
Dans notre cas en mode pas complet (lien wiki), on a le maximum de couple parce qu’on active deux phases à chaque fois:

switch(State)
{
case 0: P1_ON; P2_OFF; P3_ON; P4_OFF;    break;
case 1: P1_ON; P2_OFF; P3_OFF; P4_ON;    break;
case 2: P1_OFF; P2_ON; P3_OFF; P4_ON;    break;
case 3: P1_OFF; P2_ON; P3_ON; P4_OFF;    break;
}

Et en mode demi pas (re lien wiki), on a huit états:

switch(State)
{
case 0: P1_ON; P2_OFF; P3_OFF; P4_OFF;    break;
case 1: P1_ON; P2_OFF; P3_OFF; P4_ON;    break;
case 2: P1_OFF; P2_OFF; P3_OFF; P4_ON;    break;
case 3: P1_OFF; P2_ON; P3_OFF; P4_ON;    break;
case 4: P1_OFF; P2_ON; P3_OFF; P4_OFF;    break;
case 5: P1_OFF; P2_ON; P3_ON; P4_OFF;    break;
case 6: P1_OFF; P2_OFF; P3_ON; P4_OFF;    break;
case 7: P1_ON; P2_OFF; P3_ON; P4_OFF;    break;
}

State est incrémenté à chaque fois. Il a pour valeur max STEP_NBR qui vaut soit 3 soit 7, et dépend donc du mode de fonctionnement.

if(State >= STEP_NBR)
State = 0;
else
State++;

Petite remarque: Je pense qu’il y a moyen de pousser un peu plus l’algo en faisant des opérations booléennes. Par exemple un truc un peu comme ça:

Sortie = 0b1010;

if(State%2)    // 0 ou 2
{
if(Sortie%2)    // = 10
Sortie -= 1;
else                    // = 5
Sortie +=1
}
else    // 1 ou 3
...

PORTD = sortie & 0X0F;

… mais en plus optimisé. :mrgreen:
Et puis bon là je n’avais pas envie de me mixer les neurones (y’en a plus beaucoup en plus) donc j’ai fait au plus simple mais pas forcément le plus optimisé niveau mémoire de programme.

Par contre j’aurai très bien pu aussi faire:

switch(State)
{
case 0: PORTD = 10 & 0X0F;    break;
case 1: PORTD = 9 & 0X0F;    break;
case 2: PORTD = 5 & 0X0F;    break;
case 3: PORTD = 6 & 0X0F;    break;
}

Et je ne sais pas pourquoi je ne l’ai pas fait d’ailleurs… :roll:

La partie Init n’a rien de folichon, juste le paramétrage de l’ADC sur PC5 (broche 28), et du TIMER0 en mode CTC.

Le projet était à la base destiné à une bobineuse de micros magnétiques. C’est pourquoi il y a deux boutons poussoirs connectés (à la base 5 mais je n’ai laissé que ceux utiles).
Les E/S sont configurées en entrées, et les pull up sont activées. Ça permet de simplifier le câblage, on a juste à relier le BP à la masse:

Câblage bouton poussoir µC

Câblage d’un bouton poussoir sur le µC

L’un permet de démarrer le moteur (PLUS), l’autre permet de l’arrêter (MINUS). En réalité on ne fait que démarrer l’interruption, et l’arrêter.

Observances

Il est marrant (oui c’est marrant on a dit) de voir les limites du moteur pas à pas. Si on augmente de trop la fréquence il commence à sauter des pas et faire des soubresauts. Et si on augmente encore la fréquence ça devient n’importe quoi! On à même l’impression qu’il tourne dans l’autre sens.

Sources

Le main.c se trouve ici, son header ici. J’avais commencé à faire des fichiers interrupt.c et .h mais le programme n’est pas assez complexe.

Photos? Vidéos?

Je n’ai pas de photos à part celles du moteur lui même. Mais bon il n’y a rien de particulier dans le montage que j’ai fait sur plaque d’essai :| .
J’aurai bien aimer faire une vidéo (même s’il n’y a rien d’extraordinaire) mais c’est que j’ai cramé mon ULN2003 avant de pouvoir en faire une :roll: . Et puis il y a pleins d’exemples semblables sur l’Internet!
Au moins maintenant, je sais contrôler un moteur pas à pas! Faut juste que j’utilise la bonne alim pour pas cramer les composants… :mrgreen:

Lien Permanent pour cet article : http://mootronic.fr/bidouilles/pas-a-pas

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Captcha Captcha Reload