-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: 3x L298N für 3 Getriebemotoren beeinflussen sich gegenseitig

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500

    3x L298N für 3 Getriebemotoren beeinflussen sich gegenseitig

    Anzeige

    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.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.08.2004
    Ort
    Graz
    Beiträge
    342
    Schon mal mit getrennter Versorgungsspannung für Motoren und Elektronik versucht?

    mfg

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    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?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.418
    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

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: 3x L298N für 3 Getriebemotoren beeinflussen sich gegense

    Hi damfino,

    Zitat Zitat von damfino
    ... für jeden Motor ... ein L298 ... beiden Kanäle am Chip sind parallel geschaltet ...
    Zitat Zitat von damfino
    ... 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.

    Zitat Zitat von damfino
    ... 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 . . . .

    Zitat Zitat von damfino
    ... 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.

    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.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    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.

  7. #7
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    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
    Code:
         VCC
          +
          |
          +--->|---+-----> µC VCC
                   |+
              D   === C
                  /-\
                   |
                  ===
                  GND

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    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.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    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.

    Code:
    #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();
    }
    }

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    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.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •