filetage avec microcontrolleur

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

vibram

Compagnon
Merci pour votre aide nouveau
Le driver ne me laisse que le choix de full step ou half step
upload_2017-7-17_11-5-15.png

je vais travailler en full pour commencer et selon les résultats, je verrai pour le half.
Ca me donne donc une vitesse de 1200RPM comme calculé par Saci (20Khz et 1 cycle sur 2 envoi une pulse, 500 pulse par tour) pour le full step et 600 RPM pour le half step

Je vais voir si je trouve un moment pour essayer ce soir :wink:
 
5

59JAG

Ouvrier
Bonjour,
Si ton pap et en direct sur ta vis mère et que le pas de la vis est inférieure à 5 mm, ça fait 5mm/500 ce qui donne 0.01mm par Step du pap, donc en full Step c est suffisant.
J ai essayé avec un uno car suffisamment puissant pour gérer un filtrage.
 
V

vibram

Compagnon
Bonjour,
Si ton pap et en direct sur ta vis mère et que le pas de la vis est inférieure à 5 mm, ça fait 5mm/500 ce qui donne 0.01mm par Step du pap, donc en full Step c est suffisant.
J ai essayé avec un uno car suffisamment puissant pour gérer un filtrage.

c'est un pas de 2 (que ce soit sur un chariot schaublin ou sur mon rail hiwin) et le moteur est vraiment costaud. C'est d'ailleurs ce qui me fait peur sur le hardware, je pense qu'il est bien trop gros et son implantation sera difficile. Mais si deja le software est en place, ensuite je pourrai correctement dimensionner le reste.
Tu as des photos de ton projet? c'est terminé?
 
V

vibram

Compagnon
:homer::smt038:smt041

ca commence à ressembler à quelque chose !
Je n'avais pas activé les buttées logiciel. on voit que ca foire lorsque ca passe en dessous de 0, je vais reflechir à ca et mettre les buttées puis..réflechir au reste :wink:
 
5

59JAG

Ouvrier
20170717_215223.jpg
Je suis en phase de test,
j ai un montage avec un moteur cc qui simule la broche et qui entraine le codeur
j ai choisi un codeur 400i/t traité en 2x un pap configuré en 800 pulses/tour
ce qui me donne une resolution de 0,005mm/pulse
 
5

59JAG

Ouvrier
ici chronogramme ,en bas signal sortie A du codeur avec le moteur a 3400tr/mm (vitesse maxi alimenter a 25v ), en haut signal pulse sur driver envoyé par l uno

20170717_221118.jpg
 
Dernière édition:
5

59JAG

Ouvrier
Bonjour,
une petite video pour tester la vitesse du pap et identique a celle de la broche
test de vitesse avec un tachymetre , ont peux verifier a la fin de la video apres 1800 tours de broche je remets la broche a sa place initiale , on voit le pap dans la position correct.
 
S

saico

Apprenti
@59JAG C'est super cool ta réalisation, reste à effectuer des test réels sur un tour et ça promet !
 
S

saico

Apprenti
@vibram

Pour info, le TIM4 est un compteur 16bits, donc si on se contente de lire la valeur de ce compteur, on sera très vite limités par le nombre de tour que la broche puisse effectuer avant le passage de ce dernier de la valeur 65535 à 0 , et aussi de 0 à 65535 dans l’autre sens, pour un codeur de 400 x 4cpr, le compteur arrivera à sa limite après environ 41 tours, c’est pas beaucoup si on veut avoir un filetage très fin sur une bonne longueur.

Pour régler ce souci, le TIM4 offre une possibilité de générer une interruption à chaque passage d’une valeur maximale programmable ( par default 65535) à 0, et vis-versa.

Je te propose de programmer la valeur TIM_Period à 1000, et incrémenter une variable MULT1K dans la routine d’interruption de ce même timer pour compter les « millièmes » la valeur du codeur sera exprimée comme suit : ENC_value = TIM4_CNT + ( MULT1K x 1000 ) .

