utilisation de l'instruction count

duschmaulle

New Member
Bonjour a tous,
Je suis nouveau sur le forum, et je débute avec les picaxe.
j'ai fait un montage qui utilise un moteur cc (récupéré sur un photocopieur) sur l'axe duquel se trouve une roue avec quarante trous, un détecteur optique, a fourche est installé sur cette roue.
je voudrais pouvoir controler la position de ce moteur a l'aide du signal fournit par le detecteur optique, en comptant le nombre d'impulsion, et j'avais pensé utiliser la fonction "count", mais j'avoue ne pas bien comprendre son fonctionnement.
Quelqu'un peut-il m'aider? et pensez-vous que cela est la bonne solution?
D'avance merci pour vos réponse.
Salutations
 

zebulon

Member
Bonjour a tous,
Je suis nouveau sur le forum, et je débute avec les picaxe.
j'ai fait un montage qui utilise un moteur cc (récupéré sur un photocopieur) sur l'axe duquel se trouve une roue avec quarante trous, un détecteur optique, a fourche est installé sur cette roue.
je voudrais pouvoir controler la position de ce moteur a l'aide du signal fournit par le detecteur optique, en comptant le nombre d'impulsion, et j'avais pensé utiliser la fonction "count", mais j'avoue ne pas bien comprendre son fonctionnement.
Quelqu'un peut-il m'aider? et pensez-vous que cela est la bonne solution?
D'avance merci pour vos réponse.
Salutations
Bonjour,

Bienvenu.
Conernant la syntaxe de count :

count pin, period, variable (manuel 2 page 50)

pin = le port qui va recevoir les impulsions
period = la durée pendant laquelle tu comptes les impulsions (en ms)
variable = la variable word dans laquelle sera stocké le nombre d'impulsions comptées.

As-tu chargé et lu la page correspondante du manuel ICI ? L'exemple est on ne peut plus explicite.

exemple tiré du manuel :

Code:
main:
count C.1, 5000, w1     ; Compte le nombre d'implusions qui arrivent sur le port C.1 pendant 5 secondes (à 4MHz)
debug                        ; affiche le résultat dans la fenetre du dbugger
goto main                   ; loop back to start
A+,
Guillaume
 
Last edited:

duschmaulle

New Member
Bonjour et merci, guillaume, pour ta réponse rapide.
J'ai lu la notice, comme tu me le préconise, mais ce que je ne comprends pas c'est la durée pendant laquelle on compte les impulsions.
C'est a dire, si je spécifie une durée de 5 ms, est-ce que le comptage va se faire pendant ces 5ms puis on stockera dans la variable, ou bien va t'on stocker dans la variable au fur et a mesure que le comptage se fait? (je ne sais pas si je me fait bien comprendre).
mon but étant de, par exemple changer le sens de rotation du moteur au bout de 15 impulsions, comment dois-je faire?
d'avance merci pour ta réponse.
Salutations
 

PieM

Senior Member
Bonjour,

la fonction de comptage ne permettra pas cela: la variable n'est disponible qu'à la fin de la période de comptage.

Il faudrait connaître la fréquence approximative du comptage, car une solution existe à condition que les impulsions ne soient pas trop rapides, via une entrée interruption. De toute façon inverser le sens du moteur avec précision, suppose que la vitesse de rotation n'est pas très grande !

On est davantage dans le domaine d'application des moteurs pas à pas.
 

zebulon

Member
Comme le dit PieM, le PICAXE ne peut rien faire pendant la durée d'exécution de l'instruction count.
Sinon, utiliser les interruptions :

Un bout de code non testé pour te mettre sur la voie :
A chaque impulsion (passage niveau bas à niveau haut; on peut faire l'inverse aussi) sur le port B.0, la routine d'interruption est appelée et cpt est incrémenté.
Dans la boucle principal (debut), on test si cpt = 15. Dans ce cas, on inverse le sens du moteur (0=moteur dans un sens, 1=moteur dans l'autre sens).

Code:
#picaxe 28X2
symbol cpt = W0
symbol sens_moteur = B2

let cpt = 0
let sens_moteur = 0

setint %00000001, %00000001  ' Active l'interruption sur le bit C.0 sur un passage d'un niveau 0 à un niveau 1.
debut:
  if cpt = 15 then
    let sens_moteur = sens_moteur XOR %00000001 ' inverse le bit 1 donc alterne entre 0 et 1 à chaque passage
    let cpt = 0    ' remet à 0 le compteur d'impulsion.
    debug ' affiche la valeur dans le debugger
  endif
  goto debut

interrupt: 'mot réservé pour désigner la routine d'interruption qui sera appelée à chaque déclenchement sur C.0
  inc cpt
  setint %00000001, %00000001  ' Nécessaire pour réactiver l'interruption. Celle-ci a été automatiquement désactivée lors de l'entrée dans interrupt.
  return
Le code n'est pas optimisé et doit être adapté à ton PICAXE.

Lequel utilises-tu ?

Guillaume
 
Last edited:

duschmaulle

New Member
Bonjour zebulon,
merci pour ton information concernant l'utilisation d'interruption, mais je pense que je vais peut-etre m'orienter vers du moteur pas a pas, en tous cas essayer de voir les deux solutions etant donné que je ne suis pas encore fixé, c'est un projet dans ma tete, je n'ai meme pas fait le choix du picaxe.
merci quand meme pour vos réponse, et a bientot surement, je risque d'avoir de nouvelles questions.
Salutations
 

zebulon

Member
Salut duschmolle,
Le fait d'utiliser un moteur pas à pas ne change rien à ton problème de comptage d'impulsion.
A+
 

PieM

Senior Member
Bonjour,

Le fait d'utiliser un moteur pas à pas ne change rien à ton problème de comptage d'impulsion.
Bien sûr que si! :) On commande un moteur pas à pas en lui donnant à priori le nombre de pas à faire. Il suffit d'avoir dans le cas présent un moteur avec un minimum de 40 pas, ce qui est très courant.

C'est au contraire un moyen très sûr et simple pour le problème posé.

Ces moteurs, en bipolaire, peuvent être commandés facilement avec un L293D, ou avec 4 transistors Mosfets en unipolaires, selon la puissance du moteur.
 

zebulon

Member
Bonjour PieM,

C'est à dire que, comme on ne sait pas s'il s'agit d'impulsions générées par la rotation du moteur ou par autre chose ...
Mais bon, on discute dans le vide là ;)

A+,
Guillaume
 

PieM

Senior Member
Bonjour Guillaume,

C'est vrai, dans l'absolu, tu as tout à fait raison.
Je pense toutefois que vouloir arrêter un moteur CC de façon précise, et le faire repartir en sens inverse est un peu irréaliste, sauf si la vitesse est très faible. Mais faute d'infos ...on discute effectivement un peu dans le vide . :)
 

duschmaulle

New Member
bonjour guillaume, bonjour pieM,
Merci de vous intérésser a mon problème.
Je pense que pieM a parfaitement raison, arreter un moteur cc de facon précise et le faire repartir en sens inverse est irréaliste, surtout que la vitesse n'est pas trés faible, je pense donc qu"il y aura une grande imprécision.
je vais donc m'orienter vers du moteur pas a pas.
 
Top