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