Problema control motores DC

Buenas tardes, estoy creando diferentes funciones para el movimiento de dos motores DC mediante el “puente H” L293D. El problema esta en que quiero pasar un parámetro que me configure el ancho de la salida PWM(velocidad de los motores) como parámetro a cada función de movimiento, y no consigo hacerlo funcionar, siempre suena un pitido hasta que desconecto el pin correspondiente de la entrada EN1 y EN2 del puente H. En cambio si conecto directamente EN1 a la tensión de alimentación(Vcc) funciona perfectamente,moviendo los dos motores, aun teniendo EN2 desconectado, lo que me desconcierta un poco al no saber muy bien la función de EN2.

Copio el código :
*Todas las diferentes variables y constantes estan declaradas, no las copio por no ocupar más espacio.

void loop() 
{ 
 int speed=60;
 avanza(speed);
 delay(3000);
}

void avanza(int speed)
 {   
    analogWrite(en1Pin,speed);
    digitalWrite(in1Pin,HIGH);
    digitalWrite(in2Pin,LOW);  
    analogWrite(en2Pin,speed);
    digitalWrite(in3Pin,HIGH);
    digitalWrite(in4Pin,LOW);    
 }

Un saludo y gracias.

revisa las conecciones, 1,2EN habilita el buffer para trasladar lo que tenes en la entrada a la salida, pero el pwm no va en esa entrada. aca tenes una hoja de dato con el diagrama. http://www.ti.com/lit/ds/symlink/l293d.pdf

Pues no entiendo donde va el PWM yo pensaba que si que iba en esa entrada, de echo en un ejemplo que tengo para cambiar la velocidad a través del puerto serie el pin PWM si que va conectado a EN1 y mediante un analogWrite escribo la velocidad en ese pin(el PWM)que esta conectado a la entrada EN1 del L293d. ¿Podríais decirme como es la conexión correcta? Un saludo y gracias

Hola,

Ciertamente hay dos formas de hacerlo, una es colocar EN1 a 5v e IN1 al PWM, y la otra es colocar EN1 al PWM e IN1 a 5v. Yo solo he probado con la primera por que fue la que vi en el PDF de mi puente H. La diferencia radica en que cuando el PWM va a 0V si esta conectado a EN1 en ese tiempo el motor queda rodando por la inercia, mientras que si esta conectado a IN1 se hace una acción de frenado rapido, habria que hacer la pruebas a ver cual de las dos da una respuesta de velocidad mas lineal adecuada al valor del PWM.

El que los motores hagan un zumbido puede ser que no tienen la suficiente fuerza para romper la inercia y entrar en movimiento, tal vez necesites agregar una caja de reducciones, prueba colocarlo en el aire sin nada conectado y ver si aun sigue el problema, o trata aumentando el valor de speed, si colocas speed igual a 255 deberias tener el mismo comportamiento que obtienes al colocarlo directo a Vcc. Si colocando 255 no arranca puede que tengas algun problema en tu diagrama electrico, revisa las conexiones, y si no encuentras el error sube un diagrama de como lo estas haciendo.

Saludos.

Lo correcto es usar el enable para habilitar, y la entrada para el pwm. Donde escuchas el zumbido?

Ya lo solucione, era que no tenia bastante potencia, cargue un valor más elevado en la velocidad y funciona perfectamente. Pero si conecto la PWM a la entrada no puedo manejar el sentido de los dos motores como lo hago de esta forma no? Y de hacerlo de esa forma, es decir, conectando la PWM a la entrada como se puede variar la velocidad? Muchas gracias por la ayuda a todos, un saludo

fijate en el diagrama que te paso, que no puedes usar enable para el pwm, porque hay momentos en que está en alta impedancia, no hay paso de energia.
la entrada 1 la usas para el sentido y la entrada 2 para el pwm

Hola,

Para cambiar de sentido tienes dos opciones, una es que para ir en reversa pongas IN1 en low y escribas un PWM en IN2, o la otra es que coloques IN2 en HIGH y en IN1 coloques el valor complemento a 255, osea (255-valor). Y la velocidad pues dependera del valor del PWM igual que antes.

Si colocas el PWM al enable cuando enable esta en LOW se tiene Free Running Stop, mientras que cuando lo colocas en IN1 al estar en LOW tienes Fast Motor Stop. Ambas funcionan, no se cual es mejor, haz las pruebas.

Saludos.

Buenas noches.
Estoy intentando realizar un control de un motor DC con un puente L293D con un velocidad variable girando a derechas y a izquierdas, mediante el uso de un potenciómetro variable de 10k (Extremo izquierdo = giro a izquierdas, centro = banda neutra, Extremo derecho = giro a derechas).
El problema lo tengo en que solo gira en un sentido (en el que marca MC1), el sentido que debería. proporcionar MC2 es nulo.
He realizado la prueba de conectar el MC1 donde esta el MC2 y el motor gira correctamente en sentido inverso.
Podéis echarme una mano.
Muchas gracias.


//CONTROL DE VELOCIDAD PARA MOTOR DE CC CON INTEGRADO L293DNE "PUENTE EN H"

const int EN = 9; //Eneable mrdium bridge (1 - right of 2 - left)
const int MC1 = 2; //Motor control Nº1
const int MC2 = 3; //Motor control Nº2
const int POT = 0; //Reading variable resistor at ANALOG PIN A0
                   //<----------- 462--512--562---------->
                   //+ to - REAR |....STOP....| AHEAD - to +

int val = 0; // Storage value of variable resistor
int VELOCIDAD = 0; //Storage velocity (from 0 to 255)

void setup() 
{
Serial.begin(9600);
pinMode (EN,OUTPUT);
pinMode (MC1,OUTPUT);
pinMode (MC2,OUTPUT);
brake (); //Reset devide with stopped engine
}

void loop()
{
  val = analogRead (POT);
  Serial.println(val);
  delay (100);
  
//Working AHEAD
  if(val > 562)
  {
    VELOCIDAD = map(val, 563, 1023, 0, 255);
    G_right(VELOCIDAD);    
  }

  //Working REAR
  if(val < 462)
  {
    VELOCIDAD = map(val, 461, 0 , 0, 255);
    G_left(VELOCIDAD);
  }

  //BRAKE
  else
  {
    brake();
  }

}
  // Function AHEAD: Engine goes forward with a variable speed from 0 to 255
  void G_right (int rate)
  {
    digitalWrite (EN, LOW);
    digitalWrite (MC1, HIGH);
    digitalWrite (MC2, LOW);
    analogWrite (EN, rate);
  }

  // Funtion REAR: Engine goes reverse with a variable speed from 0 to 255
  void G_left (int rate)
  {
    digitalWrite (EN, LOW);
    digitalWrite (MC1, LOW);
    digitalWrite (MC2, HIGH);
    analogWrite (EN, rate);
  }

  // Function STOP: Engine break
  void brake()
  {
    digitalWrite (EN, LOW);
    digitalWrite (MC1, LOW);
    digitalWrite (MC2, LOW);
    analogWrite (EN, HIGH);
  }

No revivas hilos viejos. Este es del 2013. Por favor lee las normas del foro y no vuelvas ha hacer consultas en hilos que tienen mas de 120 dias.