Hola, tengo un robot desbrozadora, que controlo con arduino mega y dos BTS7960, el problema que tengo es que pesa mucho entre 150-200 kg y los controladores se bloquean en el mejor de los casos o dejan de funcionar en un sentido, estoy pensando ponerle unos controladores algo mejores, he estado viendo el SmartDriveDuo30, otro que soporta 100 a, en aliexpress (Placa de módulo de accionamiento de Motor de CC de doble canal de alta potencia, aislamiento de optoacoplador, regulador de puente en H, Control de velocidad, 12V ~ 48V, 100A), el problema esta en los cambios de sentido y las aceleraciones i frenadas bruscas, si alguien me ayuda por favor, gracias
¿Cuánto consume cada motor?
Porque usar controladores para más corriente no tiene sentido si los motores no la consumen.
Y el código así analizamos las frenadas bruscas y los cambios de dirección?
Los motores son de 24 v 350w, lo que nos da cerca de 15 a, pero creo que puede haber picos muy altos, por ejemplo cuando se para el robot por un obstaculo, tiene fusibles de 30a que se los voy a cambiar por otros de 15, a ver si me salta el fusible y no el controlador.
El codigo que utilizo es este:
void loop() {
leeMando();
mueveMotoresConRC(CH1, CH2, CH3,CH5);
}//------------------ fin loop --------------------
void leeMando(){
CH1 = pulseIn(pin_DIR, HIGH, pulseInDelay);
CH2 = pulseIn(pin_AVANCE, HIGH, pulseInDelay);
CH3 = pulseIn(pin_Acelerador, HIGH, pulseInDelay);
CH4 = pulseIn(A11, HIGH, pulseInDelay);
CH5 = pulseIn(pin_SWITCH, HIGH, pulseInDelay);
CH6 = pulseIn(A13, HIGH, pulseInDelay);
}
void mueveMotoresConRC(int direccion, int avance, int acelerador, int onoff) {
//-- datos del radio control
int dirMax = 1950;
int dirMedium = 1450;
int dirMin = 960;
int avanceMax = 1976;
int avanceMedium = 1476;
int avanceMin = 960;
int switchUp = 976;
int switchMedium = 1470;
int switchDown = 1970;
int aceleradorMax = 1970;
int aceleradorMin = 1050;
int margenDeRebote=5;
int margenDeReboteAvance=250;
// Velocidad Maxima vmax
vmax=255;
// m1 es el motor izquierdo en la direccion de avance
// m2 es el motor derecho en la direccion de avance
Serial.println(onoff);
if (onoff >1200) {
digitalWrite(Pin_Stop_Engine,HIGH);} // Permite arrancar el generador
else {digitalWrite(Pin_Stop_Engine,LOW);}// Para el generador
acelerador = map(acelerador, aceleradorMin, aceleradorMax, 0, vmax);
acelerador = constrain(acelerador, 0, vmax);
int v1 = acelerador; //velocidad motor 1
int v2 = acelerador; // velocidad motor 2
direccion = map(direccion, dirMin, dirMax, -100, 100);
direccion= constrain(direccion, -100, 100);
//elimina el rebote del mando en la direccion
// if (abs(direccion)<margenDeRebote){direccion=0;}
if (direccion < 0) {
v2 = v2 + (v2*direccion/100);
if (v2 < 0)v2 = 0;
}
if (direccion > 0) {
v1 = v1 - (v1*direccion/100);
if (v1 < 0)v1 = 0;
}
if (avance > avanceMedium + margenDeReboteAvance) {
direccionAvance = 1;
} else {
if (avance < avanceMedium - margenDeReboteAvance) {
direccionAvance = -1;
}
}
Serial.print("ON/OFF : ");
Serial.print(onoff);
Serial.print(" Acelerador : ");
Serial.print(acelerador);
Serial.print(" Direccion : ");
Serial.print(direccion);
Serial.print(" Adelante : ");
Serial.print(direccionAvance);
Serial.print(" Avance : ");
Serial.println(avance);
// detectar cambios de marcha adelante-atras y viceversa
if (direccionAvance!=avanceAnterior){
for(int speed=acelerador; speed<0;speed-=10)
{
if (direccionAvance == 1) {
m2.TurnRight(speed);
m1.TurnLeft(speed);
} else {
m1.TurnRight(speed);
m2.TurnLeft(speed);
}
delay(200);
}
m1.Stop();
m2.Stop();
//m1.Disable();
//m2.Disable();
delay(500);
//m1.Enable();
//m2.Enable();
for(int speed=0;
speed<acelerador;speed+=10)
{
if (direccionAvance == 1) {
m2.TurnRight(speed);
m1.TurnLeft(speed);
} else {
m1.TurnRight(speed);
m2.TurnLeft(speed);
}
delay(200);
}
}
avanceAnterior=direccionAvance;
if (direccionAvance == 1) {
m2.TurnRight(v2);
m1.TurnLeft(v1);
} else {
m1.TurnRight(v1);
m2.TurnLeft(v2);
}
}
// ---------------------- fin mover motores rc
Porque crees que en un motor de 24V 15A necesitas un driver de 100A? No tiene sentido.
Hay que mejorar ese código para que funcione mejor.
Otro tema es que el BTS7960 tolera 43A mas que suficiente para que no pase nada.
El controlador tiene 2 pines que te dan realimentación de la corriente de funcionamiento
- R_IS: Salida medición de corriente derecha
- L_IS: Salida medición de corriente izquierda
Entonces si mides dichas corrientes sabrás que algo esta mal, y todo lo que este por encima de 15A requiere que tomes acciones correctivas.
Asi que vamos a ver como implementamos esto que te digo.
Para que al detenerse ocurra eso, es porque Pasas de la velocidad que traes a STOP y el motor no quiere hacerlo y responde con una fem contraria a tu alimentación. Esa tensión debe drenarse por los diodos que posee el puente H.
Pero también podrías actuar con una rampa de desaceleración rápida que mitigue el problema.
Lo primero seria que vienes a velociad Va y debes llevarlo a 0 y X mseg. No inmediato.
Entonces en ese momento tu varías la velocidad de Va a 0V en ese tiempo X y vigilando la corriente de modo que no supere los 15A. SI lo hace bajas aun mas el PWM o sea la velocidad para mantenerla en rango.
Sabes como hacerlo?
Además, para que el motor llegar a tener semejante pico de consumo se tiene que trabar o intentar empujar un obstáculo, lo que implica que hace falta algún tipo de detección de obstáculos, aunque sea un simple final de carrera con un bigote a modo de bumper.
Gracias por vuestra atencion de antemano, lo de la rampa es lo que tengo cuando detecto un cambio de sentido, bajo la velocidad en saltos de 10 y 200ms en cada salto y arranco hasta que alcanzar la velocidad que tenia de la misma forma, lo de usar los pines R_IS y L_IS, no los se usar y siempre que he leido sobre el bts, nunca he visto como.
Seria lo mas interesante, estar monitorizando la corriente en todo momento, porque uno de los accidentes habituales es que meta rueda en un hoyo y no pueda salir, entonces la corriente seguro que supera los 43a.
En la rampa que yo tengo creo que algo no va bien, lo voy a mirar pronto.
De la manera que comandas este motor estas a punto de quemarlo en toda acción que lo lleve al limite debes montar una rutina de seguridad que te garantice que eso no ocurra.
En tu código el error es tener delay no puedes tener un delay de 200mseg o de menos.
for(int speed=0;
speed<acelerador;speed+=10)
{
if (direccionAvance == 1) {
m2.TurnRight(speed);
m1.TurnLeft(speed);
} else {
m1.TurnRight(speed);
m2.TurnLeft(speed);
}
delay(200); // <====== PELIGRO INVITACION A LA FALLA
}
Es una invitación al fracaso.
200 mseg en que no haces nada, pero si le das permiso de quemarse!!
En ese tiempo debes estar monitoreando las corrientes.
Como? Simple midiendo el valor que entrega.
Debes reescribir todo, olvidar los delay() usar millis() y máquina de estados.
Ve a documentación y lee al respecto.
Supongamos que ya lo has hecho.
Pasemos a una prueba controlada, no extrema. Pones el motor a velocidad que consuma algunos amperes y mides con pinza amperométrica.
Luego mides la tensión en los pines que te he dicho con el tester y tmb con analogRead(pin). Encuentra la relación, que debe estar en el manual del Puente H por supuesto.
Fija un criterio de control. Un umbral que no debe superarse, y si se supera, el criterio mas simple es que no permitas que la corriente suba. Debes bajar el el ancho de pulsos o sea desacelerar.
Se entiende?
Hoja 17
Uff, mucho trabajo me has puesto, pero creo que llevas razon, empezare por medir la corriente, no tengo pinza amperimetrica pero la buscare, documentacion y electronica, lo de cambiar delay por milis no hay problema, os ire contando. Gracias
Si no quieres trabajar con los cálculos, abre la billetera porque vas a comprar varios puente H BTS7960.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