De cette façon, ton compteur ENC_value peut aller de -2147483647 à +2147483647 ( quelques 1.3 millions de tour dans un sens et dans l'autre avec 1600cpr ! et il faut compter 7h à 3000rpm ! )


 
V

vibram

Compagnon
Salut Saci
merci pour ton bout de code.
j'ai inséré tes modifications uniquement pour la partie initialisation du TIMER mais cela ne fonctionne pas, je n'ai plus la position du codeur
Il n'y a pas un conflit qq part?


jai aussi commencé l'implantation de boutons poussoirs pour pouvoir positionner le moteur (sens avant et arriere) et un bouton de remise à zero du compteur.
j'aimerais les mettre en interrupt mais pour le moment cela ne fonctionne pas, cest au niveua software que ca bloque car le bouton poussoir fonctionne sur un code normal sans interrupt. j'ai commandé le code car je préfere avancer étape par étape donc d'abord je finis les modif proposées par Saci ci dessus
 
S

saico

Apprenti
j'ai inséré tes modifications uniquement pour la partie initialisation du TIMER mais cela ne fonctionne pas, je n'ai plus la position du codeur

Va falloir déclarer la routine qui gère l'interruption du TIM4 ( voir le code dessus ) :


par contre si tu lis seulement TIM_GetCounter(TIM4) tu aura une valeur qui varie entre 0 et 999.
donc tu dois insérer la ligne suivante dans ta routine void TIM2_IRQHandler(void).


 
S

saico

Apprenti
Pour les interruption sur les entrées PB10 et PB11 voir le code ci-dessous, une interruption sur PB10 allumera la LED, une autre sur PB11 l'éteindra. ( n’oublies pas de un-commenter la ligne init_EXTI_buttons() dans main.

par contre je te conseils de ne pas gérer le moteur directement dans une routine de service d'interruption ! utilise plutôt le même TIM2 pour le faire, sinon si tu vois que ça risque de compliquer le code, tu peux toujours utiliser un autre timer ( TIM3 par exemple ) pour scruter l’état des deux entrées PB10 et PB11 et générer le nombre de "pas" en fonction de la vitesse du jog programmée et du mode voulu ( continu ou incrémental c.à.d distance fixe ) .

 
V

vres

Compagnon
Pour le codeur tu peux aussi utiliser le code que je t'ai donné, c'est très peu d'instructions, c'est fiable et en 32bits.
 
V

vibram

Compagnon
Ah ok merci j'avais modifié et pas compris qu'il fallait 2 IRQ Handler, tout est logique maintenant.
j'ai testé et le code fonctionne :)
C'est nickel car cela me permet aussi de facilement remettre à 0 mon compteur

OK c'est noté pour l'interruption, je vais m'en occuper un soir de semaine.
Je ne veux pas passer par TIM2 car en gros dans mon process je vais avoir:

1. mise sous tension de l'ensemble
2. Selection du pas
3. Positionnement du chariot dans sa configuration "départ du filetage" --> TIM2 n'est pas encore activé afin que les interruptions ne viennent pas gener le déroulement
4. Selection de la longueur du filetage
5. Demarrage de la broche et premiere passe
6. Retrait de l'outil manuellement
7. marche arriere broche pour revenir en position de départ
8. avance de l'outil manuellement
9. Marche avant de la broche


Aprres reflexion, je n'ai pas besoin d'interruption, je peux me servir de mon keypad pour gerer le positionnement du moteur. Il n'y a pas de précision la dedans, juste le mettre en début de course

CNCSERV, de quel morceau de code parles tu ? car j'ai repris pas mal de choses que tu m'as donné (voire tout)
 
G

gaston48

Compagnon
7. marche arriere broche pour revenir en position de départ
Bonjour,
je ne ferais pas d'inversion, mais m'inspirerait du cycle G33, c'est beaucoup moins contraignant pour les contacteurs etc ...
Le cycle a besoin d'un top synchro par tour de broche (l'index) mais on peut peut être s'en passer.
il y aurait une continuité de filetage avec juste une changement de signe
 
V

vibram

Compagnon
Bonjour,
je ne ferais pas d'inversion, mais m'inspirerait du cycle G33, c'est beaucoup moins contraignant pour les contacteurs etc ...
Le cycle a besoin d'un top synchro par tour de broche (l'index) mais on peut peut être s'en passer.
il y aurait une continuité de filetage avec juste une changement de signe

