PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3x L298N für 3 Getriebemotoren beeinflussen sich gegenseitig



damfino
13.10.2009, 15:29
Eigentlich sollte mein Robi die ersten eigenständigen Fahrten machen, aber es gibt folgendes Problem:
es funktionieren die Motoren nur wenn sie einzeln angeschlossen sind, wenn alle Motoren angeschlossen sind gehen die "Input" Leitungen auf Null.

Kurz zum Aufbau: für jeden Motor wird ein L298 verwendet, die beiden Kanäle am Chip sind parallel geschaltet, Sense geht direkt auf GND da ich den Spannungsabfall gering halten will und ich durch die Parallelschaltung 50% Reserve habe. Atmega32 mit 16Mhz, Fahrmotoren am Timer 1, 3. Motor an Timer 0, Input Leitungen über PC2-7, andere Eingänge derzeit abgehängt.

Das Programm schaltet alle Motoren mit 50% PWM ein, und lässt sie konstant in einer Richtung laufen.

Wenn die Motoren einzeln angeschlossen sind funktioniert alles: PWM, Richtung. Die einzelnen "Input" Leitungen haben die richtigen Pegel.
Wenn die 2 Fahrmotoren angeschlossen sind, macht ein Motor einen minimalen Ruck, der andere gar nichts, und das wars, da alle "Input" Leitungen der Antriebsmotoren auf Null sind machen die L298 auch nichts mehr.

Der 3. Motor funktioniert immer, mit je einem der Fahrmotoren, oder mit beiden zusammen. Die Fahrmotoren gehen dabei aber nicht

Da die Motoren einzeln funktionieren wird die Beschaltung der L298 keine Fehler aufweisen, sie ist genau nach Datenblatt ausgeführt inklusive Freilauf Dioden(Schottky) und Abblockkondensatoren, auch wenn man das dem Kabelwirrwar nicht so ansieht.
Auf unbeabsichtigte Lötbrücken ist alles schon x-mal untersucht worden.

Ich frage mich jetzt wie eine Last auf den Output Ausgängen der L298 Einfluss auf die Input Leitungen haben kann, noch dazu auch gleich für die vom nächsten L298.

Vielleicht hat jemand Ideen nach welchen Fehlern ich noch suchen kann.

Netzman
13.10.2009, 17:18
Schon mal mit getrennter Versorgungsspannung für Motoren und Elektronik versucht?

mfg

damfino
13.10.2009, 20:42
Habe derzeit nur 1 Akku, die alten Akkus haben das Zeitliche gesegnet..

Ich bin mit der PWM Frequenz runter gegangen (Prescaler auf 64), jetzt drehen sich die Motoren meistens, aber nicht immer. Werde wohl noch weiter runter gehen müssen. Dabei dachte ich eine höhere Frequenz sei besser?

Thomas$
13.10.2009, 21:16
mess mal die spannung wenn alle motoren an sind. ich hab das problem auch schon gehabt und geholfen hat getrennte stromversorgung für logik und leistung

oberallgeier
14.10.2009, 08:50
Hi damfino,


... für jeden Motor ... ein L298 ... beiden Kanäle am Chip sind parallel geschaltet ...
... Wenn die 2 Fahrmotoren angeschlossen sind, macht ein Motor einen minimalen Ruck, der andere gar nichts, und das wars ...Leider nennst Du weder Daten zum Akku noch zu den Motoren. Aber wenn Du schon je einen L298 mit beiden Kanälen an einen Motor schaltest, klingt das nach hohen Motorströmen.


... Habe derzeit nur 1 Akku ...Das dürfte das Problem sein: 1 Akku für Motoren und Controller - und hohe Motorströme. Die Motorströme sind beim Anfahren bekanntlich besonders hoch. Da könnte die Spannung so einbrechen, dass Dein mega32 ins Koma fällt. Vermutlich hast Du auch keinen Kondensator zum Abpuffern eines Spannungseinbruchs direkt vor dem Controller (dies ist - wenn man den als Energiespeicher verwendet - nur eine wirkliche Notlösung - Not kommt aus dem Englischen von NOT recommended ...). Wenn dann noch die Motorleitungen (hohen Ströme) an der Controllerzuleitung vorbeigehen . . . .


