MOTOR_DRIVER - Kasimashi/Systemes-embarques GitHub Wiki

Moteur pas à pas

Les moteurs à courant continu sont utilisés dans divers domaines, comme la robotique, les imprimantes, la domotique, les équipements médicals etc ... On distingue deux types de moteur à courant continu (DC).

  • Les servo-moteur qui opèrent sur une boucle fermée, il nécéssite un retour sur leurs positions pour accomplir la consigne donnée en position et vitesse. Ils sont plus onéreux que les moteurs pas à pas. On utilise très souvent un PWM pour controler un servo-moteur.
  • Les moteurs pas à pas, qui tournent sur des pas discrets. Il peuvent être controlé en boucle ouverte et ne nécéssite pas de retour de position.

En comparaison avec les moteurs pas à pas, les servo-moteurs sont plus adapté à des applications qui nécéssite une haute vitesse et un haut couple, ou des contraintes plus importantes. Les moteurs pas à pas ont entendance à avoir moins de couple sur des hautes vitesses, et peut même esquiver des pas à haute vitesse, ils ont une vibration aussi plus élevé à cause des vibrations du au mécanisme de pas à pas en lui même. Les moteurs pas à pas sont moins onéreux car il y a moins d'électronique, en partie pas de retour de capteur et ils sont plus facile à faire fonctionner sur un microprocesseur. Ils sont donc plutôt adapté aux application qui n'ont pas besoin de beaucoup d'acceleration, et à charge constante.

Moteur pas à pas bipolaire et unipolaire

Les moteurs pas à pas peuvent être de deux types : bipolaire et unipolaire

  • Un moteur pas à pas bipolaire a besoin d'une source externe d'énergie qui possède les bonnes polarités, comme un pont en H. La source d'énergie peut inverser le sens du courant et la polarité électromagnetic pour l'enroulement de chaques bobines.

Moteur_pas_pas_bipolaire

  • Un moteur pas à pas unipolaire a besoin qu'une source externe d'énergie, et le sens electrique du courant ne s'inverse pas dans l'enroulement des bobines. Le moteur unipolaire utilise la moitié de sa bobine d'enroulement pour générer le champ électromagnétique tandis que le moteur bipolaire utilise une bobine d'enroulement complète. Par conséquent, un moteur pas à pas bipolaire a généralement une capacité de couple plus élevée qu'un moteur unipolaire de même poids. Cependant, un moteur pas à pas unipolaire a un circuit de commande plus simple.

Dans la suite, nous étudirons le moteur pas à pas unipolaire pour montrer comment le controler à l'aide d'un processeur. Nous utiliserons le moteur 38BYJ-48 qui est un moteur pas à pas de 5V et qui possèdes les propriétés suivantes : https://download.mikroe.com/documents/datasheets/step-motor-5v-28byj48-datasheet.pdf

