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
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