... Ich bin mit der PWM Frequenz runter gegangen ... Dabei dachte ich eine höhere Frequenz sei besser?Die niedrigere Frequenz hilft erstmal nicht beim Spannungseinbruch. Und über die optimale Frequenz wurde z.B. hier diskutiert. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=37410&sid=2beccf0bda2c65888c59b31cfd810d4f)

Fazit: Motoren separat versorgen. Controller separat versorgen. Notfalls im Testbetrieb einen Strang an ein Netzteil hängen und sehen, ob es dann störungsfrei geht.

damfino
14.10.2009, 09:23
Die Motorströme sind nicht so hoch, es sind 385er 5:1 Getriebemotoren mit 0,15A im Leerlauf, 0,8A bei max Effizienz, ich habe die Kanäle parallel geschalten um Reserven zum anfahren und für eventuelles blockieren zu haben, wobei letzteres nach ersten Motortests unwahrscheinlich ist.

Akku hat 12V Nennspannung und 4,2Ah, der hat nach dem Aufladen 13,7V und daran ändert sich nichts auch wenn die Motoren laufen (Roboter aufgebockt, dh im Leerlauf).

Kondensator vorm Controller existiert, 1000µF auf der 5V Schiene, dazu 100nF bei VCC am Controller.
Ebenso 1000µF auf der 12V Schiene vor den Motortreibern, jeder Motortreiber hat nochmal 100nF an den 5V VCC wie am Datenblatt vorgeschrieben.

Motoren sind mit Kondensatoren entstört-

Wenn sich die Motoren mal drehen habe ich keinen nennenswerten Spannungseinbruch, am Akku hat es vielleicht 0,1V weniger, an den Motoren liegen auch mehr als 10V an, soweit man mit PWM vernünftig messen kann.

Es werden ja durch irgendwelche Aktionen die Input Leitungen auf Null gesetzt, daher machen die Motortreiber im Fehlerfall gar nichts, die Teile bleiben alle kalt. Im Fehlerfall kommt also ein kurzer Einschaltimpuls, und dann ist alles aus.

PICture
14.10.2009, 11:31
Hallo!

Viel interessanter ist die Spannung an dem steuernden den L298 µC. Es müsste aber mit Oszi gemessen werden, da ein Multimeter keine sehr kurze Spannungseibrüche zeigen kann.

Ohne Oszi könnte man versuchen einen genögend grosen Elko (C) mit einer Diode (D) (Schottky ?) an Spannungsversorgung des µCs probieren (siehe Code). Sonst würde ich in der Software suchen.

MfG
VCC
+
|
+--->|---+-----> µC VCC
|+
D === C
/-\
|
===
GND

RP6conrad
14.10.2009, 19:55
Sieht dan eher aus nach SW fehler. Wir die hardware PWM von mega32 benutzt ? Dan mussen PD4 und PD5 fur PWM Ausgange genutzt werden.
Post mal die code.

damfino
15.10.2009, 19:52
Gestern Abend hatte alles funktioniert, Motorregelung, Richtungswechsel, Odometrie, bei 2khz PWM wie auch viele Modellbau Fahrtregler verwenden.

Heute geht gar nichts mehr. Wenn mal ein Motor läuft, ignoriert er zu 50% die Odometrie. Einzige Softwareänderung war die Odometrie raus aus dem Hauptprgramm rein in eine Funktion, lt Simulator zählt er schön mit.

Habe sogar die 5V seperat versorgt (9V Batterie + Spannungsregler), bringt keinen Unterschied. Die 5V Motortreiber hängen auch auf der Batterie, das könnte ich noch auftrennen und die Motortreiber auch auf den Fahrakku hängen so dass nur der µC an der Batterie ist, wenn es was bringt.

Das einzige was funktioniert ist die neu angeschlossene Status LED die 5x blinkt bevor die Motoren starten (sollten).