Pour l'instant cest ce que javais de plus simple en tete mais ma deuxieme idée etait de juste reculer de X tour comme j'ai la position de la broche, il suffit de reculer suffisament l'outil tant qu'il est à la meme position mais X tour plus loin. je ne l'exprime pas bien mais je pense qu'on est sur la meme longueur d'onde :wink:
Je ne l'ai pas encore implémenté car j'y vais vraiment étape par étape sinon rien ne fonctionne et je ne sais pas d'ou vient l'erreur
 
V

vibram

Compagnon

UpdateCodeur est appelé dans TIM2_IRQHandler ou mieux le code est recopié dans la fonction
je me suis renseigné sur cette fonction (tu l'as expliqué sur ce forum en 2016 deja d'apres mes recherches) mais je ne suis pas encore assez à l'aise avec.
Je prefere la laisser de coté pour le moment.
Les petites avancées: j'ai finalisé (enfin je crois) la partie de calcul du pas, du nombre de step etc.
Un petit test pratique:

j'ai 500 step/reolution, une vis au pas de 2. Donc une avance de 250step/mm
Sur un filetage au pas de 2, longueur 100mm, je dois réaliser (100/2) 50 tours de broche et envoyer 25000 step. Je rentre la longueur et le pas dans mon programme, à 50 tours, j'ai bien 25000 step et le moteur qui ne tourne plus meme si la broche continue de tourner. Il faudra vérifier en conditions réelles bien entendu
J'ai aussi ajouté une fonction retour d'outil. Si je ne me trompe pas, si l'outil part de la positon 0 tout comme la broche. J'effectue 42.5 tours de broche. Sur le tour en question, la broche est au step 800. Je laisse la broche fixe, je retire l'outil et je lance la fonction retour en arriere de 42 tours. ainsi l'outil est toujours en position 800 tout comme la broche que je peux réinitialiser.

Je suis en train de travailler sur le TIM3 pour lire les valeurs des boutons par interruption
 
Dernière édition:
V

vibram

Compagnon
Petit ajout:
Je pensais aussi créer une fonction de reset de position de broche
Sur la base du GetCounter, je voulais faire un ResetCounter

comme ci dessous:
La modification de STM32F10x_tim.c:

et dans STM32F10x_tim.h:

J'aimerais ajouter le rev pour me laisser l'opportunité de reset la position de la broche mais dans une position donnée
Pour reprendre l'exemple donné dans mon message précédent, si je stoppe la broche en position 800, je fais revenir mon outil et je remet ma broche à 0 tours mais position 800
J'ai une erreur L6218E: Undefined symbol TIM_ResetCounter (referred from main.o). mais je ne vois pas trop ce que j'ai fait de mal :smt017



Edit: je viens de decouvrir la fonction SetCounter, je vais m'en servir, ca ira tres bien je pense. Il y a une manip particuliere à faire pour la valeur du registre ? j'imagine que je ne peux pas directement mettre la valeur de la pulse comme je le souhaiterais ?
 
Dernière édition:
V

vibram

Compagnon
j'arrête ici pour aujourd'hui avec les problemes suivants:
1. Voir message ci dessus, comment parametre ce setcounter. j'ai assez peu d'info ou d'example la dessus
2. Le TIM3 est fonctionnel, c'est deja une bonne chose. Le PB0 sera pour la fonction retour d'outil. PB10 et PB11 pour regler l'emplacement de l'outil manuellement
Là j'avoue que j'ai beaucoup de mal pour ces 3 boutons et comment les configurer

