Hab mir für meinen Kettenbot eine Motoransteuerung mit dem L298N aufgebaut.verwendet hab ich die Schaltung aus dem Wiki mit den 8 dioden.Allerdings tritt bei der Ansteuerung, egal mit welcher PWM-Frequenz folgendes Problem auf: egal welchen wert ich für die geschwindigkeit eingebe ich bekomm nur 2V am motor heraus bei 12V Versorgungsspannung.Außerdem wird der l298 nach ca einer minute ziemlich heiß.
Ich bin mir ziemlich sicher dass es nicht an der software liegt da ich an den pwm ausgängen des µC ja die richtigen werte messe. z.B. 2,47V für halbe geschwindigkeit.Deswegen müsste ja der Fehler bei der L298 Schaltung liegen, aber auch dort habe ich nichts entdecken können.
Kann es sein das bei der Schaltung aus dem Wiki irgendwas fehlt (ich denk da an Kondensatoren) ?
Die motoren haben bei meinen messungen nie mehr als 0,8 A /motor gezogen also sollte der l298n ja ausreichen.Bin momentan sehr planlos was der Fehler sein könnte.
bei den motoren ist noch ein dünnes Kabel mit einigen Kondensatoren angelötet (soll wohl zur Entstörung dienen).Dieses kabel hab ich derweil nicht angelötet.Denke aber nicht dass das so viel ausmacht.
hier mal mein programm in c:
main.c
Code:
#include <avr/io.h>
#include "pwmlib.h"
int main(void)
{
PWMinit();
changespeed(256,256,FORWARD,FORWARD);
for(;;)
return 0;
}
pwmlib.h
Code:
#define LEFT_HIGH OCR1AH
#define LEFT_LOW OCR1AL
#define RIGHT_HIGH OCR1BH
#define RIGHT_LOW OCR1BL
#define FORWARD 1
#define BACKWARD 0
#define BRAKE 2
void PWMinit(void);
void changespeed(unsigned int,unsigned int,char,char);
void PWMinit ()
{
TCCR1A|=(1<<WGM11) | (1<<COM1A1) | (1<<COM1B1) ;
TCCR1B|=(1<<WGM12) | (1<<CS10 ) | (1<<CS11);
DDRD|=(1<<DDD4)|(1<<DDD5);
DDRB|=(1<<DDB0)|(1<<DDB1);
DDRC|=(1<<DDC6)|(1<<DDC7);
//DDRB = _BV(DDB0) | _BV(DDB1);
//DDRC = _BV(DDC6) | _BV(DDC7);
}
void changespeed(unsigned int speedleft,unsigned int speedright,char dir_right,char dir_left)
{
if(speedleft>511)speedleft=511; if(speedright>511)speedright=511;
if(speedleft<0 )speedleft=0 ; if(speedright<0 )speedright=0 ;
if(dir_right==0) {PORTB|=(0<<PB0)|(1<<PB1);} if(dir_right==1) {PORTB|=(1<<PB0)|(0<<PB1);} if(dir_right==2) {PORTB|=(0<<PB0)|(0<<PB1);} else {}
if(dir_left==0) {PORTC|=(0<<PC6)|(1<<PC7);} if(dir_left ==1) {PORTC|=(1<<PC6)|(0<<PC7);} if(dir_left ==2) {PORTC|=(0<<PC6)|(0<<PC7);} else {}
LEFT_HIGH = speedleft/256 ;
LEFT_LOW = speedleft%256 ;
RIGHT_HIGH = speedright/256 ;
RIGHT_LOW = speedright%256 ;
}
Lesezeichen