Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Multitache arduino MEGA



  1. #1
    croco01

    Multitache arduino MEGA


    ------

    Bonjour, Je dispose d'un arduino MEGA et j'ai besoin de contrôler un injecteur pendant 14 millisecondes touts les 20 fronts montants. Je m'explique: une roue perforée fournie un signal carré d'une fréquence variable, je voudrais que mon arduino compte les fronts montants et qu'il puisse envoyer un signal de commande a l'injecteur (signal qui devra duré 14 ms). Voir schéma en pièce jointe. J'arrive a compter le nombre de fronts montants grace a un petit bout de code mis dans la boucle principale, mais avec ce protocole durant l'envoi du signal a l'injecteur (soit pendant 14 ms) le comptage des fronts montants en provenance de l'horloge est interrompu.C'est pour cette raison que j'ai besoin d'un multitache ou d'une technique similaire tel que l'utilisation des timer hardware interne... quelqu'un aurait il une idée sur l'utilisation de ces timers?
    Code:
    //num des broches arduino
    int BrRoueCodeuse=0;
    int BrInjecteur1=1;
    
    
    //variables utiles lors de l'execution du prg
    int buttonPushCounter = 0;   // variable pour le comptage du nombre d'appuis sur le bouton poussoir
    int buttonState = 0;         //Variable pour l'état actuel du bouton poussoir
    int lastButtonState = 0;     // Variable pour l'état précédent du bouton poussoir
    
    
    
    void setup() {  
    //initialisation de broches arduino  
       pinMode(BrRoueCodeuse, INPUT);
       pinMode(BrInjecteur1, OUTPUT);
       
    
    }
    
    
    void loop() {
     // ------------Mécanisme de comptage des fronts montants en provenance de la roue codeuse----------
     
      buttonState = digitalRead(BrRoueCodeuse);//lecture de l'etat du signal (HIGW / LOW)
    
      // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
      if (buttonState != lastButtonState) {
        // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
        if (buttonState == HIGH) {
          buttonPushCounter++;
        }
        lastButtonState = buttonState;//on memorise le nouvel état
      }    
     //-------------------------------------Fin du mécanisme de comptage ------------------------------
      
     
    
     //----------------------------------------gestion injecteur n°1-----------------------------------
      if (buttonPushCounter % 20 == 0) { 
        digitalWrite(BrInjecteur1, HIGH); 
    delay(14); // attente de 14 ms 
      } else { // sinon
       digitalWrite(BrInjecteur1, LOW); 
      }
    
    }

    Merci de me dire comment vous auriez procédé pour régler ce problème.
    Bonne journée

    -----
    Images attachées Images attachées

  2. Publicité
  3. #2
    vincent66

    Re : Multitache arduino MEGA

    Bonjour,
    Si votre signal d'horloge est bien propre je pense que vous devez pouvoir l'appliquer à l'entrée d'un compteur hard interne au uC...
    Vous pouvez aussi générer l'impulsion vers l'injecteur par pwm hard interne au uC, ce qui vous laisse les mains libres pour exécuter du programme...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  4. #3
    paolo123

    Re : Multitache arduino MEGA

    Tu peux utiliser le timer interne qui lorsqu'il y a débordement génère une interruption.

    En considéreant que tu choissises le timer0 qui est sur les PIC en tous cas codé sur 8 Bits, soit une évolution de valeur possible entre 0 et 255, à chaque fois que TMR0 vaudra 0xFF (255) il retombera automatique à 0, et à ce moment la tu peux générer une interruption. à toi de mettre les valeurs que tu sois dans TMR0 pour avoir la temporisation de interruption souhaitée (chaque 1 us, chaque 10 us etc..) et tu peux même rajouter un compteur à l'intérieur de ton ISR pour compter plus de temps.


    je suggère l'utilisation de flag que tu utiliseras dans ton main pour minimiser les temps de traitement de ta routine ou si elles sont trop longues. N'oublie pas également de remettre à 0 le flag d'interruption du timer sinon tu n'en sortirais jamais

  5. #4
    croco01

    Re : Multitache arduino MEGA

    Bonjour, et merci de la réponse, alors, je ne sais pas si mon signal d'horloge est propre, je n'ai pas d'oscillo pour vérifier mais normalement il est correct car il provient d'un phototransistor. En revanche j'ai trouvé ceci:
    http://benjamin-balet.info/developpe...alle-regulier/
    qu'en pensez vous? quelqu'un a déjà utilisé la bibliothèque Timer1?
    Merci a tous
    je suis capable du pire mais aussi du meilleur mais dans le pire c'est moi le meilleur

  6. #5
    croco01

    Re : Multitache arduino MEGA

    Merci paolo123 je n'avais pas vu ta réponse, j'ai lu qu'il fallait mieux utiliser le timer 1 car le timer 0 était déja bien utilisé par le bootloader de l'arduino, mais j'avoue ne pas etre expert dans le fonctionnement des microControlleur.... Ma question est la suivante: Croyez vous qu'il est possible de faire effectuer la tache par un arduino? et comment faire? faire la lecture d'horloge en mode interuption? enfin bref je bloque sur ce problème.. si vous avez une solution autre (meme sil faut utiliser un autre montage je suis preneur car je sent que ca va me bloquer niveau programmation....
    Merci et bonne soirée.
    je suis capable du pire mais aussi du meilleur mais dans le pire c'est moi le meilleur

  7. A voir en vidéo sur Futura
  8. #6
    Seb.26

    Re : Multitache arduino MEGA

    Oui, tu peux faire cela avec un uCPU (je connais pas Arduino, mais je doute qu'il ne sache pas le faire).

    le principe :

    un timer/compteur qui incrémente sa valeur à chaque front sur l'entrée, quand il déborde, tu as une IT :
    + tu acquittes cette IT
    + tu remets le compteur à la bonne valeur (255-20 par exemple)
    + tu positionnes ta sortie à 1
    + tu lance un autre timer pour avoir tes 14ms

    Quand le timer des 14ms arrive à echéance, tu as une autre IT :
    + tu acquittes cette IT
    + tu re-positionne ta sortie à 0
    + tu stoppe le timer des 14ms

    Et le plus beau : cela te prend environ 0% du CPU ... tout marche sous IT !
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. Publicité
  10. #7
    croco01

    Re : Multitache arduino MEGA

    Bonjour a tous et merci de vos réponses!!!
    en recherchant grace a mon ami google j'ai trouvé ce lien:
    http://www.mon-club-elec.fr/pmwiki_r...ttachInterrupt
    pour ceux qui doivent compter des fronts montants avec un arduino et en parallèle réaliser des taches spécifiques (sans jamais arrêter de compter) ce liens est pour vous tout y est expliqué.
    (au cas ou le liens serait mort recherchez : "attachinterupt() arduino" sur google vous y trouverez les explications qui vont bien)
    Merci a tous.
    je suis capable du pire mais aussi du meilleur mais dans le pire c'est moi le meilleur

  11. #8
    bobflux

    Re : Multitache arduino MEGA

    Si il y a besoin de précision sur les 14ms, tu dois pouvoir générer l'impulsion avec un PWM. Je reprends l'excellent résumé de seb26 :

    un timer/compteur qui incrémente sa valeur à chaque front sur l'entrée, quand il déborde, tu as une IT :
    + tu acquittes cette IT
    + tu remets le compteur à la bonne valeur (255-20 par exemple)
    + tu paramètres un PWM pour générer une impulsion de 14ms

    Je ne sais pas si ce micro peut faire des impulsions one-shot ou si ça doit obligatoirement se répéter. Il faut vérifier.

    L'interruption pourrait aussi vérifier le temps écoulé depuis le dernier appel (histoire d'être sûr que c'est moins de 14ms)...
    Ou avoir une interruption à chaque front, qui vérifie que l'intervalle n'est pas trop bref (cheveu devant le capteur, etc)

Discussions similaires

  1. Piloter 120 leds avec un Arduino Mega
    Par Kraouesh dans le forum Électronique
    Réponses: 4
    Dernier message: 05/09/2013, 21h21
  2. Probleme Arduino MEGA 1280
    Par croco01 dans le forum Électronique
    Réponses: 5
    Dernier message: 22/07/2013, 00h28
  3. tester une carte Arduino MEGA
    Par croco01 dans le forum Électronique
    Réponses: 9
    Dernier message: 27/06/2013, 08h15
  4. brd (eagle) shield vierge Arduino Mega
    Par wampyr32 dans le forum Électronique
    Réponses: 1
    Dernier message: 05/01/2010, 12h24
  5. Arduino mega
    Par zener57 dans le forum Électronique
    Réponses: 0
    Dernier message: 14/09/2009, 18h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.