Je commence par PB0 avec la LED PC13
la LED PC13 est en input pullup donc elle est active en low, c'est à dire lors d'un Resetbits.
Avec le code suivant, la LED s'allume lorsque je presse le bouton
PB est aussi en IPU donc actif en bas, je me serais attendu à ce que la LED soit allumée lorsque le bouton ne soit pas pressé, et inversement, non ? (ou alors avec le code if (!(GPIO_ReadInputData(GPIOB) & GPIO_Pin_0))

J'ai un probleme de compréhension quelque part.



Apres quand je passe à PB10 et PB11, la logique est exactement la meme pour les deux.
J'ai réutilisé l'usage des cycles pour commander le PAP. la aussi j'aimerais que lorsque j'appuie sur le bouton, j'envoie une pulse. Quel que soit le code que je mets, l'axe bouge sans raison.

Ca avance pas trop mal, petit à petit, je vais arrivé à avoir quelque chose de fonctionnel ... !

 
S

saico

Apprenti
Il n’ya pas de précaution particulière pour utiliser la fonction SetCounter, le TIM4->CNT est un registre en « lecture-écriture R/W » donc tu peux manipuler sa valeur, mais aussi la variable MULT1K qui comptera toujours les millième, par contre si tu veux que ton programme soit plus pratique, laisses la valeur du codeur comme Absolue ( sorte de cordonnée machine ) et joues plutôt sur une offset que tu rajoutes au calcule de la position moteur avoir l’origine de tes mouvements ( origine pièce si on fait l’analogie avec une machine CN )

Remarque :
Modifier les code source dans " STM32F10x_tim.c " et " STM32F10x_tim.h " était vraiment une très mauvaise idée car ces même fichiers seront utilisés dans tout tes future projets incluant cette bibliothèque, c'est vraiment à éviter, si besoin: tu copies, tu renomme, tu inclus dans le projet puis tu modifies comme tu le souhaites.

Edit : J'ai effacer le code exemple car c'était faux, mais vraiment faux !

on trouvera certainement une meilleur façon de le faire correctement !
 
Dernière édition:
V

vibram

Compagnon
Il n’ya pas de précaution particulière pour utiliser la fonction SetCounter, le TIM4->CNT est un registre en « lecture-écriture R/W » donc tu peux manipuler sa valeur, mais aussi la variable MULT1K qui comptera toujours les millième, par contre si tu veux que ton programme soit plus pratique, laisses la valeur du codeur comme Absolue ( sorte de cordonnée machine ) et joues plutôt sur une offset que tu rajoutes au calcule de la position moteur avoir l’origine de tes mouvements ( origine pièce si on fait l’analogie avec une machine CN )

Remarque :
Modifier les code source dans " STM32F10x_tim.c " et " STM32F10x_tim.h " était vraiment une très mauvaise idée car ces même fichiers seront utilisés dans tout tes future projets incluant cette bibliothèque, c'est vraiment à éviter, si besoin: tu copies, tu renomme, tu inclus dans le projet puis tu modifies comme tu le souhaites.

Edit : J'ai effacer le code exemple car c'était faux, mais vraiment faux !

on trouvera certainement une meilleur façon de le faire correctement !

Pour les codes sources, c'est facile de les remettre à l'origine donc je ne me fais pas de souci, j'ai d'ailleurs tout rétabli :wink:

Il y a un truc qui m'échappe dans la variable MULTI1K. Tu dis qu'elle donne le millieme. Mais on est d'accord que ce n'est pas le millieme d'un tour ? car elle va de 0 à 1000 (on ne devrait pas mettre 999 d'ailleurs ?) mais elle s'incrémente de 1 à chaque pulse or il y a 1600 pulse par tour. c'est juste?
De cette maniere je ne vois pas comment on arrive à un nombre de tours juste pour TIM4
ENC_Value=TIM_GetCounter(TIM4)+ MULT1K*1000;
Lors de TIM_GetCounter(TIM4), on lit une valeur comprise entre quoi et quoi? Si on prend l'exemple l'exemple de 3 tours complet donc 4800 pulse

Désolé je vois bien que la valeur semble juste mais je préfère bien comprendre ca avant d'avancer...


Edit: à chaque 1000 pulse, on augmente le multi de 1, ainsi pour 3 tours, on a multik = 4 et tim_getcounter = 800 donc la valeur ENC_Value = 4*1000+800
Cela me semble logique maintenant



je comprends bien cette problématique de coordonnées machine mais cela me semble beaucoup plus compliqué d'avoir cette histoire de buffer. J'aurais eu tendance à garder cela simple et à ne pas trop toucher la position moteur comme c'est elle qui active les butées. je vais y reflechir ce weekend si je trouve le temps
 
Dernière édition:
S

saico

Apprenti
Désolé je me suis trompé d’appellation, au lieu d’utiliser le terme « Milliers » pour designer 1K ou 10 puissance 3, j’ai utilisé le terme « Millième » ce qui a conduit à tes interrogations. ( Le pire je l’ai fait plusieurs fois sans me rendre compte ! )

Sinon, pour le TIM4, avec une période=1000, il comptera de 0 à 999, puis il passe à 0 de nouveau tout en générant une interruption dans laquelle on incrémente le MULT1K.

