Forum: Mikrocontroller und Digitale Elektronik Probleme mit Motor an Atmega8/PWM


von Andreas G. (cpl)


Angehängte Dateien:

Lesenswert?

Hi!

Ich will einenn kleinen Gleichstrommotor per PWM durch einen Atmega8 
steuern.

Ich verwende ein Olimex Development Board AVR-P20. Da der 
Gleichstrommmotor bei der maximal gewünschten Leistung bei 3.74 Volt ca. 
358 mA Strom zieht, verstärke ich den vom Mega8 ausgegebenen Strom über 
vier Transistoren vom Typ BC547B in Parallelschaltung (siehe Bild).

Vier Stück deshalb, da ein BC547B lt. Datenblatt maximal 100mA abkann 
(absolute maximum rating); habe grad keinen anderen Transistor zur Hand.

Nun gebe ich über PB1 eine Spannung aus; der Basiswiderstand (vor den 
Transistoren) liegt bei 150 Ohm (anders als in der Zeichnung); bei max. 
5V Spannungsdifferenz Zwischen dem PB1 und GND bzw. VCC können also 
durch PB1 nach dem Ohmschen Gesetz max. 33mA fliesssen, also weniger als 
die 40mA die der Mega8 lt. Datenblatt pro Pin verträgt.

Das Datenblatt des BC547B sagt mir, dass bei 5V VCE 
(Collector-Emitter-Spannung) ein Steuerstrom von IB= 400 mikroampere 
reicht um einen Kollektorstrom von ca. 80mA durchzuleiten. Da ich nun 
per PWM deutlich mehr als 400 Mikroampere an PB1 ausgebe, müsste nun 
meiner Meinung nach 4*80mA= 360 mA durch den Motor fließen.

Tatsächlich dreht der Motor aber immer nur kurz auf, bis der Strom auf 
dem Board kurz ausfällt (die rote LED auf der Skizze geht ebenfalls 
aus).

Es sieht aus, als würde ich hier irgendwo einen Kurzschluss verursachen. 
Was mache ich falsch?

Grüße
CPL


1
#include <avr/io.h>       //allg. Headerdatei zum Einbinden von Registern
2
#include <stdint.h>       //Definition einiger ganzzahliger Datentypen sinnvoll, 
3
                          //an denen eindeutig die Bit-Länge abgelesen werden kann
4
5
#define FOSC 1843200      //gehört zur USART ansteuerung
6
#define BAUD 9600             
7
#define MYUBRR FOSC/16/BAUD-1 
8
#include <stdlib.h>
9
#define PI 3.141592654;   //konstante "Variable" definieren
10
11
uint8_t EINGELESENEBITS;  //Variable EIN... ist 8-Bit Integer ohne Vorzeichen
12
int16_t zaehle;
13
14
void USART_Init( unsigned int ubrr); 
15
void uart_puts (char *s);
16
void uart_putc(unsigned char c) ;
17
18
uint16_t getADCvalue(void);    
19
uint16_t result = 0;
20
21
void setDACvalue(uint16_t);
22
23
24
25
int main (void) 
26
  {
27
        ////////////////////////*Leuchtdiode IO schalten*/////////////////////////////
28
    //DDRC = 0xff;                     //Datenrichtungsregister setzen (1=Ausgang,0=Eingang), (dann ist PORTC von anfang an auf 1)
29
    DDRC |= (1<<DDC5);                //PC5 als Ausgang schalten, standardmässig ist dann 
30
                                      //PC5 in PORTC auf 0 (also LED an!!!)
31
    //PORTC = 0b00000000; 
32
    //PORTC = 0x40;                   //Daten ausgeben (1=Strom auf Pin, 0= kein Strom auf Pin)
33
    //PORTC = 0x40;                   //Hex-Schreibweise
34
    //PORTC = 0b01000000;             //binär-Schreibweise 
35
        //PORTC |= (1<<PC6);              //Einzel-Bitmanipulation
36
    //PORTC &= ~(1<<PC5);             //LED einschalten
37
    //PORTC |= (1<<PC5);              //LED ausschalten
38
    
39
  
40
    DDRD = 0x00;
41
    DDRB = (1<<PB1);    //PB1 = OC1A als Ausgan
42
    setDACvalue(0x384);      
43
  }  
44
          
45
      
46
  while(1) 
47
    {
48
        //leere schleife   
49
    }
50
  //wird nie erreicht
51
52
  return 0;                        //Funktion beenden, Rückgabewert 0 ausgeben
