Contrôle Moteur DC via transistor (PWM)

Introduction
L'article "Contrôle Moteur DC via transistor (digital et analogique)" indiquait comment commander un moteur DC à partir d'un signal digital et analogique.

Cet article à surtout mis en lumière les limites du contrôle analogique.
En effet, appliquer progressivement une tension sur le moteur n'implique pas que ce dernier démarrera à plus faible vitesse.

A partir du même montage, il est possible d'affiner le contrôle de la vitesse en utilisant le contrôle par "la modulation de la largeur d'impulsion" (PWM pour les intimes).

Dans ce nouvel exemple, nous utilisons la pin 9 (en PWM) plutôt que la pin 12 (analogique).

Montage
Voir également les notes complémentaires disponibles dans l'article "Contrôle Moteur DC via transistor (digital et analogique)".

Programme
Source: MoteurDC_PWM.pde
/*
 *  Controle d'un moteur DC 
 *    En utilisant une sortie PWM.
 *    Attention, les pin PWM 5 et 6 ont une limitation.
 *    
 */

int pinMoteur = 9; // pin controlant le moteur (PWM pin)

void setup(){
  //En PWM il ne faut pas assigner la pin en output 
}

void loop(){
   MoteurVitessePWM();
   MoteurAccelerationPWM(); 
}

// Controle de la vitesse du moteur en controlant
//   le pourcentage du cycle de service PWM sur 
//   la pin 9 (de 0 à 255 pour 
//   le % du cycle de service ).
//
void MoteurVitessePWM(){
  int vitesse1 = int(255) / 3; // High 33% du cycle
  int vitesse2 = int(255) / 2; // High 50% du cycle
  int vitesse3 = 2 * 255 / 3;
  int vitesse4 = (int)255;     // High 100% du cycle
  
  analogWrite( pinMoteur, vitesse1 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse2 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse3 );
  delay( 1000 ); 
  analogWrite( pinMoteur, vitesse4 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse3 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse2 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse1 );
  delay( 1000 );
  analogWrite( pinMoteur, LOW );
}

// Controle plus fin de l'acceleration du moteur via PWM.
// NB: Selon la qualité du moteur, celui-ci peut avoir du mal à décoller 
//     lorsque le % du cycle de service est assez bas.
//     Un option est d'envoyer une impulsion pour démarrer/décoller le moteur.
void MoteurAccelerationPWM(){
  // Impulsion de démarrage (75%)
  //analogWrite( pinMoteur, 191 );
  //delay(50);
  
  // Acceleration
  for( int i = 30; i<= 255; i++ ){
    analogWrite( pinMoteur, i );
    delay(50); // delay pour avoir un progression
  }
  
  // pause de 2 secondes a plein régime
  delay( 2000 );  
  
  // Deceleration
  for( int i = 255; i>=0; i-- ){
    analogWrite( pinMoteur, i );
    delay(50); // delay pour avoir un progression
  }
 
}

11 commentaires:

  1. Bonjour, Merci pour ce code et ce montage.
    J'ai un petit problème. Lorsque j'essaye de connecter un moteur cc (en fait un moteur monté sur une petite voiture rc), j'entend un grésillement et le moteur ne démarre que si je l'entraine à la main. J'ai gardé la partie du code avec les vitesse, et j'ai rajouté l'impulsion mais rien ne se passe. Comment je pourrais faire? Merci

    RépondreSupprimer
  2. Bonsoir Quentin,
    1) Que se passe t'il si tu raccorde directement l'alimentation sur le moteur?
    2) As tu bien fait attention au sens de raccordement de la diode?
    3) L'utilisation du transistor provoque une chute de tension (VCE_Sat) qui dépasse quand même le volts. Pour une alimentation de 5Volts, ton moteur n'aurait peu être que 4 ou 3.5 volts pour fonctionner (c'est peut-être trop peu). Je te propose d'utiliser un Voltmetre pour mesurer la tension aux bornes du moteur (sans utiliser PWM sinon cela fausse ta mesure).

    Bien à toi
    Dominique

    RépondreSupprimer
  3. Bonsoir,
    D'abord merci de ta réponse.
    1) Le moteur fonctionne avec une alimentation directe.
    2) Oui, la diode est noire et j'ai mis l'anneau grisé vers l'alim.
    3) A la place du 5V comme proposé sur le schéma ici présent, je fais mes montages avec une pile 9V. Je ferai les tests et te tiendrai au courant.

    RépondreSupprimer
  4. Mais si c'étais un problème de voltage, il ne tournerait pas du tout non? Puisque la il fonctionne pour peur que je l'entraine légèrement.

    RépondreSupprimer
    Réponses
    1. Justement c'est le fait de devoir l'entrainer qui me met la puce à l'oreille.

      Supprimer
  5. Résultat des tests: Sans moteur, tension correcte aux bornes de la diode (7.8V), par contre avec le moteur: meme pas un volt aux bornes du moteur! Et comme tu l'avais dis, jai mesuré la ddp entre C et E avec le moteur: 3.2 V environ

    RépondreSupprimer
    Réponses
    1. 1) Il faut savoir que la chute de tension Vce aux bornes du transistor dépend du courant qui y passe.
      Plus le courant est important et plus la chute de tension est élevée.
      Quel courant consomme ton moteur en fonctionnement normal. Pense aussi a relever le courant en le freinant avec tes doigts (cela simule une charge... généralement le besoin en courant est nettement plus élevé).
      2) Ensuite, le transistor est un amplificateur en courant. Le courant nécessaire à la base est = à Ic (~ celui de ton moteur) / 200 (le coef d'amplification).
      Si tombe, le courant de ton moteur est tellement grand que le transistor n'est plus en saturation. J'attends ta réponse sur le point 1.
      3) Enfin, depuis cet article j'ai découvert les Transistors MofSet. Comme ils ne sont pas sensible au courant (mais à la différence de potentiel), il sont nettement plus "pratique" à mettre en oeuvre que le P2N2222. Je devrais faire un article la dessus!

      Supprimer
  6. Bonsoir merci de ta réponse et je m'excuse du retard.

    1) Si les roue ne touchent pas le sol, de 90 à 140 mA selon la vitesse. C'est bcp pour un petit moteur rc type jouet?

    2) Si les roues touchent le sol, ou si je touche les roues, le multimetre affiche -1 (je ne sais pas si c'est car le courant est >200mA, valeur max de mon multimetre ou si c'est car il ne détecte aucun courant (le moteur grésille).
    Merci encore

    RépondreSupprimer
    Réponses
    1. J'ai préparé un article avec un transistor MOSFET (plus efficace).
      Je te propose donc de lire l'article disponible sur le lien suivant :-)

      http://arduino103.blogspot.be/2012/07/commande-moteur-avec-transitor-mosfet.html

      Supprimer
  7. L' URL ci-dessus (http://arduino.blog ....) ne fonctionne pas (ou plus), y a-t-il une copie ailleur ?

    D'avance merci.

    JLJ

    RépondreSupprimer
    Réponses
    1. Cela devrait être réglé maintenant:
      http://arduino103.blogspot.be/2012/07/commande-moteur-avec-transitor-mosfet.html

      Supprimer