La valeur 1000 est choisi juste pour garder une arithmétique décimale courante, sinon tu peux utiliser n’importe quelle autre valeur, par exemple si la période=1600 le TIM4 compte de 0 à 1599, puis il passe à 0 avec une interruption, le MULT1K sera incrémenté de 1, et la valeur du codeur sera : ENC_Value=TIM_GetCounter(TIM4) + MULT1K * 1600

Le MULT1K exprimera tout simplement de nombre de tour complet du codeur, et peut-être renommé en MULT1TOUR par exemple.
 
V

vibram

Compagnon
pas de probleme, disons que cela m'a fait réfléchir un peu ! :wink:
Lors de l'exécution des boutons (quel qu'il soit), j'aimerais que le TIM2 ne genere plus d'interruption afin de ne pas interferer entre les deux fonctions.
j'avais donc mis dans mon TIM3 cette fonction:
TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); mais selon toute logique, cela interrompt l'interruption uniquement lorsque l'interruption de TIM3 a lieu.

Est-ce que je n'aurais pas intérer à avoir un 4eme bouton qui désactive ou active TIM2 à la demande ?
Ainsi je peux arreter TIm2 durant la période voulue, je regle la position de mon outil, et ensuite je réactive TIM2. Cela te semble pertinent ?
je pensais également faire ca durant mon cycle retour outil
 
S

saico

Apprenti
Logiquement, l’interruption TIM2 doit être activée seulement quand tu lance ton cycle d’usinage ou de filetage, donc sur ton interface HMI ( clavier – écran ) tu doit avoir quelque chose qui lance le cycle, genre « cycle start » , « go », « démarrer » ou autre ! sinon, c'est-à-dire quand le cycle n’est pas actif, c’est le TIM3 qui prend le relai pour faire toute les autres actions sur le moteur ( jog manuel, remise à zéro, retour chariot, et dégagement final à la fin du cycle ) .
 
S

saico

Apprenti
Généralement 3 à 4 boutons suffisent pour gérer ton système car tu peux toujours utiliser des menus déroulant sur ton écran, par exemple un bouton « menu » , au bouton « suivant », un autre « précédant » et un dernier « Valider » ou « OK » , puis tu as la possibilité d’utiliser aussi le clavier numérique pour créer des raccourcis .
 
V

vibram

Compagnon
Oui oui, je suis encore dans les clous niveau nombre de GPIO et je ne suis meme pas en I2C :wink:
Je vais me concentrer d'abord sur ce bouton qui gerera TIM2/TIM3,ca correspond en fait à un mode automatique ou manuel .. !
ensuite sur les boutons qui commandent le moteur et enfin sur cette variable buffer.
une fois cela fait, je devrais etre pas mal avancé niveau software
 
V

vres

Compagnon
je me suis renseigné sur cette fonction (tu l'as expliqué sur ce forum en 2016 deja d'apres mes recherches) mais je ne suis pas encore assez à l'aise avec.

C'est certain tu ne vas pas trouver beaucoup d'information sur le net sur cette méthode.

Tu commandes ton moteur Pas à Pas a trois endroits différents, normalement avec le timer2 tu devrais pouvoir gérer tout les déplacements et pas seulement ceux liés au codeurs.

On peux ajouter une vitesse max.
 
V

vibram

Compagnon
C'est certain tu ne vas pas trouver beaucoup d'information sur le net sur cette méthode.

Tu commandes ton moteur Pas à Pas a trois endroits différents, normalement avec le timer2 tu devrais pouvoir gérer tout les déplacements et pas seulement ceux liés au codeurs.

On peux ajouter une vitesse max.
pourrais tu le vulgariser que je comprenne comment cela fonctionne ?
Merci bien !
 

Sujets similaires

Père-Pendiculaire
Réponses
23
Affichages
680
Père-Pendiculaire
Père-Pendiculaire
N
Réponses
27
Affichages
859
Jean 47
J
2
Réponses
27
Affichages
1 409
jean-jacques
J
C
Réponses
0
Affichages
3 535
caramel
C
B
Réponses
19
Affichages
2 083
boumboauto
B
tournele
Réponses
111
Affichages
15 094
wika58
Haut