commande moteur pas a pas, a l'attention de pieM

duschmaulle

New Member
bonjour,
dans un post datant du 04/03/2011, vous faites allusion a la carte CHI035, pour commander des moteur pas a pas, ainsi qu'a un schéma que vous utilisez, pouvez-vous, svp, me communiquer ce schéma?
D'autre part j'envisage peut-etre d'utiliser un l298, toujours pour mon projet de faire tourner le moteur dans un sens, puis arrivé a un certain point faire changer le sens, et pouvoir aussi faire varier la vitesse.
Pouvez-vous m'aider dans la programmation, je débute dans ce domaine et ne maitrise vraiment pas du tout?
D'avance merci pour vos réponses.
Salutations
 

PieM

Senior Member
Bonjour,

Ce qu'il faut avant tout c'est définir le type de moteur PaP à utiliser, et ce, en fonction de l'application.
Un moteur est défini par sa tension, son couple, et le nombre de pas par tour.
Sa commande est fonction de son type: unipolaire, ou bipolaire.


Le plus simple est l'unipolaire car les enroulements sont traversés par un courant qui est toujours dans le même sens.
Ainsi, la carte CHI035 peut commander des moteurs unipolaires assez puissants via ses 4 transistors Mosfet.

Un moteur bipolaire nécessite que chaque enroulement soit commandé par un pont en H, le courant changeant de sens.
Le L293D du CHI035 peut donc commander ces moteurs si ils ne sont pas trop puissants.
Le L298 permet lui de commander un moteur unipolaire un peu plus puissant.

Il est important de savoir que angle de rotation, sens de rotation et vitesse sont entièrement défini par le programme de commande et non par le type de circuit driver.

Un moteur bipolaire n'a que 4 fils de connexion
un unipolaire peut avoir 5 fils ou 6 fils: dans le cas de 6 fils, il peut aussi fonctionner en bipolaire.
voir ici : un peu de doc

