filetage avec microcontrolleur

  • Auteur de la discussion vibram
  • Date de début
S

saico

Apprenti
En pratique un seul top de départ est suffisant pour faire un filetage si on estime que les vitesses de rotation et d’avance sont constantes, et c’est ce que la plupart des amateurs utilisent pour faire le filetage avec des les soft populaires ( mach3, linuxCNC, Galaad avec des cartes Axemotion ou InterpCNC, et autres …). Les gens sont satisfaits tout simplement mais le mode suiveur de position avec codeur haute résolution offre plus de précision même en cas de vitesse non régulière, et je croix qu’il offre même à l’opérateur la possibilité de varier ou changer manuellement la vitesse de rotation de la broche et même l’arrêter ( faire une pause ) et la redémarrer pendant l’usinage « on-fly » et ça… les usineurs l’apprécieront certainement !
 
S

stef1204

Compagnon
En pratique un seul top de départ est suffisant pour faire un filetage si on estime que les vitesses de rotation et d’avance sont constantes, et c’est ce que la plupart des amateurs utilisent pour faire le filetage avec des les soft populaires ( mach3, linuxCNC, Galaad avec des cartes Axemotion ou InterpCNC, et autres …)

Si le top de synchro suffit pourquoi se compliquer la vie?:smt021

Je ne vois pas l’intérêt d’arrêter de fileter en plein milieu du pas, la reprise ne va être très belle… :smt077
 
E

erolhc

Guest
Galaad a dit:
Gawain permet d'intégrer au dessin des filetages horizontaux ou coniques, sans tenir compte du fait que votre tour numérique sera ou non capable de les réaliser. Si le moteur de rotation de votre tour n'est pas indexé ou sa vitesse non asservie, le tournage ne pourra produire que des pièces parfaitement symétriques sur l'axe de rotation, excluant de fait les filetages. L'indexation du moteur suppose bien évidemment que la commande numérique qui gère le tour soit capable effectuer un mouvement soumis à synchronisation externe, fonction assez peu répandue. Une indexation typique consiste à monter sur le moteur du tour un encodeur ou un disque optique retournant le compte précis des impulsions à la carte de commande, via un diviseur ou un multiplicateur de fréquence. Il reste possible de fileter sans indexation, sous réserve d'avoir un variateur de broche très précis ou disposant de sa propre boucle fermée de contrôle de la vitesse de rotation.

Dans la pratique Galaad préconise au moins un encoder de 100 imp
 
V

vres

Compagnon
je l’ai expliqué la broche est réglé par l’horloge de 50hz ultra stable très divisé rendant

A condition d'avoir un moteur synchrone.
Si le top de synchro suffit pourquoi se compliquer la vie?:smt021

Je ne vois pas l’intérêt d’arrêter de fileter en plein milieu du pas, la reprise ne va être très belle… :smt077

Tu as probablement raison, je pense que cette solution peut intéresser Vibram, si le code est si simple tu peux lui proposer un petit exemple , ça peut aussi servir à d'autre.
 
S

stef1204

Compagnon
Tu as probablement raison, je pense que cette solution peut intéresser Vibram, si le code est si simple tu peux lui proposer un petit exemple , ça peut aussi servir à d'autre.

Un exemple de code utilisé à plusieur centaine d'exemplaires ici
 
G

gaston48

Compagnon
Ça c'est de la vraie synchro
 
Dernière édition:
V

vibram

Compagnon
La solution proposée par CHlore et CNCSERV me semble idéale, je vais voir pour la mettre en oeuvre
Je suis encore très juste niveau parametrage des deux codeurs (jen mets un pour le moteur afin de palier le probleme de perte de pas)
Entre temps c'etait mon dernier soir de formation d'usinage j'en ai profité pour fraiser le support du codeur de broche
ca vient au cul du schaublin 102, ca se monte tip top :wink:

IMG_20170627_215030.jpg


IMG_20170627_215039.jpg
 
V

vibram

Compagnon
Bonsoir à tous
Je précise que je suis vraiment vraiment en phase d'apprentissage avec ce MCU et je galere (le mot est faible)

Je suis arrivé à mettre 2 encodeurs qui semblent correctement fonctionner, ca n'a l'air de rien mais c'est une petite victoire
Maintenant, j'essaie de faire un programme simple: une pulse de codeur = 1 step

