PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : L298: 2 Motoren - bei unterschiedlicher Richtung heiß



franzlst
17.02.2008, 16:42
Hi,

ich verwende zur Ansteuerung zweier Getriebemotoren den Motortreiber L298:
http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A200%252FL 298%2523STM.pdf

In dieser Beschaltung:
https://www.roboternetz.de/bilder/schaltung298getriebe.gif

Die Motorspannung beträgt etwa 24V.

Wenn ich die Motoren einzeln ansteuere (also nur ein Motor läuft),
funktioniert das Problemlos, links drehen, rechts drehen, ausschalten,
bremsen, PWM. Auch wenn beide Motoren sich in die selbe Richtung drehen
gibt es noch keine Probleme und der IC bleibt auch bei Belastung relativ
kühl.

Wenn ich jedoch die beiden Motoren in unterschiedliche Richtungen drehen
lasse, wird der IC selbst im Leerlauf schnell heiß. Die Motoren drehen
sich auch nur sehr langsam und ich messe eine Motorspannung von etwa 4V.

Der in Frage kommende Code:

Konstanten:

#define MOT_B_DDR DDRB
#define MOT_A_DDR DDRD

#define MOT_PWM_DDR DDRB

#define MOT_B_PORT PORTB
#define MOT_A_PORT PORTD

#define MOT_B_OCR OCR1B
#define MOT_A_OCR OCR1A

#define MOT_B_1 PB3
#define MOT_B_2 PB2

#define MOT_B_D1 DDB3
#define MOT_B_D2 DDB2

#define MOT_A_1 PD5
#define MOT_A_2 PD4

#define MOT_A_D1 DDD5
#define MOT_A_D2 DDD4

#define MAX_SPEED_PWM 1023

PWM initialisieren:

void init_pwm()
{
cli();

//Nicht invertierter 10 Bit PWM Timer 1
//Zusätzlich (1 << COM1A1) für invertierten Timer
TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << COM1C1) | (1 << WGM11) | (1 << WGM10);

//Timer auf CPU Takt stellen
TCCR1B &= ~((1 << CS11) | (1 << CS12));
TCCR1B |= (1 << CS10);

//Alle Motoren ausschalten
OCR1A = 0;
OCR1B = 0;

sei();
}

Motoren initialisieren:

void init_motoren()
{
MOT_A_DDR |= (1 << MOT_A_D1) | (1 << MOT_A_D2);
MOT_B_DDR |= (1 << MOT_B_D1) | (1 << MOT_B_D2);

//PWM Ports auf Ausgänge stellen
MOT_PWM_DDR |= (1 << 5) | (1 << 6);

init_pwm();
}

PWM-Funktionen:

void mot_a_pwm(uint16_t pwm)
{
cli();
MOT_A_OCR = pwm;
sei();
}

void mot_b_pwm(uint16_t pwm)
{
cli();
MOT_B_OCR = pwm;
sei();
}

Ansteuerung:

void mot_a_rechts(uint16_t pwm)
{
mot_a_pwm(pwm);
MOT_A_PORT &= ~(1 << MOT_A_1);
MOT_A_PORT |= (1 << MOT_A_2);
}

void mot_b_links(uint16_t pwm)
{
mot_b_pwm(pwm);
MOT_B_PORT &= ~(1 << MOT_B_1);
MOT_B_PORT |= (1 << MOT_B_2);
}

In main:

init_motoren();

mot_a_rechts(MAX_SPEED_PWM);
mot_b_links(MAX_SPEED_PWM);

Hat jemand eine Idee an was das liegen könnte? Ich bin im Moment
ziemlich ratlos.

Vielen Dank

Franz

McJenso
17.02.2008, 17:02
Hallo,

die main fehlt. Du aktivierst die Interrupts. Was für ISRs hast du. Auf welche Variablen wird da zugegriffen, wie sind die deklariert? Im anderen Forum übrigens das gleiche. Um den Fehler einzukreisen, würde ich mir ein kleines Testprogramm schreiben. Ohne PWM, ohne Interrupts, etc. Erst nur die Ausgänge zum 298 statisch setzen und schauen was passiert.

Gruß

Jens

franzlst
17.02.2008, 17:23
Hi,

in der main steht jetzt nur noch folgendes:

