IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Interruption LM393 comportement RISING


Sujet :

Arduino

  1. #1
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 168
    Points : 241
    Points
    241
    Par défaut Interruption LM393 comportement RISING
    Bjr,
    Une question sur le comportement du paramètre RISING dans attachinterrupt.
    J'ai une interruptions lorsque le
    Capteur LM 393 passe de 0 à 1 mais également lors du passage de 1 à 0 comment cela est il possible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    const byte pin = 2;
     
    volatile byte state = LOW;
    volatile unsigned long temps = 0, last_temps = 0;
    volatile byte cpt = 0;
     
    void setup() { 
     
    	pinMode( pin, INPUT_PULLUP );
     
    	attachInterrupt( digitalPinToInterrupt( pin ), set_interrupt, RISING );
     
    	Serial.begin( 9200 );
    }
     
     
    void loop() {
     
    	Serial.print( "temps " );
    	Serial.println( temps );
    	Serial.print ( "compteur trous " );
    	Serial.println(  cpt );
    	Serial.print ( "etat  " );
    	Serial.println( state );
     
    	delay(1000);
     
    }
     
     
    void set_interrupt(){
     
    			temps = millis();
     
    			state = 0;
     
    			// rebond du capteur
    			if( ( temps - last_temps ) > 100 ) {
     
    				++cpt;
    				last_temps = temps;
     
    				state = 3;
    			}
    }

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Ça dépend de plusieurs choses. Peut être qu'il faut générer un seuil d'hystérésis pour éviter une sorte d'oscillation logique autour de la valeur de comparaison.

    Peut être que le système que tu as relié au comparateur est sujet aux rebonds, que tu retrouves dans ton analyse du problème.

    - Qu'est-ce que tu as relié au comparateur LM393 ?
    - Il nous faut le schéma.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Salut à tous,

    A mon avis, la logique de l'antirebonds logiciel sur interruption est bancale ici...

    - si l'interruption se produit entre deux Serial.print, l'information affichée est fausse
    - si la variable state passe bien à 3 lors de la détection d'un front montant "valide", elle repasse illico à 0 au moindre rebond


    Capteur LM 393 passe de 0 à 1 mais également lors du passage de 1 à 0 comment cela est il possible ?
    Le signal étant à l'état 1 depuis un moment (+ de 100 ms), il bascule à l'état 0 ==> OK, c'est un front descendant...
    Mais si le signal bascule avec des rebonds ! Au premier rebond qui sera un front montant, hop, le système croit que le signal bascule à l'état 1.

  4. #4
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 168
    Points : 241
    Points
    241
    Par défaut
    Bjr,
    Merci de votre aide.
    Nom : LM393.jpg
Affichages : 2184
Taille : 117,2 Ko

    Donc en fait il y aurait encore des rebonds si je comprend bien. (Effectivement la variable state reste toujours à 0 même après increment du compteur)

    J'imagine qu'un filtre est envisageable...

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonjour,

    le LM393 est un comparateur pas un capteur... Quelles sont ses entrées ? ses sorties ? Quel module utilises-tu ?

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    C'est un module avec une fourche optique. Ton montage est un codeur incrémental rotatif, c'est ça ?

    Nom : codeurs1.gif
Affichages : 1283
Taille : 8,5 Ko
    http://rco.fr.nf/index.php/2016/07/06/codeurs-et-robotique/

    Cela m'étonne qu'il y a des rebonds sur ce dispositif Tu as constaté des rebonds à l'oscillo, ou en affichant des valeurs dans le terminal Série ?
    Et puis 100 ms, ça me semble long (ou alors la vitesse de rotation est plutôt lente, peut-être en sortie d'un réducteur, mais ça dépend aussi du diamètre et du nombre de trous).

  7. #7
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 168
    Points : 241
    Points
    241
    Par défaut
    Re

    ok pour le comparateur, oui c'est un codeur incrémental rotatif les trous ont la largeur de la fourche noir. Malheureusement je n'ai pas ce matériel, mais je viens de commander un petit oscillateur (c'est semble til indispensable ) j'effectue la rotation à la main pour le moment (j'ai plaqué de l’aluminium sur la roue imprimé en PLA)



    je suppose qu'il y a un rebond, car sans ça mon compteur s’incrémente aléatoirement.

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Il serait plus logique d'afficher la nouvelle valeur du compteur quand un trou est détecté (c.à.d quand state=3) et de supprimer le delay(1000) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    const byte pin = 2;
     
    volatile byte state = 0;
    volatile unsigned long temps = 0, last_temps = 0;
    volatile byte cpt = 0;
     
    void setup() { 
     
    	pinMode( pin, INPUT_PULLUP );
     
    	attachInterrupt( digitalPinToInterrupt( pin ), set_interrupt, RISING );
     
    	Serial.begin( 9200 );
    }
     
     
    void loop() {
            if (state==3) {
                state=0;
    	    Serial.print( "temps " );
    	    Serial.println( temps );
    	    Serial.print ( "compteur trous " );
    	    Serial.println(  cpt );
            }
    }
     
     
    void set_interrupt(){
     
    			temps = millis();
     
    			// rebond du capteur
    			if( ( temps - last_temps ) > 100 ) {
     
    				++cpt;
    				last_temps = temps;
     
    				state = 3;
    			}
    }
    Ce ne serait pas Serial.begin(9600) plutôt ? (9200 dans ton code)

Discussions similaires

  1. Interruption rising change
    Par laurent1133 dans le forum Arduino
    Réponses: 0
    Dernier message: 18/09/2018, 18h18
  2. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  3. interruption materiel port parrallele
    Par pyrostan dans le forum C
    Réponses: 2
    Dernier message: 13/01/2003, 08h22
  4. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  5. Bouquins d'Assembleur - interruptions matérielles
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/11/2002, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo