Forum: Mikrocontroller und Digitale Elektronik STM32F4 Pin Ausgangsstrom


von Michael S. (Gast)


Lesenswert?

Hallo,
Ich arbeite mit meinen Studienkollegen zur Zeit an einem kleinen 
Roboterprojekt. Als µC haben wir ein STM32F4 Discovery board.
Allerdings haben wir momentan ein Problem: die ganz normalen 
Ein/ausgänge sollten theoretisch bis zu 25mA bei 3V liefern können, aber 
bei uns kann man damit nicht einmal eine 3mA LED betreiben oder einen 
Transistor ordentlich durchschalten, ohne dass die Spannung am 
µC-Ausgang auf weniger als die Hälfte zusammenbricht.
Im Leerlauf funktionierts allerdings super.
Bevor wir jetzt alles auf Mosfets umlöten, wollten wir hier mal fragen 
ob jemand weiß, woran das liegen kann?
Vielleicht gibt es beim STM32 einen speziellen Initialisierungsbefehl, 
der erst die volle Leistung am Ausgang freischaltet?
Viele Grüße,
Michael

von (prx) A. K. (prx)


Lesenswert?

Michael S. schrieb:
> Ein/ausgänge sollten theoretisch bis zu 25mA bei 3V liefern können,

Nein. 25mA ist das absolute Maximum, jenseits davon dürfen sie bereits 
kurzfristig kaputt gehen.

Liefern können sie 8mA. Zu beachten ist aber auch die Gesamtsumme.

von Gynni (Gast)


Lesenswert?

Michael S. schrieb:
> Ein/ausgänge sollten theoretisch bis zu 25mA bei 3V liefern können
Es gibt sog. Datenblätter, die nähere Auskunft darüber geben. Je mehr 
Pins als Ausgang geschaltet und belastet werden, desto weniger kann der 
einzelne Pin liefern.

von ivan (Gast)


Lesenswert?

schön wäre eine skizze ausgängenbeschaltung fals möglich, was habt ihr 
für last am ausgang

von Max P. (eizo)


Lesenswert?

Michael S. schrieb:
> bei uns kann man damit nicht einmal eine 3mA LED betreiben oder einen
> Transistor ordentlich durchschalten

Die OnBoard Leds auf meinem leuchten dafür aber ganz gut. Leds kann man 
prima über ULN200x schalten statt direkt am Pin. Vielleicht könnt ihr 
eure Schaltung zeigen.

von Michael S. (Gast)


Lesenswert?

gut, aber eine 3mA LED sollte doch problemlos funktionieren? selbst wenn 
nichts anderes am µC board angeschlossen ist, bricht die Spannung so 
weit ein.

Schaltplan:

Board Pin -----R(300 Ohm)--------LED-------GND

auch mit verschiedenen Ausgängen getestet, immer das gleiche. Wie 
gesagt, im Leerlauf schaltet er stabil auf die 3V.

Gibt es bei der Initialisierung noch irgendetwas spezielles zu beachten?

von (prx) A. K. (prx)


Lesenswert?

Michael S. schrieb:
> Gibt es bei der Initialisierung noch irgendetwas spezielles zu beachten?

Ja, man sollte es richtig machen.

Nützlichere Antworten auf solche Fragen werden einfacher und 
insbesondere wahrscheinlicher, wenn man zeigt, was man an dieser Stelle 
konkret getan hat (lies: Code). Statt auf magisch gewonnene 
Assoziationen der Leser zu hoffen.

von ivan (Gast)


Lesenswert?

welche µc ist auf dem board, vielleicht nanowattbetrieb?

von Matthias K. (matthiask)


Lesenswert?

Michael S. schrieb:
> Gibt es bei der Initialisierung noch irgendetwas spezielles zu beachten?

Ja, jede Menge. Wie machst Du es denn momentan?

von Michael S. (Gast)


Lesenswert?

ein stm32F4 ist drauf, ist es wichtig welcher genau? Was ist 
Nanowattbetrieb?