Meistens dreht sich der rechte Motor, manchmal der linke, der dann ausnahmsweise die Odometrie berücksichtigt, sehr selten beide Motoren, oft stehen sie.
Nur der 3. Motor geht zuverlässig.

An einen SW Fehler glaube ich nicht, mittlerweile kann ich das Datenblatt auswendig, aber ich poste die Motorsteuerung trotzdem, es gibt immer wen der sich besser auskennt. zB habe ich noch nicht herausbekommen wie man bei einer Funktion 2 Werte zurückgibt, deshalb ein paar ungeliebte globale Variablen.
Die Motoren drehen sich ab einem Wert von 150 in Zeitlupe, bei 200 schon mit etwas Kraft, und ab 500 geht eher das Rad runter bevor etwas blockiert.

Das JTAG Interface ist mit den Fuses ausgeschaltet damit am PortC nichts stört.



#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>



unsigned int odo_li,odo_li_x,odo_re,odo_re_x; //global für Odometrie und später Navigation
unsigned int timer;

volatile unsigned char timecount;

ISR(TIMER2_COMP_vect)
{timecount++;}


/* init PWM, Eingänge, Ausgänge definieren */
void init(void)
{
/* Ausgänge an Port C für Drehrichtungen der Motoren 2+3 Motor links, 4+5 rechts, 6+7 Mower */
DDRC = (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1<<PC6)| (1<<PC7);

/* Eingänge ohne Pullup*/
DDRB &= ~(1 << PB2); //Mower Odometrie
DDRA &= ~(1 << PA0); //links Odometrie
DDRA &= ~(1 << PA1); //rechts Odometrie
DDRA &= ~(1 << PA2); //Sensor Vorne
DDRA &= ~(1 << PA3); //Sensor Hinten

/* Eingang Bumper mit Pullup*/
DDRA &= ~(1 << PA4); PORTA |= (1<<PA4);

/* Ausgänge */
DDRB =(1<<DDB0); // Status LED

/* PWM Timer 1 Antriebsmotoren */
DDRD =(1<<PD4) | (1<<PD5); // PWM PIN als Ausgang schalten
TCCR1A =(1<<COM1A1) | (1<<COM1B1) | (1<<WGM10) | (1<<WGM11); //fast PWM 10Bit
TCCR1B=(1<<WGM12); //fast PWM /8/9/10 Bit
TCCR1B=(1<<CS11); // Prescaler 8

OCR1A = 0;
OCR1B = 0;
#define MotorLinks OCR1B
#define MotorRechts OCR1A

/* PWM Timer 0 Mower */

DDRB= (1<<PB3); // PWM PIN auf Ausgang
TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<COM01) | (1<<CS01); //fast PWM, Prescaler 8

OCR0=0;
#define Mower OCR0


/*+++++++Timer2++++++++++++++++*/
TCCR2 = (1<<WGM21) | (1<<CS20) | (1<<CS21) | (1<<CS22); // CTC Mode, Prescaler 1024
TIMSK = (1<<OCIE2); //Interupt compare match enable
OCR2=78; // alle 10ms 1 Interrupt

}

/*++++++++++++++++++++++++++++++*/

void Motor_li_vor()
{PORTC |= (1<<PC2);PORTC &= ~(1<<PC3);
}
void Motor_li_ru()
{PORTC |= (1<<PC3);PORTC &= ~(1<<PC2);
}
void Motor_li_stop()
{PORTC &= ~( (1<<PC2) | (1<<PC3) );
}
void Motor_li_faststop()
{PORTC |= (1<<PC2) | (1<<PC3);
}
void Motor_re_ru()
{PORTC |= (1<<PC4);PORTC &= ~(1<<PC5);
}
void Motor_re_vor()
{PORTC |= (1<<PC5);PORTC &= ~(1<<PC4);
}
void Motor_re_stop()
{PORTC &= ~( (1<<PC4) | (1<<PC5) );
}
void Motor_re_faststop()
{PORTC |= (1<<PC4) | (1<<PC5);
}
void Mower_vor()
{PORTC |= (1<<PB6);PORTC &= ~(1<<PB7);
}
void Mower_ru()
{PORTC |= (1<<PB7);PORTC &= ~(1<<PB6);
}
void Mower_stop()
{PORTC &= ~( (1<<PB6) | (1<<PB7) );
}
void Mower_faststop()
{PORTC |= (1<<PB6) | (1<<PB7);
}



