compte tours

Postby gibi » Mon Jul 02, 2007 12:00 am

Bonjour,

J'ai réalisé un compte tours avec un demi disque et deux fourches optiques à 45°.
La logique de fonctionnement est la suivante.
Au passage de la deuxième fourche, je déclenche une int0. Si la fourche 1 est coupée, on compte, sinon on décompte.
Le problème est que si on revient un peu en arrière de la deuxième fourche et que l'on avance de nouveau, un nouveau tour est compté ce qui est faux.
Pour bobiner des tours derrière une perceuse ce n'est pas génant, mais quand on soigne un bobinage à la main, les aller-retours peuvent être fréquents.
Qui peut me donner la solution à ce problème ?

Ci-joint une photo de ma réalisation, qui inclut ma petite platine, une nouvelle carte avec afficheur + clavier + buzzer.

Jean
Attachments
compte_5ftours.JPG
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby ymasquel » Tue Jul 03, 2007 12:00 am

Bonjour Jean,

Sans avancer trop loin dans l'analyse, il serait probablement plus fiable de détecter des fentes à l'aide de capteurs rapprochés et si possible qu'à un instant court les 2 capteurs soient éclairés ce qui te permettrait d'obtenir un signal "en quadrature" (voir petit dessin).
De la sorte tu sauras dans quel sens se déplace ton disque.

Dans le dessin les décalages sont réguliers mais si tes capteurs sont rapprochés tu auras les durées des signaux à "ZERO" beaucoup plus longs que ceux à "UN".

Amicalement, Yves.
Attachments
Signaux.jpg
Amicalement,
Yves.
ymasquel
Site Admin
 
Posts: 3392
Joined: Thu Jan 02, 2014 10:44 am
Location: Oise (60)

Postby gibi » Tue Jul 03, 2007 12:00 am

Merci pour ta réponse, Yves.

Si je comprends bien, on augmente le nombre d'impulsions par tour et la zone d'incertitude rétrécit.

Au niveau logiciel, j'envisage ceci :
On détecte la fourche 1.
fche1 = true
On détecte la fourche 2 (int0 sur front tmontant) et on compte un tour
fche2 = true;
if(fche1 == true)
{
cpte++;
}

Quand la fourche 1 n'est plus masquée (à prévoir sur int1 front descendant), et que fche2 est masquée on place
if(fche2 == true)
{
fche1_out = false;
}

Si on revient en arrière un petit peu, la fourche 2 est encore masquée car mon disque fait 1/2 tour. Donc
if(fche1_out == false && fche1 == true)
{
cpe++;
}

Qu'en penses tu ?
Jean
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby ymasquel » Tue Jul 03, 2007 12:00 am

Bonjour Jean,

Dans ma proposition on n'augmente pas le nombre d'impulsions mais on fait en sorte de pouvoir détecter dans quel sens on tourne en connaissant quel capteur reçoit la lumière avant l'autre (bien se rappeler qu'il y a un moment où les 2 sont éclairés). Il faut que les capteurs soient très proches ou que tu fasses la détection sur 2 disques différents ou que tu utilises autre chose qu'une fourche pour l'un des capteurs.

Amicalement, Yves.
Amicalement,
Yves.
ymasquel
Site Admin
 
Posts: 3392
Joined: Thu Jan 02, 2014 10:44 am
Location: Oise (60)

Postby gibi » Tue Jul 03, 2007 12:00 am

Bonjour Yves,

J'ai compris ce que tu me proposes.
Mais il me semble que je peux prendre un disque plein, et garder mes fouches à 90°. Il me suffit de placer deux échancrures à 90 ° avec le décalage que tu préconises.
De cette façon le "jitter" du disque est proportionnel à la largeur de l'échancrure.

En plaçant 4 échancrures sur le disque il devient alors possible de mesurer des 1/4 de tours, ce qui peut être intéressant en H.F.

Jean.
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby ymasquel » Tue Jul 03, 2007 12:00 am

Bonjour Jean,

Tu as bien compris le principe.

Comme tu le dis en finale avec 4 échancrures tu compteras les 1/4 de tours. Attention donc car avec 2 échancrures telles que tu les prévois tu compteras déjà les 1/2 tours.

Amicalement, Yves.
Amicalement,
Yves.
ymasquel
Site Admin
 
