paulfjujo a écrit :Source du message Si le PIC commande les moteurs en envoyant des pulses à chacun, je ne vois pas comment cela puisse être simultané
à moins que le PIC maitre, sous traite l'envoi des corrections pulses à 2 petits PIC esclaves qui se chargeront chacun d'envoyer les pulses X et Y
Dans mon ancien programme, j'activais X, Y en même temps.
j'avais au total 10 fonctions
moteur Z aller
moteur Z retour
moteur X aller
moteur X retour
moteur Y aller
moteur Y retour
moteur X et Y diagonal à gauche en haut
moteur X et Y diagonal à droit en haut
moteur X et Y diagonal à gauche en bas
moteur X et Y diagonal à droit en bas
Comme pour un Pixel sur un écran, 2 moteurs pas à pas X, Y ne peut avoir plus de 8 directions à partir de son point d’origine
Pour faire cette manœuvre avec deux moteurs unipolaires(en diagonal à 45° pris comme exemple).
il faut utiliser le même PORT sur le pic pour les axes X, Y (4 sorties par moteur unipolaire pour mon cas)
Faire 10 fonctions comme décrit plus haut, qui avance d'un pas pour chaque donnée
C'est l'ordinateur qui donne l'ordre des directions, chaque direction correspond à un pas moteur pour chaque choix.
On n'est pas obligé de prendre un ordinateur, une lecture de carte SD peut suffire.
Par exemple si on choisi la direction de : diagonal à gauche en haut
moteur X recul de 1 pas, et moteur Y recul d'un pas, mais tout se fait en même temps
En code ASM non optimisé, ça peut donner ça
Code : Tout sélectionner
;****************** actionner moteur 1 et 2 en diagonal à gauche en haut *******************
action_7
bcf INTCON,GIE ; couper toutes les interruptions
call reactiver_A ; réactiver le PORTA pour maintien des moteurs
movwf temps ; sauvegarde du PORTA dans temps pour utilisation
movwf tmps ; sauvegarde du PORTA dans tmps pour utilisation
; bits qui sont utilisés pour moteur 1 sens gauche
; | | | |
; | | | |
; V V V V
; 7 6 5 4 3 2 1 0 <---- emplacements des bits
bcf temps,7 ; mettre le bit 7 à zéro
bcf temps,6 ; mettre le bit 6 à zéro
bcf temps,5 ; mettre le bit 5 à zéro
bcf temps,4 ; mettre le bit 4 à zéro
call recheche_gau ; sens de rotation à gauche
btfsc tmps,7
bsf temps,7
btfsc tmps,6
bsf temps,6
btfsc tmps,5
bsf temps,5
btfsc tmps,4
bsf temps,4
movf temps,W ; transfère temps dans W
movwf tmps ; copie temps dans tmps pour utilisation
swapf temps,1 ; mets les bits du poids faible dans les bits du poids fort
; bits qui sont utilisés pour le moteur 2 sens gauche
; | | | |
; | | | |
; V V V V
; 7 6 5 4 3 2 1 0 <---- emplacements des bits
bcf temps,7 ; mettre le bit 7 à zéro
bcf temps,6 ; mettre le bit 6 à zéro
bcf temps,5 ; mettre le bit 5 à zéro
bcf temps,4 ; mettre le bit 4 à zéro
call recheche_gau ; sens de rotation à gauche
swapf temps,1 ; mets les bits du poids faible dans les bits du poids fort
btfsc tmps,3
bsf temps,3
btfsc tmps,2
bsf temps,2
btfsc tmps,1
bsf temps,1
btfsc tmps,0
bsf temps,0
movf temps,W
movwf PORTA ; mets en fonctionnement les 2 moteurs d'un pas
movwf toucherA ; sauvegarde pour coupure des ports si non utilisé
bsf INTCON,GIE ; on réactive les interruptions
return
Les deux sont fait en même temps, avantage on peut régler la vitesse du déplacement des moteurs via l'ordinateur.
Il est vrai quand théorie cela reste impossible à réaliser de synchroniser 2 moteurs à la même vitesse, les deux méthodes
se discute, celle de F6FCO ou celle là.
A suivre ......
A+