int main() {
MOT_A_DDR |= (1 << MOT_A_D1) | (1 << MOT_A_D2);
MOT_B_DDR |= (1 << MOT_B_D1) | (1 << MOT_B_D2);

//PWM Ports auf Ausgänge stellen
MOT_PWM_DDR |= (1 << 5) | (1 << 6) | (1 << 7);

PORTB |= (1 << PB5) | (1 << PB6);

MOT_A_PORT &= ~(1 << MOT_A_1);
MOT_A_PORT |= (1 << MOT_A_2);

MOT_B_PORT &= ~(1 << MOT_B_1);
MOT_B_PORT |= (1 << MOT_B_2);
while(1);
return 0;
}

Das Problem bleibt das gleiche, scheint also nicht mit den Interrupts und PWM zu tun zu haben.

McJenso
17.02.2008, 17:32
Hallo,

dann können wir uns ja der Hardware zuwenden. Vor der Schaltpananalys aber noch eine Frage? Haben die Motorengehäuse elektrisch Kontakt zueinander? Es gibt Motoren, bei denen ein Anschluß mit dem Gehäuse verbunden ist, bitte prüfe das einmal.

Gruß

Jens

franzlst
17.02.2008, 17:56
Hi,

es handelt sich um folgende Motoren: http://faulhaber.de/uploadpk/d_1624S_DFF.pdf

Ja die Motorengehäuse sind leitend verbunden. Die Anschlüsse sind wie im RN-Wissen entstört (als Masse hab ich das Gehäuse verwendet).

Der Roboter hat jedoch drei Antriebsmotoren (Omnidirektionalantrieb). Der dritte Motor ist über einen weiteren Motortreiber angeschlossen (L293, die beiden H-Brücken sind parallel geschalten).

Hier gibt es nicht das Problem, dass wenn ich diesen Motor in eine andere Richtung wie die anderen beiden drehe (oder auch in die Gleiche) dass die Spannung abfällt.

Eine Beobachtung habe ich gerade noch gemacht:
Die Motoren sind ja mit jeweils 2 Kabel am Motorboard angeschlossen,
einer ist bei "voller Fahrt" mit 24V, der andere mit Masse beschaltet.
Wenn ich die beiden Motoren nun mit unterschiedlichen Richtungen drehen
lasse, fällt ja die Spannung stark ab. Sobald ich aber bei dem einen
Motor das Kabel mit 24V entferne, dreht sich der andere Motor wieder
normal. Das gleiche wenn ich beim andern Motor das Massekabel entferne
dreht sich ersterer Motor normal (jeweils nur das andere Kabel entfernen
hilft nicht).
Komischerweise dreht sich jedoch der eine Motor, bei dem das Massekabel
entfernt wird, trotzdem noch, jedoch nur sehr langsam. Ist das vllt ein
Hinweis darauf dass da mit der Verkabelung was nicht stimmt?

Danke

Besserwessi
17.02.2008, 18:12
Da ist ein sicherer Hinweis das da was nicht stimmt. Erst man nchmessen ob das Motorgehäuse vom Stromkreis getrennt ist. Da kann im Motor eine Verbindung sein, oder Entstörkondensatoren sind defekt.

McJenso
17.02.2008, 18:24
Hallo,



Ja die Motorengehäuse sind leitend verbunden. Die Anschlüsse sind wie im RN-Wissen entstört (als Masse hab ich das Gehäuse verwendet).

Hat einer der Motoranschlüsse eine Verbindung zum Gehäuse? Das ist die erste entscheidende Frage. Ist das nicht der Fall kannst du die Ghäuse verbinden und das Potential sonstwohin legen. Prüf das bitte mit einem Messgerät, oder entferne jegliche Verbindung zu den Gehäusen (auch untereinander) und prüfe das Verhalten erneut.

Gruß
Jens

franzlst
17.02.2008, 18:35
Vielen Dank euch, ich denke das ist das Problem. Einer der Kontakte ist tatsächlich mit dem Gehäuse verbunden.
Ich versuche gerade den Kontakt zwischen Motoren und Grundplatte aufzuheben und bin zuversichtlich, das es dann funzt :)

Werde dann kurz berichten

Ciao

franzlst
17.02.2008, 22:44
Jopp, das war das Problem. Konnte zum Glück heute auch noch Plastikschrauben auftreiben und das Problem ist keines mehr :)