Omet navegació

6.2.- PWM Motor L293

Si volem disminuir  la velocitat de gir del motor podem utilitzar la ordre PWM. Aquesta ordre fa que la eixida digital en lloc de ser 0V o 5V passe a estar modulada per un pols d'amplada variable.

Mira la gràfica de  Timothy Hirzel.

PWM

La ordre és analogWrite(pin,amplada); on l'amplada varia entre 0 i 255. Mira un exemple on hem creat les funcions: motorAonHpols(x) , motorAonApols(x),  motorBonHpols(x) , motorBonApols(x) per facilitar la programació de la targeta Arduino.


// Copyleft (C) 2015 Carles Ferrando Garcia
// License: GNU GPL v3 http://www.gnu.org/copyleft/gpl.html 
// funcions motorA i motorB
// En aquest programa utilitzem les funcions motorAonH() , motorAoff() , motorAonA() , motorAonHpols(x) , motorAonApols(x)  [on x varia de 0 a 100]
// En aquest programa utilitzem les funcions motorBonH() , motorBoff() , motorBonA() , motorBonHpols(x) , motorBonApols(x)  [on x varia de 0 a 100]

//definim ports motor A
int contacte1motorA = 11;    
int contacte2motorA = 12;    
int activamotorA = 9;

//definim ports motor B
int contacte1motorB = 4;    
int contacte2motorB = 7;    
int activamotorB = 3;

void setup() {
 
// Configura els ports motor A con eixides
pinMode(contacte1motorA, OUTPUT);
pinMode(contacte2motorA, OUTPUT);
pinMode(activamotorA, OUTPUT);

// Configura els ports motor B con eixides
pinMode(contacte1motorB, OUTPUT);
pinMode(contacte2motorB, OUTPUT);
pinMode(activamotorB, OUTPUT);


    }
      
void loop() 
{
//motorAonH(); 
//delay(2000); 
//motorAoff(); 
//delay(2000); 

//motorAonA();
//delay(2000);  
//motorAoff(); 
//delay(2000); 

motorAonHpols(56);
delay(1000);
motorAoff();
delay(1000);

motorAonApols(56);
delay (1000);
motorAoff();
delay(1500);

//motorBonH(); 
//delay(1000); 
//motorBoff(); 
//delay(2000);

//motorBonA();
//delay(2000);  
//motorBoff(); 
//delay(2000);

motorBonHpols(56);
delay(1000);
motorBoff();
delay(1000);

motorBonApols(56);
delay (1000);
motorBoff();
delay(1500);

}

//___________ FUNCIONS MOTOR A
      
//
//anem a crear la funció activar el motor A en sentit Horari   
void motorAonH()
    {
// activa el motorA per poder engegar-lo
digitalWrite(activamotorA, HIGH);
// engeguem  el motorA en sentit Horari
digitalWrite(contacte1motorA, LOW);   
digitalWrite(contacte2motorA, HIGH);  
    }
      
//
//anem a crear la funció per aturar el motor A
void motorAoff()
  {
// desactivem el motorA per poder parar-lo
digitalWrite(activamotorA, LOW); 
  }

//
//anem a crear la funció engega motor A en sentit Antihorari
void motorAonA()
  {
// activa el motorA per poder engegar-lo
digitalWrite(activamotorA, HIGH);
// engeguem el motorA en sentit Antihorari
digitalWrite(contacte1motorA, HIGH);  
digitalWrite(contacte2motorA, LOW);     
   }


//Anem a crear la funcio engega el motor A en sentit Horari polsat al «pols %» polsat
void motorAonHpols (int pols)
  {
 float escriuD= pols/100.0*255.0;
 int escriuE=int(escriuD);  
// activa el motorA per poder engegar-lo
digitalWrite(activamotorA, HIGH);
// engeguem  el motorA en sentit enrere al pols% del puls possible
analogWrite(contacte1motorA,0);   
analogWrite(contacte2motorA,escriuE);  
  }


//Anem a crear la funcio engega el motor A en sentit Antihorari polsat al «pols %» polsat
void motorAonApols (int pols)
  {
 float escriuD= pols/100.0*255.0;
 int escriuE=int(escriuD);  
// activa el motorA per poder engegar-lo
digitalWrite(activamotorA, HIGH);
// engeguem  el motorA en sentit enrere al pols% del puls possible
analogWrite(contacte1motorA,escriuE);   
analogWrite(contacte2motorA,0);  
  } 
//_________ FUNCIONS MOTOR B
      
//
//anem a crear la funció activar el motor B en sentit Horari   
void motorBonH()
    {
// activa el motor B per poder engegar-lo
digitalWrite(activamotorB, HIGH);
// engeguem  el motor B en sentit Horari
digitalWrite(contacte1motorB, LOW);   
digitalWrite(contacte2motorB, HIGH);  
    }
      
//
//anem a crear la funció per aturar el motor B
void motorBoff()
  {
// desactivem el motor B per poder parar-lo
//digitalWrite(activamotorB, LOW); 
digitalWrite(contacte1motorB, LOW);  
digitalWrite(contacte2motorB, LOW); 
  }

//
//anem a crear la funció engega motor B en sentit Antihorari
void motorBonA()
  {
// activa el motorB per poder engegar-lo
digitalWrite(activamotorB, HIGH);
// engeguem el motorB en sentit Antihorari
digitalWrite(contacte1motorB, HIGH);  
digitalWrite(contacte2motorB, LOW);     
   }


//Anem a crear la funcio engega el motor B en sentit Horari polsat al «pols %» polsat
void motorBonHpols (int pols)
  {
 float escriuDB= pols/100.0*255.0;
 int escriuEB=int(escriuDB);  
// activa el motorB per poder engegar-lo
digitalWrite(activamotorB, HIGH);
// engeguem  el motorB en sentit enrere al pols% del puls possible
analogWrite(contacte1motorB,0);   
analogWrite(contacte2motorB,escriuEB);  
  }


//Anem a crear la funcio engega el motor B en sentit Antihorari polsat al «pols %» polsat
void motorBonApols (int pols)
  {
 float escriuDB= pols/100.0*255.0;
 int escriuEB=int(escriuDB);  
// activa el motorB per poder engegar-lo
digitalWrite(activamotorB, HIGH);
// engeguem  el motorB en sentit enrere al pols% del puls possible
analogWrite(contacte1motorB,escriuEB);   
analogWrite(contacte2motorB,0);  
  }

 Tin en compte que si el motor elèctric no és molt bo no podràs minvar molt la seua velocitat amb la funció PWM