/*******ODO auslesen++++*/
void odo()
{ if ((PINA &(1 << PINA0)) ) //links
{ if (odo_li_x==0)
{odo_li++;
odo_li_x=1;}}
else odo_li_x=0;

if ((PINA & (1 << PINA1)) ) //rechts
{ if (odo_re_x==0)
{odo_re++;
odo_re_x=1;}}
else odo_re_x=0;
if ((odo_re>200)&&(odo_li>200)) {odo_re=odo_re-100; odo_li=odo_li-100;}
}


int main(void)
{

char i;
unsigned int x;



sei(); //Interupt ein
init(); //Porteinstellungen, PWM

timer=0; timecount=0; zeit=0;zeitx=0;
odo_li=0;odo_re=0;

//*******************************

x=0;
/*+++++++Startverzögerung + Led blinken */
while (x<4)
{
PORTB |= (1<<PB0);//LED on
Warten();
PORTB &= ~(1<<PB0);Warten();//LED off

x++;
}
PORTB |= (1<<PB0);//LED on




Mower=220; Mower_vor();
Warten();Warten();

MotorLinks = 500;
MotorRechts = 500;
Motor_li_vor();Motor_re_vor();

while (1)
{

odo(); //Odometrie aktualisieren

if (odo_li>10) Motor_li_stop();
if (odo_re>20) Motor_re_stop();
}
}

RP6conrad
15.10.2009, 20:56
Muss da auch kein register ICR1 eingegeben werden fur diese fast PWM von Timer 1 ? Das ist der topvalue von timer 1 und bestimmt damit die PWM frequenz. Das kann ich nicht zuruckfinden in ihre code.

damfino
16.10.2009, 09:52
Nein, ich verwende Mode 7, da zählt er bis 0x03ff, PWM ensteht aus dem Vergleich von OCR1x mit dem Zähler.

damfino
16.10.2009, 14:09
Schön langsam glaube ich dass sich die L298 nicht mit meinen Fahrmotoren vertragen. Ich kann den 3. Motor (Johnson) an jedem der 3 L298 anschließen und es geht. Aber es verweigern praktisch immer die 385er Motoren, egal an welchem Anschluss. Dabei geht es noch besser wenn die PWM Frequenz niedrig ist, über 10khz rühren sie sich nie.

Am Anfahrstrom kann es kaum liegen, ich kann die Welle am Johnson so gut es geht mit den Fingern festhalten und er startet trotzdem. Die 385er laufen schon bei einer halb leeren 1,2V Mignon Akkuzelle sehr langsam aber gleichmäßig, das spricht für einen sehr niedrigen Anfahrtsstrom.

Hubert.G
16.10.2009, 15:49
Hast du die L298 schon mal ohne Kontroller probiert. Also die jeweiligen Eingänge manuell auf high oder low gelegt.

Thomas$
16.10.2009, 16:35
kann es sein das die 6 l298 alle eine einem port angeschlossen sind und zuviel strom ziehen? ich hab zwar das datenblatt so verstanden, dass nur 100µA zum schalten gebraucht werden aber ich kann mir vorstellen wenn du den strom nicht begrenzt das sie dann mehr nehmen. das also das port überlastet wird und damit der µC "spinnt".

damfino
16.10.2009, 16:36
Manuell geht es, aber dann liegen auch keine PWM Frequenzen an, sondern es ist alles konstant.
Es geht ja auch immer mit dem Johonson Motor, nur die 385er verweigern bei PWM, wobei es mit niedrigeren Frequenzen (<2khz) noch eher geht als mit hohen.

damfino
16.10.2009, 18:15
Habe eine neue Variante probiert: anstatt PWM die Ausgänge im µC auf High geschaltet, die L298 der Fahrmotoren können also nur mehr voll vorwärts, rückwärts, oder stop.
In dieser Ausführung starten die Motoren immer.