A savoir 4 phases et une résolution de 1/64. (C'est à dire 360/64 = 5,625‬° degrès par pas).

L'angle de pas

Pour chaques pulsation, le moteur tourne d'un pas fixe. Suivant la vitesse du champs dans les bobines le moteur tourne plus ou moins rapidement et on peut aussi controler le nombre de pas à effectuer. L'arbre peut tourner d'un pas complet, d'un demi-pas ou d'une fraction spécifique de pas complet. Ce qu'on appelle le pas complet, le demi-pas et le micro-pas. Lorsque l'arbre tourne d'un pas complet, l'angle qu'il effectue est appelé angle de pas. Nous pouvons calculer l'angle de pas comme suit.

Step Angle = 360° / step per revolution

Avec step per revolution = P * T

Ici P correspond au nombre de phases sur le stator et T le nombre de poles magnétique permanent sur le rotor. Motor_rotor_stator

Par exemple sur la figure ci dessous, il y a 8 paires de poles sur le rotor ; Motor_rotor_poles stepper-motor-optimized

En règle général, un moteur pas à pas possède 2 ou 3 phases le nombre de pas est de l'ordre de 48,72,144,180 ou 200 qui correspond donc à des résolutions différentes.

Le moteur que nous allons utiliser a 4 phases sur son stator, et possède 16 paires de poles. 28BY-J48_rotor

Donc l'angle de pas peut être calculé ainsi :

Step angle = 360° / (4*16) = 5,625‬°

Pour un pas complet, le moteur tourne d'un step angle pour chaques pulsations. Pour un demi-pas il tourne d'un demi step angle. Pour le micro-pas il tourne d'un angle qui correspond à une fraction spécifique du step angle. Le nombre de taux d'impulsions contrôle la position et la vitesse de l'arbre du moteur, respectivement.

Vue éclaté du moteur que nous allons utiliser

28BY-J48_view

Pour plus d'information sur le moteur 28BY-J48 et son démontage se référer à ce lien : https://cookierobotics.com/042/

Stepping Mode

Dans la suite nous distinguerons 4 modes de step différents :

  • Le Wave Stepping
  • Le Full Stepping
  • Le Half Step Drive
  • Le Microstepping

Motor_stepping_mode

Wave Stepping

En tant que méthode de pas à pas la plus simple, le wave stepping allume un interrupteur et alimente une seule phase à la fois. La figure suivante montre la séquence de contrôle de quatre commutateurs de bobine d'enroulement (A, B, C, D). Pour chaque interrupteur, si son signal de commande est élevé, l'interrupteur est activé et le courant électrique circule dans la bobine d'enroulement correspondante. Par exemple lorsque le signal de SW1(A) est haut, la bobine A correspondante est excitée. Le logiciel active ces commutateurs alternativement dans cette séquence de contrôle.

Motor_wave_stepping

Pour simplifier la compréhension, imaginons que notre rotor ai seulement deux paires de poles (en réalité ce n'est pas le cas). Comme dans l'illustration ci dessus le rotor tourne de 90° à chaques impulsions dans les bobines. Ce mode est appelée wave stepping. Une seul bobine est alimenté à la fois. Ceci offre un couple très bas. Cette méthode n'est pas largement utilisé dans les systèmes réels.

Full Stepping

Pendant que la méthode wave stepping alimente une seul bobine à chaques fois, le full stepping alimente deux bobines alternativement. Comme illustré dans l'image ci dessous :

  • Pour faire tourner l'arbre dans le sens horaire les bobines doivent être alimenté dans la séquence AB(-), AB, A(-)B et A(-)B(-).
  • Pour tourner dans le sens antihoraire c'est l'inverse

Motor_full_step

Le Wave Stepping et le Full Stepping font tourner l'arbre d'un angle de pas à chaque fois et ont le même nombre de pas en un tour. Cependant, le Full Stepping produit un couple plus élevé que le Wave Stepping car deux enroulements de bobine poussent ou tirent l'arbre simultanément.

Un exemple de programme embarqué qui permettrait de faire du full stepping de 360° dans le sens des aiguilles d'une montre serait : (Les GPIO sont à définir)

// Full Step : 0b1001, 0b1010, 0b0110, 0b0101
// Each four bits sequence representent the onOFF control of A,¯A, B, ¯B.

unsigned char FullStep[4] = {0x9, 0xA, Ox6,0x5};

for (int j = 0; j<64; j++) { // 64 step * 5,625 = 360
	for (int i = 0; i< 4; i++){ // Sens de rotation clockwize for (int i = 3; i >= 0; i--){ 
		delay(1); // Delay
		GPIOA->ODR[0] = (FullStep[i] & 0x8) >> 3; // A
		GPIOB->ODR[0] = (FullStep[i] & 0x4) >> 2; // B
		GPIOA->ODR[1] = (FullStep[i] & 0x2) >> 1; // ¯A
		GPIOB->ODR[1] = (FullStep[i] & 0x1); // ¯B
	}
}

Half Stepping

Dans ce mode, la séquence d'activation est la suivante : AB¯ , A , AB, B , ¯AB, ¯A, ¯A¯B et ¯B. Nous activons à la fois une bobine et deux bobines alternativement. Ce mode donne moins de couple au moteur que le précédent mode, mais rajoute de la résolution du niveau du step. Il permet de faire tourner l'arbre avec plus de souplesse également.

Dans ce mode on aurait ce programme :

// Full Step : 0b1001, 0b1000, 0b1010, 0b0010, 0b0110, 0b0100, 0b0101, 0b0001
// Each four bits sequence representent the onOFF control of A,¯A, B, ¯B.

unsigned char HalfStep[8] = {0x9, 0x8, OxA,0x2, 0x6, 0x4, 0x5, 0x1};

for (int j = 0; j<64; j++) { // 64 step * 5,625 = 360
	for (int i = 0; i< 8; i++){ // Sens de rotation clockwize for (int i = 3; i >= 0; i--){ 
		delay(1); // Delay
		GPIOA->ODR[0] = (HalfStep[i] & 0x8) >> 3; // A
		GPIOB->ODR[0] = (HalfStep[i] & 0x4) >> 2; // B
		GPIOA->ODR[1] = (HalfStep[i] & 0x2) >> 1; // ¯A
		GPIOB->ODR[1] = (HalfStep[i] & 0x1); // ¯B
	}
}

Micro Stepping

Comme introduit précédent, un microcontroleur peut controler un moteur pas à pas avec plusieurs modes différents. Mais ces derniers produises des mouvements sacadés et bruité du moteur. Le micro stepping consiste à utiliser un signal PWM pour faire des rotations full step, de 1/4, 1/8, 1/16, 1/32 de full step.

Le Micro stepping divise a full step en des multiples de step plus petit. Cela permet de faire bouger l'arbre d'angle plus petit et d'effectuer un mouvement plus lisse et de réduire le problème de bruit et de vibration.

Le but du micro stepping est d'ajuster l'intensité électrique dynamiquement dans chaques bobines pour produire des accélérations ou des décélérations. Pour cela l'utilisation d'un PWM pour générer un signal binaire rapide avec un duty cycle approprié permet d'ajuster l'amplitude du voltage envoyé dans les bobines. Le voltage appliqué dans une bobine est proportionnel au courant dans ces dernières.

Sine cosine micro stepping est une méthode largement utilisé pour ajuster la tension l'amplitude dans chaques bobines. Quand deux bobines a et b sont exité simultanéments : Le couple magnétique statique global généré par les deux enroulements est : $T= -k i_{a} \sin(\theta) + k i_{b} \cos(\theta)$

Ou k est une constant, $\theta$ est l'angle mécanique de l'arbre depuis la position du dernier pas et ia et ib sont le courant électrique dans les bobines a et b

Lorsque l'arbre reste à un angle stable, la force de couple est équilibrée, et nous avons donc T = 0, en micro stepping (sine-cosine) pour rendre la force de couple globale nulle, nous pouvons définir un courant électrique dans les deux enroulements comme suivre :

$$i_{a} = I_{m} \cos(\theta) i_{b} = I_{m} \sin(\theta)$$

ou $I_{m}$ est une constante par conséquent, le couple magnétique statique global est :

$$T = -k i_{a} \sin(\theta) + k i_{b} \cos(\theta) = -kI_{m} \cos(\theta)\sin(\theta) + kI_{m} \sin(\theta)\cos(\theta) = 0$$

Les microprocesseurs utilisent des ondes sinusoïdales et cosinus discrètes pour piloter les deux enroulements.

Motor_micro_stepping

Supposons que l'autoreload register du timer (ARR) est 1000, le software devrait mettre le capture register (CCR) à la séquence suivante pour un step 1/4 :

uint16_t CCR_MicroStepping[] = {0, 383, 703, 924, 1000};

Pour un step 1/2 le CCR devrait être :

uint16_t CCR_MicroStepping[] = {0, 707, 1000};

Pour un step 1/8 le CCR devrait être :

uint16_t CCR_MicroStepping[] = {0,195,383, 557, 707, 832, 924, 981, 1000};

Motor_micro_stepping_circle

Driving a Stepper Motor

Comme montré ci dessus : On ne peux pas directement alimenter un moteur pas à pas à partir des broches GPIOs parce que les ports GPIOs ne peuvent pas fournir assez de courant requis par le moteur. Il est important de séparer les deux parties (commandes et puissance). La sortie maximum en courant d'une broche GPIO est de l'ordre de 10 mA. Le moteur utilisé ici a une resistance interne de 50 $\Omega$. Donc le moteur a besoin de $i=5V/50\Omega=100mA$ Le courant de sortie est donc pas assez fort pour alimenter le moteur. Le software devrait aussi configurer les broches GPIOs en mode push-pull.

Une autre raison importante de ne pas brancher les GPIOs sur le moteur directement est que le moteur pourrait renvoyer sa force electromotrice dans le circuit quand ce dernier ralenti ou acclère. Ceci génère une tension qui renvoi du courant qui est rebalancé dans la carte et qui pourrait endommager le microprocesseur.

28BY-J48_wiring

Dans le schéma nous pouvons utiliser aussi un driver 8 channel Darlington pour controler le moteur. (ULN2003 : https://www.st.com/resource/en/datasheet/uln2001.pdf) L'ULN est un réseau de transistors Darlington haute tension et courant élevé, qui se compose de huit paires Darlington NPN. Chaque paire Darlington peut collecter des courants jusqu'à 500mA. La broche de sortie peut supporter au moins 50 V à l'état éteint. Des diodes de suppression sont incluses pour la commande de charge inductive. Les sorties peuvent être mises en parallèle pour une capacité de courant élevée.

Pour chaque paire de darlington, si une tension positive élevée est appliquée à la broche d'entrée, la sortie correspondante est mise à la terre et elle peut tirer le courant électrique jusqu'à 500 mA. Si la broche d'entrée a une alimentation basse tension, la broche de sortie correspondante ne peut pas drainer de courant, une broche d'entrée ne prend qu'environ 1 mA de courant.

Motor_ULN2003

⚠️ **GitHub.com Fallback** ⚠️