hier der Code:
1
#define TESTLEDROTPORTCLOCK RCC_AHB1Periph_GPIOB
2
#define TESTLEDROTPORT GPIOB
3
#define TESTLEDROTBIT GPIO_Pin_11
4
5
6
7
//Init für TESTLEDROT
8
void test_led_init(void) {
9
10
GPIO_InitTypeDef GPIO_InitStructure;
11
RCC_AHB1PeriphClockCmd(TESTLEDROTPORTCLOCK, ENABLE);
12
13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
14
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
15
GPIO_InitStructure.GPIO_Pin = TESTLEDROTBIT;
16
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
17
GPIO_Init(TESTLEDROTPORT, &GPIO_InitStructure);
18
}
19
20
void led_rot_an(void){
21
GPIO_SetBits( TESTLEDROTPORT, TESTLEDROTBIT);
22
}
23
24
void led_rot_aus(void){
25
GPIO_ResetBits( TESTLEDROTPORT, TESTLEDROTBIT);
26
}

von holger (Gast)


Lesenswert?

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

von ivan (Gast)


Lesenswert?

wo ruffs du die void led_rot_an() routine auf? deklariert hast du sie, 
aber aufruf werde ich in while() schleife packen.
z.b.:
      while(1)
      {
        led_rot_an()
      }

was nanowatbetrieb ist kannst du bei www.sprut.de lesen :)

ich kenne mich leider nicht mit STM32F4 Discovery board, aber alle 
mikrocontroller ticken m.m.n. irgendwie ähnlich.

von (prx) A. K. (prx)


Lesenswert?

Mangels Definition als PushPull laufen die möglicherweise durch Zufälle 
des uninitialisierten Speicherinhalts der Struct als Open Drain mit 
Pullup. Das funktioniert dann ohne Last, aber nicht mit Last.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Immerhin ist der PullUp Widerstand aktiv. ;-)
Obwohl das in dem Fall eher nutzlos ist.

von Dirk (Gast)


Lesenswert?

Legt die LEDs (incl. R) auf V+ und µC-Pin. Die von euch gewählte 
Variante funktioniert auch auf anderen Controllern nicht besonders gut.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Tipp: Studiere Buchstabe für Buchstabe den letzen Post von Holger.

von (prx) A. K. (prx)


Lesenswert?

Dirk schrieb:
> Legt die LEDs (incl. R) auf V+ und µC-Pin. Die von euch gewählte
> Variante funktioniert auch auf anderen Controllern nicht besonders gut.

Zumal die Outputs dann mehr mA zulassen - aber wenn er das als 
(einzigen) Ausweg sieht, dann kriegt er den eigentlichen Fehler nie weg.

Anderer Tipp, wenn man die Lib verwendet: In der Lib gibt es Funktionen 
wie GPIO_StructInit, zur Initialisierung der jeweils verwendeten 
Structs. Wenn man die verwendet, dann kriegt man wenigstens definierte 
Defaults und keinen Zufall, wenn man einzelnen Komponenten nicht 
ausdrücklich einen Wert zuweist.

von Friedrich J. (franjuja)


Lesenswert?

Hallo Michael,

Die Initialisierung des Ports sieht für mich nicht klar aus. Ist zwar 
Out definiert, aber nicht klar op OpenDrain/Open Collector oder 
PushPull. Schau Dir die LIB-Doku mal an und auch das Datenblatt der 
GPIOs.

Im ersten Fall wirst du im EIN-Zustand durch den Pullup limitiert (+UB - 
Pullup - 330R - Diode - GND). Das gibt dann bei geschätzt 10k Pullup 
irgendwas im uA Bereich. Im AUS-Zustand fließt sowieso keiner (GND - 
330R- LED -GND).

Im PushPull Betrieb sollte das aber gehen. OC Betrieb macht aber auch 
Sinn für LEDs, dann musst Du aber ander beschalten, der 
Ausgnagstransistor schaltet nach GND, dann solltetst DU überlegen ob DU 
die LED nicht nach Vcc hängst. Der Pullup ist dann unsinnig.

Was studiert Ihr denn?
Und: Ja, die Kritik das Datenblatt mal genauer zu studieren wäre vielen 
Fragestellern hier anzuraten.

Grüße

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Und der STM32F2/F4 haben andere GPIO Register als der STM32F10x

von Michael S. (Gast)


Lesenswert?

Vielen Dank für die Zahlreichen Antworten! Es lag wirklich an der 
fehlenden Zeile in der Initialisierung, wie holger geschrieben hat. 
Eigentlich logisch, ich weiß nicht warum wir das selbst bei mehrmaligem 
Code-überprüfen nicht gemerkt haben.
Vielen Dank also! =)

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.