Auparavant j'ai testé les branchements sur moteur avec un sketch arduino, aucun probleme il fonctionne bien.
Mais là rien ne bouge, j'ai du mal à savoir pourquoi.
Je vois bien qu'il y a un probleme car le moteur est souple. mon void_init_motor ne doit pas etre fait correctement?

Merci de votre aide

PS: il y a beaucoup de morceaux de sketchs commentés etc car, ma principale maniere de faire est de modifier des morceaux de sketch existants. Du coup je veux etre sur de ne rien perdre..

 
S

saico

Apprenti
autre chose, mais pas sure car j'ignore comment sont les entrées de ton driver moteur pas à pas, c'est la configuration en Open-Drain ( collecteur ouvert ) des sorties A2 et A3 dans la fonction " void init_motor() "

essai de les mettre en Push-Pull comme suit :

 
V

vibram

Compagnon
edit: le moteur tourne
ca vibre beaucoup, c'est lent mais ca tourne :wink:
Merci de ton aide !
 
S

saico

Apprenti
Il important de bien respecter le timing des signaux "Pulse" et "Dir" de ton driver, car sur le code tel qu'il est, il ne semble pas les respecter , l'impulsion doit durer au moins 5µs à état "1" et aussi au moins 5µs à l’état "0", et aussi pour l’état du signal "Dir" qui doit être fixé au moins 10µs avant d'appliquer le signal "pulse".

timing.png
 
V

vibram

Compagnon
Exact, j'etais justement en train de lire la doc plus en detail
J'ai réglé le courant, compris comment fonctionnait le mode step ou 1/2step
En revanche, je n'arrive toujours pas a quelque chose de rapide
j'ai deactivé le LCD pour n'avoir que la fonction test motor en marche et avec un delai de 10Ms a chaque fois mais cela est trop lent, cf la video.
En revanche la broche effectue bien une révolution complete
 
S

saico

Apprenti
La fonction "DelayMs()" introduit un délai en milli-secondes alors que tu devait introduire des délai en micro-seconde (1 Ms = 1000 µs ) !

donc tu dois développer une autre fonction Delay_us() qui prends des microseconde en argument, ou tout simplement faire des longue boucles genre:

 
V

vibram

Compagnon
rha punaise je me suis posé la question en plus ...! je suis un boulet souvent
Encore merci, la suite un autre jour, point trop n'en faut ! :wink:

je n'ai pas pu résister à un petit test:
C'est sympa mais encore loin d'etre fonctionnel.
J'aurais bien aimé intégrer la fonction qui active les moteurs dans la fonction de mise à jour du codeur mais j'imagine qu'il doit y avoir un conflit entre les interrupt et la fonction donc le moteur ne bouge pas.
Et pour avoir un tel résultat, j'ai mis la fonction dans le while du main mais j'ai desactivé l'update du LCD qui a un délai de 250MS, beaucoup trop long
Je vais réflechir demain à comment corriger cela et intégrer le bout de code de CNCSERV
Et ensuite, réflechir à la disposition sur le LCD puis la démarche à suivre, les boutons etc. J'ai deja quelques idées
 
V

vres

Compagnon
Je n'ai pas suivi, tu ne te sers plus du timer4 Pour le codeur ?
 
V

vibram

Compagnon
Je n'ai pas suivi, tu ne te sers plus du timer4 Pour le codeur ?

Dans le bout de code que tu m'as donné ici tu mentionnes "IRQHandler"
Ne sachant pas ce que c'était je suis allé me renseigner et j'ai vu que c'etait utilisé lors des des interrupt.
J'ai donc laissé de coté le timer pour utiliser l'interrupt
Ce n'est pas ce qu'il fallait faire?
 
V

vres

Compagnon
C'est une interruption timer, il faut une base de temps.
Tu dois trouver facilement un exemple de code pour déclarer un timer, dans la librairie discovery il y a un exemple de PWM avec timer.

Cela n'empeche pas d'utiliser le timer4 pour le codeur.

Personnellement je ne l'utilise pas car j'ai transposé le code qui venait d'un DSP et j'ai 2 entrées codeurs.


C'est simple très rapide.
 
V

vibram

Compagnon
Ah ok donc si j'ai bien compris, en résumé:
l'interruption timer va me generer une interruption toutes les X secondes (ou micro secondes) et la valeur de mon codeur va être lue
Cette valeur sera comparée à la valeur du second codeur et selon le résultat, une instruction sera envoyée au moteur.
Pour que le mouvement soit fluide, l'instruction envoyée au moteur doit avoir une fréquence deux fois inférieure à celle du timer.

