Programació d'automatismes i robots amb Arduino, Processing i Android
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.
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
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 3.0