Dafür ist jetzt ein zusätzliches Problem sichtbar: das Programm wird anscheinend nicht richtig abgearbeitet, so wird der rechte Hall Sensor immer ignoriert, das Signal kommt aber am Pin vom µC an, und langsam genug dass ich mitzählen kann.

Bin total verwirrt, vorgestern ging alles perfekt, seitdem immer weniger, habe sogar schon den µC getauscht.

damfino
17.10.2009, 11:54
neuer Tag, neuer Versuch:
Habe die Stromversorgungen komplett getrennt, µC hat eine eigene, die Motortreiber eine eigene, die Motoren sowieso.
Interessanterweise funktioniert damit weniger als vorher, so geht der 3. Moter, der bisher immer startete, gar nicht. Es gibt einen kurzen Einschaltimpuls, dann ist der Ausgang auf Null.
Die Fahrmotoren sind wieder mal unzuverlässiger als gestern.

Auffallend ist, dass der Spannungsregler für die Motortreiber recht heiss wird, anders als der Regler für µC und LED.
Jetzt habe ich die Vermutung das mindenstens 1 Motortreiber defekt ist, und Strom für die Motoren auch über die Logikleitungen zieht, und damit den ganzen Programablauf stört.
Ich konnte heute auch einmal feststellen dass bei einem Treiber alle Eingänge korrekte Level aufwiesen, der Motor aber nicht lief. Beim nächsten Test lief der Motor wieder...
Bei einem Fehler in der Verdrahtung müssten immer die gleichen Ergebnisse herauskommen, und nicht solche geht-geht nicht Ergebnisse. Und das jeden Tag immer weniger funktioniert ist auch eigenartig, am 14. hatte ich es noch geschafft alle Motoren gezielt nach Odometrie zu regeln, seitdem geht immer weniger :(

021aet04
17.10.2009, 12:06
Kannst du die einzelnen Motortreiber herausgeben oder sind sie fix verlötet. Wenn du sie einzeln herausgeben könntest, könntest du den defekten leichter finden.

damfino
18.10.2009, 11:04
Ist alles super eingelötet, und da die Beine nicht perfekt ins Lochraster passen waren die Dinger schon vor dem Löten fest am Platz.
Ich habe die 5V Leitungen der Treiber unterbrochen, um sie so einzeln wieder in Betrieb nehmen zu können. Wenn ich die Treiber im laufenden Betrieb anschließe wird der µC resetet, und das bei einer eigenen Stromversorgung die mit dem Elko fast eine halbe Sekunde überbrücken kann. Die einzigen Verbindungen zum µC ist PWM und die beiden Input Leitungen, daher muss von diesen Leitungen so viel Strom gezogen werden dass der µC zusammen bricht.

Überlege auf L6205 Treiber umzusteigen, sollen sicherer sein und ein Sockel ist mir auch lieber als die 1 Pins beim L298.

cmock
18.10.2009, 14:15
Die einzigen Verbindungen zum µC ist PWM und die beiden Input Leitungen, daher muss von diesen Leitungen so viel Strom gezogen werden dass der µC zusammen bricht.

blöde frage: GND hast du auch verbunden, oder nicht?

cm.

damfino
18.10.2009, 15:21
GND ist verbunden.
Bzw war verbunden, habe alles aufgetrennt, und wie es aussieht ist vieles defekt. So gehen auch die 3 LED nicht mehr, sollten über 5V -> 1kOhm ->LED über µC auf Masse geschaltet werden, macht der µC aber nicht. Wenn ich das Kabel auftrenne kann ich an den Pins 5V oder 0,1V je nach Befehl messen, aber es wird nicht auf Masse durchgeschalten. An anderen Pins gehts, am PortB (0,1, 4) nicht. Umgekehrt geht es, die LED über 5V am Pin schalten, aber dann leuchten die LED nur sehr schwach.
Mir ist aufgefallen das der Programmer den Reset Pin nicht auf Null zieht, aber trotzdem erfolgreich programmiert, kann dass der Grund sein?

Auf alle Fälle kann ich wieder bei Null anfangen.