MicroControlleurs - Page 5
Répondre à la discussion
Page 5 sur 5 PremièrePremière 5
Affichage des résultats 121 à 129 sur 129

MicroControlleurs



  1. #121
    invite936c567e

    Re : MicroControlleurs


    ------

    Le circuit L293 possède deux entrées qui fixent la polarité du pont, et par conséquent le sens de rotation du moteur, et une entrée d'activation qui permet de faire varier la tension moyenne appliquée au moteur en pratiquant une modulation en largeur d'impulsions (PWM en anglais ou MLI en français).

    Dans l'exemple, les deux premières entrées sont commandées par les sorties 3 et 4 de l'Arduino, et la dernière est commandée par la sortie 9.

    Avec un niveau haut sur la sortie 3 et un niveau bas sur la sortie 4, le moteur tournera dans un sens. Avec un niveau bas sur la sortie 3 et un niveau haut sur la sortie 4, le moteur tournera dans le sens inverse.

    L'Arduino offre la possibilité de fournir directement un signal PWM sur la sortie 9. Mais comme la fréquence de ce signal est assez élevée, pour limiter les pertes en commutation des transistors du pont il est préférable de créer ce signal PWM logiciellement, avec une fréquence plus faible de l'ordre du kilohertz.

    Ainsi, par exemple :
    - pour arrêter le moteur (tension moyenne = 0 V) on maintient tout le temps la sortie 9 à l'état bas (rapport cyclique = 0%) ;
    - pour faire tourner le moteur au quart du régime maxi (tension moyenne = 3 V) on maintient périodiquement la sortie 9 à l'état haut durant 250 µs et à l'état bas durant 750 µs (rapport cyclique = 25%) ;
    - pour faire tourner le moteur à mi-régime (tension moyenne = 6 V) on maintient périodiquement la sortie 9 à l'état haut durant 500 µs et à l'état bas durant 500 µs (rapport cyclique = 50%) ;
    - pour faire tourner le moteur à trois quarts du régime maxi (tension moyenne = 9 V) on maintient périodiquement la sortie 9 à l'état haut durant 750 µs et à l'état bas durant 250 µs (rapport cyclique = 75%) ;
    - pour faire tourner le moteur à plein régime (tension moyenne = 12 V) on maintient tout le temps la sortie 9 à l'état haut (rapport cyclique = 100%).

    Voici un exemple de programme que j'ai fait sur un coin de table pour piloter le moteur selon une séquence déterminée :
    Code:
    const int sortieInput1 = 3;    // "Input 1" = pin 2 du L293D
    const int sortieInput2 = 4;    // "Input 2" = pin 7 du L293D
    const int sortieEnable = 9;    // "Enable 1" = pin 1 du L293D
    
    const int nombreEtapes = 14;
    
    // durées en millisecondes et vitesses en % pour chaque étape de la séquence
    const int tableDurees[nombreEtapes]   = { 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 0 };
    const int tableVitesses[nombreEtapes] = {   25,   50,   75,  100,   75,   50,   25,    0,  -50,   50,  -50,   50,  -50, 0 };
    
    int numeroEtape;       // compteur des étapes de la séquence
    int decompteurTemps;   // décompte du temps passé dans l'étape en cours
    int vitesse;           // vitesse moteur pour l'étape en cours
    
    void setup() {
      // fixe le mode des pins de sortie de l'Arduino
      pinMode(sortieInput1, OUTPUT);
      pinMode(sortieInput2, OUTPUT);
      pinMode(sortieEnable, OUTPUT);
    
      // commence avec le moteur à l'arrêt
      digitalWrite(sortieEnable, LOW);
    
      // initialise la séquence
      numeroEtape = 0;
      decompteurTemps = 0;
    }
    
    void loop() {
    
      if ( decompteurTemps==0 ) // début ou étape en cours terminée ?
      {
        if (numeroEtape>=nombreEtapes)
          return;               // quitte si terminé
    
        decompteurTemps = tableDurees[numeroEtape]; // lit la durée de l'étape (en millisecondes)
        vitesse = tableVitesses[numeroEtape];       // lit la vitesse du moteur pour l'étape (en %)
        numeroEtape++;                              // numéro de l'étape suivante
    
        sensMoteur(vitesse);    // fixe la polarité du pont
      }
      pwm(vitesse);             // génère le signal pwm durant 1 milliseconde 
      decompteurTemps--;        // décompte le temps
    }
    
    void sensMoteur(int pourcent)
    {
      digitalWrite(sortieEnable, LOW);
      if (pourcent>0)
      {
        digitalWrite(sortieInput1, LOW);
        digitalWrite(sortieInput2, HIGH);
      }
      else
      {
        digitalWrite(sortieInput1, HIGH);
        digitalWrite(sortieInput2, LOW);
      }
    }
    
    void pwm(int pourcent)
    {
      int microsec = pourcent<0 ? -10*pourcent : 10*pourcent;
    
      if( microsec>=1000 ) // 12 V
      {
        digitalWrite(sortieEnable, HIGH);
        delayMicroseconds(1000);
        return;
      }
    
      digitalWrite(sortieEnable, LOW);
      delayMicroseconds(1000-microsec);
      if( microsec==0 )  // 0 V
        return;
      digitalWrite(sortieEnable, HIGH);
      delayMicroseconds(microsec);
    }
    (NB : je n'ai pas tenu compte du temps pris pour l'exécution du code, par conséquent les temporisations réalisées ne seront un peu plus longues que prévu, et les niveaux de tension sur le moteur pas non plus exacts).

    -----

  2. #122
    invite936c567e

    Re : MicroControlleurs

    Oups... une petite erreur dans le code. Au début de loop(), il faut lire :
    Code:
    void loop() {
    
      if ( decompteurTemps<=0 ) // début ou étape en cours terminée ?
    Il ne s'agit bien sûr que d'un exemple. Ce code demande à être amélioré.

  3. #123
    invited772d6c2

    Re : MicroControlleurs

    Oui je vais devoir modifier le tout car il y aura la del a faire clignoter + la musique a faire...
    Mais par contre...Pour 4.5 et 7.5V comment faire ? Puisque je sais pour le 3, le 6, le 9 et le 12V mais comment faire pour les2 autres tensions ?

    Merci d'avance

    PS : Merci d'avoir prit tout ce temps pour le code

  4. #124
    invite855cd7fb

    Re : MicroControlleurs

    Ah ouais, tu as tellement tout compris qu'il faut aussi qu'on fasse les regles de 3 a ta place ...

  5. #125
    invited772d6c2

    Re : MicroControlleurs

    Pq la règle de trois ? pour le rapport cyclique de 4.5 et de 7.5V ?

  6. #126
    invited772d6c2

    Re : MicroControlleurs

    Mais ce que je n'arrive pas comprend malgrès tes explications et les sites sur itnernet c'est comment définir la polarité et la tension de sortie de l'arduino...

  7. #127
    invite936c567e

    Re : MicroControlleurs

    Pour faire clignoter la led au moment voulu, il suffit d'ajouter dans la boucle un test du temps écoulé et une commande d'allumage/extinction adéquats.

    Concernant la polarité, pour faire tourner le moteur, j'ai fait :
    Code:
        digitalWrite(sortieInput1, LOW);
        digitalWrite(sortieInput2, HIGH);
    et pour tourner dans l'autre sens :
    Code:
        digitalWrite(sortieInput1, HIGH);
        digitalWrite(sortieInput2, LOW);
    Dans le code, le signe de la consigne de vitesse fait ça automatiquement dans l'appel à ma fonction sensMoteur() .

    Pour obtenir 4,5V on doit réaliser un signal PWM de 100%x4,5V/12V=38%, et pour obtenir 7,5V on doit réaliser un signal PWM de 100%x7,5V/12V=63%.

    Si tu ne comprends pas en quoi consiste le PWM (ou MLI en français), on trouve de nombreuses explications sur Internet (sur notre forum, sur Wikipedia, etc.).

  8. #128
    invited772d6c2

    Re : MicroControlleurs

    Mais le programme que tu as fait juste en haut il est pas completé ? Car je vois pourcent, et d'autres qui n'ont pas été remplacés...C'est dur de programmer ca...

  9. #129
    invite5e0827de

    Re : MicroControlleurs

    Pour information, www.MCHobby.be distribue des kits Arduino ARDX traduits en FRANCAIS. Il traite entre autre la problématique d'alimentation d'un moteur DC avec un transistor.

Page 5 sur 5 PremièrePremière 5

Discussions similaires

  1. SVP Quel vession d'ISIS contient les microcontrolleurs dsPIC33F
    Par invite63359760 dans le forum Électronique
    Réponses: 2
    Dernier message: 15/03/2011, 00h59
  2. Liaison entre 2 microcontrolleurs
    Par invite90681934 dans le forum Électronique
    Réponses: 5
    Dernier message: 01/10/2008, 21h45
  3. Les microcontrolleurs pour les nuls
    Par invitecfa0dbb2 dans le forum Électronique
    Réponses: 27
    Dernier message: 24/07/2008, 13h39
  4. Programmer des microcontrolleurs avec du C/C++
    Par invite83e8ef51 dans le forum Électronique
    Réponses: 22
    Dernier message: 14/09/2003, 19h39
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...