Header Ads

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
  }
 
}