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
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.
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.
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.
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?
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.
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.
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.
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.
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
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! =)