Posts: 3392
Joined: Thu Jan 02, 2014 10:44 am
Location: Oise (60)

Postby gibi » Tue Jul 03, 2007 12:00 am

Yves,

Je vais déjà faire des essais avec deux échancrures. Il faut placer les encoches par paire, le minimum dans ma configuration est donc 1/8e de tours.

Il m'apparait que l'on peut complètement lever l'incertitude de position en détectant le sens dans un premier temps et en prenant en compte la fin des deux encoches pour compter les tours.
De cette façon si le disque oscille sur une encoche, le comptage ne sera pas validé et il n'y aura pas d'erreurs.

Reste à voir comment programmer cela..

Merci pour ton aide, Yves. Je progresse !
Jean
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby gibi » Mon Jul 23, 2007 12:00 am

Bonjour Yves,

J'ai je pense réussi à programmer mon compte tours.
J'utilise une interruption qui réagit à une impulsion montante et descendante, donc j'ai deux interruptions par encoche. Mon problème est d'éviter tout comptage par erreur quand l'encoche hésite entre le comptage ou le décomptage.
Les deux fourches sont à 180°, IR1 et IR2, j'ai donc deux impulsions par tours. Quand l'encoche passe, mon signal passe à true.
IR1 est la fourche qui déclenche l'interruption.
Sur ma première int0 je détecte le sens et je place un flag de début d'encoche. Sur la deuxième int je regarde l'état de IR1 et IR2 et je valide le comptage ou le décomptage.

Cela semble marcher bien que ne n'annule pas mon flag de sens en cas de retour en arrière en équilibre sur une encoche.
Je te joins mon code, penses-tu que ce soit suffisant ?



#pragma INTERRUPT ir_Int0
void ir_Int0(void)
{
if (IR1 == true && IR2 == false && flag.bit.detectCpte == false)
{
flag.bit.detectCpte = true; // mode comptage engagé.
}

if (IR1 == false && IR2 == true && flag.bit.detectCpte == true)
{
cpt++;
flag.bit.detectCpte = false;
if(cpt > MAXICPT)
{
flag.bit.Over=true;
}
else
{
flag.bit.Over=false;
}
return;
}


if (IR1 == true && IR2 == true && flag.bit.detectDecCpte == false ) {
flag.bit.detectDecCpte = true; // mode décomptage engagé.
}

if (IR1 == false && IR2 == false && flag.bit.detectDecCpte == true) // mode décomptage terminé.
{
flag.bit.detectDecCpte = false;
if (cpt > MINICPT)
{
cpt--;

if(cpt == MINICPT)
{
flag.bit.Null=true;
}
}
}
}

Jean
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby ymasquel » Tue Jul 24, 2007 12:00 am

Bonjour Jean,

Ce qui n'est pas suffisant c'est la "géométrie" de ta prise d'informations (je n'ai pas tout compris mais c'est peut-être à cause de la période estivale - selon le calendrier).
Un dessin de ton disque, de la taille des fentes, de la position des capteurs et des signaux que chaque capteur génère est indispensable.
Autre possibilité : la forme des signaux selon le sens de rotation.

Mais je pense qu'il est inutile d'avoir un "flag" pour le comptage ET un "flag" pour le décomptage.

Amicalement, Yves.
Amicalement,
Yves.
ymasquel
Site Admin
 
Posts: 3392
Joined: Thu Jan 02, 2014 10:44 am
Location: Oise (60)

Postby gibi » Tue Jul 24, 2007 12:00 am

Bonjour,

Je te joins une photo qui vaut mieux qu'un long discours.
C'est bien sur un proto.
La fourche de gauche est légèrement décalée pour que le sens soit détecté. C'est IR1 dans le programme et c'est elle qui déclenche l'interruption.
Selon le sens on a en entrée d'encoche :
IR1 IR2
Haut bas

en sortie :
IR1 IR2
Bas Haut

Dans l'autre sens en entrée :
IR1 IR2
Haut Haut

en sortie :
IR1 IR2
Bas Bas

Dans le programme IR1 déclenche l'int en début et en fin d'encoche. Il y a peut-être plus simple...

Jean
Attachments
encodeur_20sym_e9trique.JPG
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Next

Return to R8C/13 (01-2006)

Who is online

Users browsing this forum: No registered users and 1 guest