A priori, je vous conseillerai le plus simple et le plus économique: un moteur unipolaire, commandé par l'intermédiaire des 4 Mosfets de la carte CHI035
(autorisant jusqu'à 8A alors que le L298 est limité à 2A)

Choisissez le moteur en donnant la référence, et nous verrons comment mettre ça en musique à partir d'une carte CHI035.
Je vous donnerai des programmes pour le faire fonctionner sous tous les modes, à n'importe quelle vitesse.

Une petite photo montrant le câblage entre une carte Picaxe High Power V3 et un PaP unipolaire: IMG_0952.JPG

Nota: Si vous n'avez pas encore fait l'acquisition de la carte CHI035, commandez bien la nouvelle CHI035a qui est adaptée au 18M2 et qui comporte une amélioration au niveau des Mosfet. La doc traduite en français est là :-Doc-CHI035a-in-french
 
Last edited:

PieM

Senior Member
Bonjour,

Sur ce moteur bipolaire qui est relativement puissant, le L293D risque d'être un peu juste en fonction de la tension d'alimentation. (qu'il ne faut pas confondre avec la tension nominale de 3.3V) Faire des essais déjà sous 5V.
La première chose à faire est de repérer les connections: avec un ohmmètre, associer les câbles par paire, chaque paire devant être liée au même bobinage soit environ 4 ohm.
Avez vous la carte CHI035 équipée d'un L293D ?
 

duschmaulle

New Member
Bonjour,
Merci pour toutes vos informations.
Non je n'ai pas encore acheté la carte CHI035, je vais la commander aujourd'hui, par contre j'ai déja repéré les bobinage sur mon moteur.
Salutations
 

PieM

Senior Member
Bonjour,

Voici alors un programme qui montre tous les modes de fonctionnement du moteur: demi pas, pas complet un enroulement, pas complet 2 enroulements.

Le principe retenu est d'écrire en eeprom, la séquence de commutation nécessaire au fonctionnement par demi pas:
eeprom 0,(%1010,%1000,%1001, %0001,%0101,%0100,%0110,%0010)

Selon le mode de fonctionnement souhaité, il suffit d'aller lire séquentiellement la phase souhaitée:
chaque valeur pour le fonctionnement en demi pas,
une valeur sur deux pour le fonctionnement pas complet 2 enroulements : eeprom 0,(%1010,%1000,%1001, %0001,%0101,%0100,%0110,%0010)
une valeur sur deux pour le fonctionnement pas complet 1 enroulements en commençant avec un décalage de 1 : eeprom 0,(%1010,%1000,%1001, %0001,%0101,%0100,%0110,%0010)

Si on utilise le L293 de la carte CHI035, ce driver est commandé par les sortie B.4 à B.7 du picaxe 18M2

La phase souhaitée doit donc s'appliquer sur les bits de plus fort poids de outPinsB, représentant l'activation des sorties. Il faut donc décaler de 4 bits la valeur de la phase, ce qui se fait en multipliant par 16 la valeur.
Par exemple: %1010 * 16 va donner %10100000

Toutefois les sortie B.0 à B.3 peuvent être utilisées par ailleurs. Il est important de ne pas les écraser en affectant directement ce résultat à outPinsB
Il faut donc masquer B.0 à B.3 lors de l'affectation des changements des sorties B.4 à B.7.

Ceci se fait simplement par:

OutpinsB = OutpinsB AND %00001111 OR %10100000 (par exemple)
en pratique dans le programme : MOT = MOT & 0F | b1 , b1 représentant la séquence à appliquer sur les sorties.

Un moteur pas à pas est en principe commandé en donnant comme consigne le nombre de pas.
Dans votre cas , selon la demande initiale, 15 pas sur 40 correspondrait à 18 pas complets du moteur qui en comporte 48.

Si on suppose vouloir faire x pas, il suffit d'incrémenter un compteur, ou le décrémenter pour changer de sens.

la relation entre ce compteur et l'adressage en eeprom doit n'autoriser qu'un comptage de 0 à 7, nombre d'élements à lire en eeprom.
Donc le compteur sera limité à 8 en ne prenant en compte que les 3 bits de poids faible. Cela se fait par un ET logique entre la valeur compteur et %00000111.
Dans le programme, b0 = b0 & %00000111.

Le programme principal ci joint montre tous les modes de commande, en démo.
Un programme définif en fonction de l'utilisation réelle , sera plus réduit et pourrait être encore optimisé.

Le principe est également de définir initialement, pour chaque mouvement, les paramètres de nombre de pas, de vitesse, et de mode, en tant que variable.

Il est très possible (non montré ici) de faire que la variable vitesse (plus exactement période) soit incrémentée, ou décrémentée à l'intérieur de la boucle d'appel de chaque pas.
Ainsi une commande en accélération , ou décélération peut se faire facilement, tout en respectant un nombre de pas.

Encore plus simplement, il est possible bien sûr de commander ce moteur en continu avec une boucle sans fin .

Concernant la vitesse, elle est définie par la période d'attente à chaque pas (nommée period dans le programme)
Elle est indiquée ici en ms car elle est un argument de l'instruction pause.
Il est possible de réduire cette durée en utilisant des 1/100 de ms à condition de changer pause par pauseus

J'utilise ce même code, sans presque de modification pour un moteur unipolaire.

Une carte CHI035 équipée d'un L293D et de ses 4 Mosfet peut donc facilement commander simultanément un moteur Bipolaire et un Unipolaire, les deux utilisant les sorties B.0 à B.7 du picaxe.

J'ai été un peu long, mais ce programme nécessite quelques éclaircissements... peut être d'autres à venir ! :)


Code:
'===================================================
'Commande moteur PAP bipolaire 
'18M2 sur CHI035 Driver L293D
' connections moteur : sur A et B du L293D 
'===================================================
#picaxe 18M2
'===================================================

symbol MOT = outpinsB	'MOT correspond au portB du 18M2
symbol period = W1 	'temps entre pas en 1/100 de ms
symbol nbpas = W2		'Nombre de pas	
dirsB= %11110000		'affectation B.4 à B.7 en sortie vers le L293

'mémorisation de la sequence de commande pour le moteur en demi pas
eeprom 0,(%1010,%1000,%1001, %0001,%0101,%0100,%0110,%0010)

'prg principal ==============================
princ: 

do
	'mise hors tension du moteur pendant 3 sec.
	Mot = Mot & $0f | %00000000 
	pause 3000
	
	'actionne 100 demi-pas dans un sens avec une vitesse donnée
	period = 5 : nbpas = 100
	for w10 = 1 to nbpas
	inc b0
	gosub PAS
	next
	
	'actionne 100 demi-pas dans l'autre sens avec une autre vitesse
	period = 20 : nbpas = 100
	for w10 = 1 to nbpas 
	dec b0
	gosub PAS
	next
	
	pause 500
	
	'actionne 50 pas dans un sens avec une vitesse donnée
	period = 20  :nbpas = 50: b0 = 0 'va lire une séquence (paire) sur deux (mode 2 enroulements alimentés)
	for w10 = 1 to nbpas  
	b0 = b0+2
	gosub PAS
	next
	
	'actionne 50 pas dans l'autre sens avec une autre vitesse et un autre mode
	period = 50 :nbpas = 50: b0 = 1'va lire une séquence (impaire) sur deux (mode 1 enroulement alimenté)
	for w10 = 1 to nbpas  
	b0 = b0-2
	gosub PAS
	next

loop

PAS: ' Commande d'un pas, ou demi-pas ******************

	b0 = b0 & %00000111 'la valeur de b0 est limitée à 3 bits, soit 0 à 7 
	read b0, b1		' va lire la séquence 0 à 7 dans l'eeprom.
	b1 = b1*16		'decale  de 4 bit pour être au niveau de b.4 à b.7
	Mot = Mot & $0f | b1 	'envoi de cette séquence au moteur en masquant  les b.0 à b.3 
	pause period 		'pause en ms   (ou 1/100 de ms si pauseus)
return
 

duschmaulle

New Member
Bonjour,

grand merci pour tout ces renseignements et explications.
Je vais analyser tout ca, et faire des essais des que j'aurais recu ma carte CHI035.
Je vous tiens informé.
Salutations
 

PieM

Senior Member
Bonjour,

correction:
dans le code il faut lire :
symbol period = W1 'temps entre pas en ms
au lieu de symbol period = W1 'temps entre pas en 1/100 de ms


Lorsque vous ferez des essais, si le moteur vibre au lieu de tourner, il suffit d'inverser 2 fils sur un des enroulements.

Et n'hésitez pas à demander des explications sur ce qui vous paraît confus ...
 

duschmaulle

New Member
re bonjour,
j'ai voulu essayer de saisir votre programme sur "picaxe programming editor"et il s'avère que l'instruction "OUTPINS " n'est pas reconnu, j'ai un message d'erreur de syntaxe, et je n'ai pas trouvé, non plus cette instruction dans le manuel, je ne trouve que l'instruction "OUTPUT", j'ai voulu essayer avec mais j'ai toujours une erreur.
Pouvez-vous m'aider svp?
Salutations
 

PieM

Senior Member
Bonjour,

Outpins n'est pas une instruction. Il s'agit d'une variable qui définit l'état des sorties sur un port donné (A, B, C) . Voir le manuel 2 page 27.

Dans le cas présent, mon programme fait état de outpinsB

Faites des copier/coller :rolleyes:
 

PieM

Senior Member
Bonjour,

Je me dois de compléter par l'aspect puissance de ce montage, c'est à dire le lien entre le L293D et le moteur, et l'explication de la tension d'alimentation de 5V dont j'ai parlé.

Le moteur est donné pour 750 mA ce qui correspond bien à la tension nominale de 3.3V / résistance de 4.4 Ohm. Ce courant est le courant que peut supporter en continu le moteur, au point de vue échauffement. Il est donc important de ne pas le dépasser , en cas de blocage du moteur par exemple.

L'autre limitation est liée à l'utilisation du L293D qui lui, admet 600 mA maxi en continu.
Afin de ne pas dépasser cette valeur, le moteur doit donc être alimenté au maxi sous 4.4 * 0.6 = 2.6 V

Au lieu de réduire la tension d'alimentation, on peut profiter d'une astuce qui permet d'améliorer le fonctionnement du moteur.

Un enroulement de moteur peut être considéré comme une inductance en série avec une résistance. A l'établissement de la tension d'alimentation, le courant ne va pas atteindre instantanément sa valeur nominale, mais le fera avec un retard qui est fonction de L/R L étant l'inductance et R la résistance.

Pour réduire, cette constante de temps, il suffit donc d'augmenter R par une résistance additionnelle.

Dans notre cas , cette résistance peut donc être calculée pour avoir 2.6 V sur le bobinage moteur, à partir d'une tension "standard" de 5V.
(cette tension n'ayant pas besoin d'être régulée, mais simplement filtrée.)

La résistance calculé sera donc de 5V / 0.6A - 4.4 ohm soit 3.9 ohm

l'inconvénient de cette méthode est que cette résistance additionnelle est une perte d'énergie, et dissipera 2.4* 0.6 soit 1.5 Watt

Par contre, l'amélioration sera très sensible sur le fonctionnement du moteur, puisque sa constante de temps sera presque divisée par 2.

Le schéma de branchement du moteur sera donc de mettre en série sur chaque enroulement, une résistance de 3.9 Ohm, 2W (non bobinée).

Mot_PaP.jpg

Nota: En pratique, le L293 ayant une chute de tension pouvant atteindre 2.6 V , il est fort possible que cette résistance soit trop importante. Soit augmenter la tension d'alimentation, soit supprimer la résistance, mais en fonction des essais et mesures....

Le fait de mettre un L298 n'apportera que la possibilité d'alimenter le moteur sous ses 3.3V nominaux et son courant de 750 mA.

Par contre, si l'on veut obtenir les caractéristique maxi d'un moteur (couple et vitesse), il faut travailler avec l'ensemble L298 et son pilote L297.
Ces circuits permettent en effet d'assurer une alimentation optimum d'un PaP en régulant le courant dans les bobinages moteur, par une tension d'alimentation variable, pilotée par un PWM dans le L297. Le moteur est ainsi alimenté sous une tension beaucoup plus élevée lors de l'établissement du courant.

C'est pour cela que les moteurs Pap sont définis avec deux tensions: celle liée au fonctionnement statique ( courant maxi dans R, ici 3.3V) et une tension maxi d'alimentation, qui est de 36V pour ce même moteur ASTROSYN !

Ce principe est utilisé dans tout ce qui est commande numérique par exemple.

L'avantage du L297 est qu'il est commandé très simplement à partir du picaxe, qui n'a plus à gérer les séquences de pas, gestion faite par le L297.
les seules paramètres à fournir sont le sens, le mode (pas entier, demi-pas) un signal d'horloge, chaque pulse négatif engendrant un pas moteur.

Il est important donc de bien connaître les caractéristiques de son moteur en terme de courant, de couple, de résistance, de tension nominale et maxi.
Choses que de nombreux revendeurs ne se donnent malheureusement pas la peine d'indiquer.
Si des caractéristiques importantes manquent, le risque est d'avoir un moteur trop faible pour l'application, de faire fumer le moteur, et /ou transformer le circuit driver en grille pain. :rolleyes:

that's all, folks !
 
Last edited:

fuse

Senior Member
Bonjour PieM,
Merci pour ces informations très intéressantes, j'ai encore beaucoup à apprendre sur les moteurs pàp...:)
L'utilisation de l'eeprom est particulièrement bien vu et j'espère bien avoir le temps de l’intégrer dans un futur tuto....
Cordialement
 

PieM

Senior Member
Bonjour fuse,

Merci.
Si tu dois faire un tuto sur cela, n'hésite pas bien sûr à utiliser tout ce qui peut servir de mon post. Nous sommes là pour partager nos connaissances ! :)
Le principe d'écrire en eeprom les séquences n'est toutefois peut être pas la plus rapide en terme de vitesse d'éxécution, donc de vitesse de rotation des moteurs.
J'avais commencé à voir une autre méthode, mais je n'ai pas eu le temps de la mener au bout, suite à une panne d'oscillo.

Ce qui pourrait être intéressant est de faire ce que les anglo-saxons appellent des "code snippets", c'est à dire des petits bouts de programme, qui peuvent être intégrés dans des programmes plus importants, chacun gérant un problème particulier.

Bien cordialement
 

fuse

Senior Member
Bonjour à tous,

A propos des ''code snippets'', voila une option de qui n'existe pas sur PE en mode flowchart ou Logicator : le fait d'importer et d'exporter un sous-programme...
Cette option permet d'écrire des sous-programme facile à intégrer dans un nouveau programme.
Pour ceux qui connaissent logipic, c'est vraiment très facile à utiliser pour la ''mutualisation''.:)
Pour ceux qui connaissent le NXT Programming de lego, il existe aussi la possibilité d'écrire une suite de commande et des les regrouper en une commande spécifique....

Cordialement
 
Top