53
}
54
55
56
57
//=====================================
58
//====== DAC (PWM) Spannung ausgeben ==
59
//=====================================
60
void setDACvalue(uint16_t value)
61
  {  
62
    TCCR1A = (1<<WGM12)|(1<<WGM11)|(1<<WGM10);   //Fast PWM 10-Bit (Obergrenze 1023, Frequenz fTC1/1024)  
63
    TCCR1A |= (1<<COM1A1); //nicht Invertierende PWM: löschen beim raufzählen, setzen beim runterzählen
64
    //TCCR1A = (1<<COM1A1)|(1<<COM1A0); //Invertierende PWM
65
    TCCR1B = (1<<CS10);   //no prescaling
66
67
    //Compare Wert definiert Pulslänge
68
    //OCR1A = 0x0;
69
    //OCR1A = 0xa; //stark   dez 10
70
    //OCR1A = 0x64;  //dez 100   
71
    OCR1A = 0x384; //leuchtet weniger stark  dez 900
72
73
    OCR1A = value;
74
  }

von baerliner80 (Gast)


Lesenswert?

diode in gegenrichtung parallel zum Motor ?
Freilaufdiode .. wie bei einer Spule vom Relais??

keine Ahnung ob das stimmt ... der Moter wird gepulst und erzeugt ja 
wenn er "ausdreht" selbst strom ... ka. was die Transtoren denn 
machen...

Grüße

von Daniel V. (danvet)


Lesenswert?

- Wieviel Strom zieht der Motor bei 5V (Transistor voll aufgesteuert)? 
Schafft das dein Netzteil?
- Meiner Meinung nach fehlen bei den Transistoren die 
Gegenkopplungswiderstände (Emmitterwiderstände), sonst wird einer nach 
dem anderen gebraten.

Edit: ach ja: dein Motor zieht im Anlaufmoment wesentlich mehr Strom !

von Ralf (Gast)


Lesenswert?

Induktive Last an der Stromversorgung vom µC? -> geht, glaube ich immer 
schief. Einfach mal mit LED am Ausgang probieren. Wenn dann der gleiche 
Effekt auftritt, ist's die Software (habe ich mir jetzt noch nicht 
angesehen).

von Thomas E. (thomase)


Lesenswert?

Daniel V. schrieb:
> - Meiner Meinung nach fehlen bei den Transistoren die
> Gegenkopplungswiderstände (Emmitterwiderstände), sonst wird einer nach
> dem anderen gebraten.

Das nun nicht gerade.

Aber jeder Transistor braucht einen eigenen Basisvorwiderstand, damit er 
seine UBE richtig einstellen kann. Sonst zwängt er seine UBE den anderen 
drei auf. Man rechnet zwar mit einer gleichen UBE, in der Praxis gibt es 
aber Toleranzen.

Mal abgesehen davon, ist die Parallelschaltung von 100mA-Transistoren 
ohnehin nicht das Gelbe vom Ei. Da gibt es nun wirklich genug, die es 
alleine können.

Daniel V. schrieb:
> Edit: ach ja: dein Motor zieht im Anlaufmoment wesentlich mehr Strom !

Die Schaltung sollte mindestens 1A liefern können.

Ralf schrieb:
> Induktive Last an der Stromversorgung vom µC? -> geht, glaube ich immer
> schief.

Zumindest kann der Einschaltstrom des Motors die Spannung kurz
runterziehen und den µC resetten. Ein dicker Elko kann da Abhilfe 
schaffen.

Andreas G. schrieb:
> Was mache ich falsch?

Nimm was Vernünftiges. Z.B. einen L293(H-Bridge) oder einen anständigen 
Transistor. Ein ULN2803 geht auch. Bei dem kannst du die Treiber 
problemlos parallel schalten. Aber 4 BC547 ist die schlechteste Lösung.

mfg.

von Ralf (Gast)


Lesenswert?

noch ein Nachtrag:
Wie alt ist der Motor? Wie weit vom Controller weg? Stichwort: EMV

von Uwe (Gast)


Lesenswert?

1. Freilaufdiode!!!! An Motor (also in Sperrrichtung an den Motor 
kontakten)
2. Jeder!!! Transistor so 1Kohm oder 4,7kOhm als Basiswiderstand
3. Emiterwiderstand an jedem Transistor (so 1 bis nen paar Ohm)
könnte ne zeitlang laufen
besser nen Passenden Transistor oder ne Halb oder Vollbrücke
dann kannste auch die Drehrichtung verändern

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.