Schon mal mit getrennter Versorgungsspannung für Motoren und Elektronik versucht?
mfg
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.
Schon mal mit getrennter Versorgungsspannung für Motoren und Elektronik versucht?
mfg
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?
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
Hi damfino,
Zitat von damfinoLeider 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 von damfino
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 von damfino
Die niedrigere Frequenz hilft erstmal nicht beim Spannungseinbruch. Und über die optimale Frequenz wurde z.B. hier diskutiert.Zitat von damfino
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
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.
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.
MfGCode:VCC + | +--->|---+-----> µC VCC |+ D === C /-\ | === GND
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.
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(); } }
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.
Lesezeichen