Autres Realisation d'un system de filetage par µC

  • Auteur de la discussion simon74
  • Date de début
G
Guy69
Compagnon
3 Mar 2009
1 284
FR-71170
bonjour
Qu'est-ce-que va passer quand le codeur s'arrete subitement? On n'aura plus de updates, donc notre PaP va continuer a avancer a sa vitesse actuel, broche a l'arret, jusqu'au butee, ruinant notre piece.
pourquoi? le Pap n'avance que quand on lui dit, et si tu ne le fais avancer QUE lorsqu'il y a changement d'état sur le codeur, il ne va pas avancer tout seul. Y a un truc que je pige pas là.
A+
Guy
 
simon74
simon74
Compagnon
3 Mai 2016
1 475
Savoie
  • Auteur de la discussion
  • #17
C'est car, comme pour le codeur, y a plusiers facons de faire avec les PaP, entre "faire le tout manuellement" et "laisse faire (d'un facon ou un autre) un timer". Moi, je propose de faire un maximum par timer, en dehors de processeur, et ca va dire que, encore comme avec le codeur, on ne va pas gerer chaque impulsion manuellement.
 
simon74
simon74
Compagnon
3 Mai 2016
1 475
Savoie
  • Auteur de la discussion
  • #18
Pour coder tout ca, on vas en avoir besoin d'un peu plus (ou meme moins) que le HAL nous donne, il va falloir plonger un peu dans les fichiers stm32f1xx_ll_* au lieu de stm32f1xx_hal_*. Les driveurs "low level", quoi.

Avant d'y plonger la tete en avant, par contre, on verra pour la fonctionnalité de base - un timer pour lire le codeur, et qui nous envoi le positionnement de ce codeur, sans qu'on as besoin d'agir. On regardant dans stm32f1xx_hal_tim.h, on trouve les fonctions necessaires:
Au lieu d'utiliser HAL_TIM_Base_Init(), on va utiliser HAL_TIM_Encoder_Init(), en passant l'addresse d'un structure de TIM_Encoder_InitTypeDef, et ca nous fera le necessaire. Par exemple, pour notre codeur de 1000 pas / tour, on pourrait avoir ca:
A noter que IC1Filter et IC2Filter nous permets de faire du "debouncing" des signaux, c'est a dire qu'il va falloir 4 samples du meme niveau pour que ca soit pris en compte.

Il faut qu'on connect les sorties du codeur sur lee entrees du timer, bien sur. Par default, TIM2 Canal 1 et 2 sont sur PA0 et PA1.
Puis, au lieu de HAL_TIM_Base_Start_xx(), on utilisera HAL_TIM_Encoder_Start_xx(). Pour le mode "polling" ou "interrupt", un peu de lecture du RM0008 et le code du HAL, on s'on sortira tres bien.

Le mode DMA est un peu plus complex, car il faut aussi initialiser l'accessoire DMA, qui permets le timer de faire un transfert direct vers un endroit en memoire. Sur les stm32f1, y a 2 controleurs DMA avec 12 canaux total de DMA. Si on est sur TIM2, et on veut faire un DMA sur chaque update (TIM2_UP), il nous faut DMA1, canal 2 (voir RM0008, 13.3.7, table 78).

Par contre, demarrer le timer est plus delicat. HAL_TIM_Encoder_Start_DMA() n'est pas si bon que ca, car il transfert par DMA a partir du registre (ou registres) CCR1 / CCR2, sur les changements CCR, et ne transfert pas le direction (bit 4 en registre CR1). Nous, on veut transferer CR1 et CNT sur update; on as besoin de creer notre propre fonction de demarrage. Bof, mais en gros c'est du copier-coller su code de HAL.
et similaire pour l'arret. Puis on defini un bloc de memoire de 0x28 bytes pour recevoir ces donnees (n'oublient pas les declarations volatile), et on appel notre fonction de demarrage.
 
V
vibram
Compagnon
15 Mar 2014
3 886
FR-74
Salut Simon,

Est ce que tu tests ton sketch en même temps ?
Juste pour demander car je n'ai pas le temps de le faire mais je suis avec intérêt
 
simon74
simon74
Compagnon
3 Mai 2016
1 475
Savoie
  • Auteur de la discussion
  • #20
Celles la ne sont pas testé pour l'instant. Y a des parties tirés des autres de mes projets, et un partie qui suit les techniques que j'ai utilisé ailleurs. Faut que je setup un projet :)

Mais, comme j'ai dit, ce n'est pas "clefs en main".
 
simon74
simon74
Compagnon
3 Mai 2016
1 475
Savoie
  • Auteur de la discussion
  • #21
Bon, ca a pris du temps de remettre en route un environnement C/C++ pour ARM qui peut faire avec ce qui genere STM32CubeMX. J'ai maintenant 2 installations de llvm/clang (qui marche tres bien, mais pas avec CubeMX); finalement j'ai cedé et installé un toolchain arm-none-eabi. Enfin bref, j'ai un projet qui compile maintenant, mais j'ai du me tromper sur le clock, c'est enormement lent.

[edit]
Probleme entre clavier et chaise. J'ai oublié de preciser un source pour le HSE.

Donc, le code sera ici : https://github.com/tufty/stm32-noodling

Je m'excuse, mais les commentaires et messages de commit sera en Anglais, car - ummm - c'est difficile de faire les accents avec emacs. Oui, c'est ca.

Et puis, bien sur, j'avait du code qui marchait parfaitement deja hier matin, mais j'ai fait un connerie avec STM32CubeMX et il m'a tout zappé, y compris le repo git locale. Et non, je n'avait pas mon disque de sauvegarde branché.

If it's not backed up, it's not important.
 
Dernière édition:
La dernière réponse à ce sujet date de plus de 6 mois
Haut