C'est correct?
 
V

vres

Compagnon
C'est presque ça mais il n'y a qu'un seul codeur:
On lit le codeur et on converti on nombre de tours,
On calcule la position du chariot en mm en fonction
En converti en position moteur et on génère les pulses

Le code que j'ai posté n'est pas 100% fonctionnel, il y a de petites adaptations à faire.

Il manque les synchros et l'initialisation des positions
 
V

vibram

Compagnon
OK mais mon idée de mettre un codeur sur le PAP afin de savoir précisément où on en est ne te paraît pas pertinente ?
Oui oui je ne fais pas de bêtes copier coller non plus j'essaie un minimum de comprendre mais avant la synchro je veux être sûr de mes timers /interrupt
Je vais tester une nouvelle version ce soir :wink:
 
S

stef1204

Compagnon
OK mais mon idée de mettre un codeur sur le PAP afin de savoir précisément où on en est ne te paraît pas pertinente ?
Oui oui je ne fais pas de bêtes copier coller non plus j'essaie un minimum de comprendre mais avant la synchro je veux être sûr de mes timers /interrupt
Je vais tester une nouvelle version ce soir :wink:

Pourquoi ne pas utiliser un PAP “closed loop” plutôt que de charger le CPU avec cela?

La question est pourquoi utiliser ce genre de contrôle ? Il suffit de mettre un PAP suffisamment puissant.
 
V

vres

Compagnon
OK mais mon idée de mettre un codeur sur le PAP afin de savoir précisément où on en est ne te paraît pas pertinente ?

Ca complique sévèrement le code, ce genre d'asservissement est assez complexe, normalement un Pas à Pas suit les informations que l'on lui donne.
 
V

vibram

Compagnon
Ok je vais vous écouter, surtout en premier lieu ou je galere.

J'ai re ecrit le code avec le timer interrupt
J'ai essayé de faire simple, si je tourne le codeur dans un sens, je viens incrementer unevariable (codeur) qui sera affichée sur le LCD
Cest une tentative de mi des différents codes trouvés/proposés et j'ai fait ca car je comprends à peu pres ce que j'ai écrit.
En revanche, j'ai toujours la valeur 0 à l'écran donc cela ne fonctionne pas. L'affichage LCD et le moteurs fonctionnent (j'ai testé à chaque fois que je rajoutais une fonction)

J'imagine que c'est au niveau de ma definition des GPIO pour l'interrupt qu'il y a un souci mais je ne vois pas pourquoi cela fonctionne pas.
Avez vous une idée?
 
Dernière édition:
V

vres

Compagnon
Je ne vois rien qui cloche, tu peux comparer avec le code que j'ai posté en 2eme page.

Je pense que TIM4_IRQHandler est bien défini dans les vecteurs d'interruption.
 
V

vibram

Compagnon
La différence notable dans la configuration du timer est cette partie :
/* Output Compare Timing Mode configuration: Channel2 */
Que tu fais aussi pour le channel 1
J'avoue ne pas comprendre cette partie et je ne l'ai pas mise car je ne la trouvais pas dans d'autres exemples.
En revanche dans ton code il n'y a pas mention des gpio ou est branché le codeur rotatif. J'imagine que c'est lié à cette histoire de channel? Mais je ne vois pas où on parle concrètement de gpio dans ton exemple ?
 
V

vres

Compagnon
Non pas de codeur, dans mon code il n'y a que le timer.
C'est un double timer.

Ici tu peux télécharger la librairie complète et aussi cubeMx qui peut certainement t'aider à configurer ton timer.
Dans la librairie il y a un projet TIM_TimeBase qui peux te donner une base.
 

Sujets similaires

Père-Pendiculaire
Réponses
23
Affichages
1 057
Père-Pendiculaire
Père-Pendiculaire
T
Projet HBM en projet
Réponses
10
Affichages
1 175
Squal112
Squal112
V
Réponses
12
Affichages
832
vibram
V
N
Réponses
28
Affichages
1 292
Nicoala
N
C
Réponses
1
Affichages
4 688
E
B
Réponses
19
Affichages
2 627
boumboauto
B
tournele
Réponses
111
Affichages
16 819
wika58
wika58
D
Réponses
6
Affichages
13 468
Doctor_itchy
D
Haut