Forum: Mikrocontroller und Digitale Elektronik FET Ansteuerung über AVR, Problem mit Pulldown/Gate-Source Widerstand


von Rene Meier (Gast)


Lesenswert?

Hallo,

möchte über einen AVR an Port C vier DC-Motoren (12V bei ca. 3000mA) 
schalten (nur an/aus alle ~5min, kein PWM) und wollte dazu an vier 
Portpins (Pin C0...C3) jeweils direkt einen IRLZ 34N anschließen. Das 
ist ein Logic Level MOSFET und ich hatte daher keinen Vorwiderstand zw. 
Gate und AVR Pin eingeplant, sondern "nur" einen Pulldown/Gate-Source 
Widerstand von 100k. Zusätzlich eine 1N4148 zwischen Drain und 12V als 
Freilaufdiode.
Da ich es erst einmal testen wollte, habe ich auf einem Brettaufbau mit 
einem IRFZ 44N (also kein Logic Level!) an einem Pin (Pin C0) einen 
Versuch gestartet. Leider geht das gehörig schief...
Wenn die 100k Pulldown/Gate-Source Widerstand in der Schaltung sind, 
stürzt der AVR immer beim Schalten ab. Entferne ich die 100k, läuft 
alles wie gewünscht. Der Pin des AVR ist dabei als Ausgang geschaltet, 
der AVR interne Pullup ist deaktiviert. Was geht hier schief?
Brauche ich an der Stelle schon einen Treiber? Da ich Logic Level 
MOSFETs nutze: würde ein günstiger 74AC14 ausreichend sein (der Inverter 
würde natürlich mein Schaltsignal invertieren), oder müssten es vier 
teure Treiber sein, bzw. zwei MCP 14E9?

Gruß, Rene

von Ach Du grüne Neune (Gast)


Lesenswert?

Schalte mal einen 220R Widerstand zwischen AVR-Ausgang und Gate.

von Ach Du grüne Neune (Gast)


Lesenswert?

Rene Meier schrieb:
> der AVR interne Pullup ist deaktiviert.

Du meinst wahrscheinlich Pull Down?

von Einer K. (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Rene Meier schrieb:
>> der AVR interne Pullup ist deaktiviert.
>
> Du meinst wahrscheinlich Pull Down?
Integrierte Pulldown sind bei AVRs recht selten ;-)

von Ach Du grüne Neune (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Integrierte Pulldown sind bei AVRs recht selten ;-)

Gut, aber dann brauchst du irgendwoher eine positive Spannung zum 
Ansteuern der Gates. Sei es über Push Pull Treiber, oder Pullups.

von Jens G. (jensig)


Lesenswert?

>Was geht hier schief?

Du hast die Abblock-Kondensatoren vergessen am µC, hast eine schlechte 
Masseführung in Bezug auf die Motorströme, und ähnliche Fehler ...

von Finga Heba (Gast)


Lesenswert?

Rene Meier schrieb:
> möchte über einen AVR an Port C vier DC-Motoren (12V bei ca. 3000mA)
> schalten

Wenn die Motoren ihren Strom auch über die Masse des Controllers
beziehen dann darf man das Layout der Masse nicht mehr ausser
Acht lassen bzw ignorieren. Schwankende Masseströme können den
AVR Controller massiv stören.

Rene Meier schrieb:
> Was geht hier schief?

Zeige deine Schaltung und den Aufbau wenn du das geklärt haben
willst!

von Finga Heba (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Gut, aber dann brauchst du irgendwoher eine positive Spannung zum
> Ansteuern der Gates.

Seltsamerweise kann die aus einem AVR Controller Pin herauskommen.
Wunder der Technik!

von Einer K. (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Gut, aber dann brauchst du irgendwoher ...


Ich nicht...
Aber der TO, und das hat er wohl, da er den Pin als Ausgang definiert 
hat.

Ansonsten:
Kein Bild, kein Schaltplan und kein Code.

Demnach:
Meine Telepathischen Fähigkeiten sind ausgereizt.

Eine  1N4148 scheint mir arg winzig zu sein, für einen 3A Motor.

von Maxim B. (max182)


Lesenswert?

Ach Du grüne Neune schrieb:
> Gut, aber dann brauchst du irgendwoher eine positive Spannung zum
> Ansteuern der Gates.

Und? Das ist doch AVR, als Ausgang geschaltet...

von Christian S. (roehrenvorheizer)


Lesenswert?

Aber Deine Kleinsignaldioden sind viel zu zierlich für die 3 A, die 
geschaltet werden sollen.


mfG

von Ach Du grüne Neune (Gast)


Lesenswert?

Finga Heba schrieb:
> Seltsamerweise kann die aus einem AVR Controller Pin herauskommen.
> Wunder der Technik!

Ja, aber der TO behauptet den internen Pullup deaktiviert zu haben.

Rene Meier schrieb:
> der AVR interne Pullup ist deaktiviert.

Arduino Fanboy D. schrieb:
> Eine  1N4148 scheint mir arg winzig zu sein, für einen 3A Motor.

Das kommt noch dazu.

von Finga Heba (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Eine  1N4148 scheint mir arg winzig zu sein, für einen 3A Motor.

Er hat unterlassen zu sagen ob die 3 Ampère für einen oder drei
Motoren gedacht sind.

von Einer K. (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Ja, aber der TO behauptet den internen Pullup deaktiviert zu haben.

Welches "aber" ist das?

von Finga Heba (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Ja, aber der TO behauptet den internen Pullup deaktiviert zu haben.

Das ist nicht relevant für einen Pin der als Ausgang geschaltet ist.

von Einer K. (Gast)


Lesenswert?

Finga Heba schrieb:
> Er hat unterlassen zu sagen ob die 3 Ampère für einen oder drei
> Motoren gedacht sind.
Ja..

Und dennoch:
Ein 55A FET, und dann so eine Diode...
Das passt nicht zusammen.

von Christian S. (roehrenvorheizer)


Lesenswert?

Und das Gate direkt an einen Ausgang schalten, kann gut gehen, aber 
besser ist es über einen Widerstand. Der Umladestrom ist bereits recht 
hoch ohne Widerstand. Die vorgeschlagenen 220 Ohm sind nicht verkehrt, 
bei seltenem Schalten kann auch 1...2 KOhm passen. Der Pulldown dürfte 
nur im hochohmigen Zustand der Pins relevant sein und sonst nie. Kann 
auch etwas kleiner sein, z.B. 33 kOhm.

mfG

von Wolfgang (Gast)


Lesenswert?

Rene Meier schrieb:
> Da ich es erst einmal testen wollte, habe ich auf einem Brettaufbau mit
> einem IRFZ 44N (also kein Logic Level!) an einem Pin (Pin C0) einen
> Versuch gestartet. Leider geht das gehörig schief...

Wie sieht es denn mit dem Anlaufstrom deiner Motoren aus. Der beträgt 
gewöhnlich ein Vielfaches des Nennstromes.

von Ach Du grüne Neune (Gast)


Lesenswert?

Finga Heba schrieb:
> Das ist nicht relevant für einen Pin der als Ausgang geschaltet ist.

Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen 
Kollektor konfigurieren, dann hätte man von außen direkt einen Pullup an 
12V schalten können und bräuchte keinen Logic-Level-Mosfet mehr.
Aber das hat sich ja jetzt erübrigt.

von Einer K. (Gast)


Lesenswert?

Ach Du grüne Neune schrieb:
> Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen
> Kollektor konfigurieren,
Nein, das kann ein AVR normaler weise nicht!
OK, die TWI Einheit kann es, aber da sind wir nicht.

von Christian S. (roehrenvorheizer)


Lesenswert?

"dann hätte man von außen direkt einen Pullup an
12V schalten können"

Wie? Und dann den hochohmigen Ausgang mit mehr als die 5V 
Betriebsspannung beaufschlagen? Kann gehen, aber wie lange.


mfG

von dirk (Gast)


Lesenswert?

Gruss

An die verwendete Diode dachte ich zuerst,
als ich das hier las.
UF und BYW Dioden u.a. sind in dem Zusammenhang bekannt.
Die auftretenden
Induktionsspannungen sind
noch zu beachten.

Ein Schönes Wochenende wünsche ich Euch
Dirk St

von Rene Meier (Gast)


Lesenswert?

WOW, das ging ja mehr als schnell!

Aktuell ist das ganze fliegend aufgebaut: größtenteils auf Lochraster 
gelötet, teilweise auf einem Brettboard gesteckt... ( den MOSFET wollte 
ich z.B. nicht "verlöten").
Habe nun den Pulldown auf 39k verringert und zusätzlich einen 1.2k in 
Reihe zwischen AVR Pin und Gate vom MOSFET gelötet: es funktioniert!
Bzgl. der Diode muss ich mir mal eine größere suchen. Da ich aber 
dachte, dass die nur "Fehlerströme" ableiten muss und nicht den vollen 
Strom, hatte ich da so eine kleine gewählt.

Danke an alle, das Basteln kann weitergehen. Gruß und schönen Abend,

Rene

von Thomas (kosmos)


Lesenswert?

dieser 3A Motor wird einen Anlaufstrom von mind. 10A haben und für 
deinen 7805 bleibt dann nichts mehr übrig. Also ruhig ein paar größere 
Elko mit der Gießkanne verteilen (am Motor und am LM7805 mit ggf. einer 
Diode davor damit dieser nicht vom Motor leergezogen wird) und unbedingt 
die empfohlenen Kerkos verbauen siehe AVR042

Zur Diode, diese muss kurzzeitig die 3A verkraften die beim Abschalten 
weiterfließen wollen. Einem 1A Typ würde ich das zutrauen so einer 100mA 
Diode aber nicht.

Wenn da aber später dauerhaft eine PWM eingesetzt wird dann wähle gleich 
eine Diode die das dauerhaft schafft.

von Rene Meier (Gast)


Lesenswert?

Der Betrieb erfolgt über ein altes "externe HDD" Netzteil das 12V und 5V 
bereitstellt: die 5V für den AVR, wobei der an den VCC Pins jeweils 
seine 100nF hat und einen 4,7uF davor, die 12V für die Motoren. Wie 
gesagt: läuft jetzt (mit einem Motor/Pin)
Vielleicht aus Glück, aber es läuft ;-) Mache mich nun an den Schaltplan 
für die vier Motoren und lasse mir eine Leiterplatte für SMD ätzen, dann 
geht es in ein paar Wochen weiter.

Rene

von Finga Heba (Gast)


Lesenswert?

Rene Meier schrieb:
> das Basteln kann weitergehen.

Nö, das nennt man solide Entwicklung. Voll durchdacht und ausgetestet.
Entwicklung ist abgeschlossen. Lese bloss nicht den ganzen Schrott den
wir dir hier geschrieben haben.

von Maxim B. (max182)


Lesenswert?

Arduino Fanboy D. schrieb:
>> Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen
>> Kollektor konfigurieren,
> Nein, das kann ein AVR normaler weise nicht!

Was für Problem? PORT = 0, mit DDR wird manipuliert. Ist DDR 0, dann ist 
Ausgang offen. Ist DDR 1, dann ist Ausgang zu GND gezogen. Nur Vcc darf 
Ausgang nicht überschreiten.

von Ach Du grüne Neune (Gast)


Lesenswert?

Als Diode geht eine 1N5404.

von Einer K. (Gast)


Lesenswert?

Maxim B. schrieb:
> Arduino Fanboy D. schrieb:
>>> Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen
>>> Kollektor konfigurieren,
>> Nein, das kann ein AVR normaler weise nicht!
>
> Was für Problem? PORT = 0, mit DDR wird manipuliert. Ist DDR 0, dann ist
> Ausgang offen. Ist DDR 1, dann ist Ausgang zu GND gezogen. Nur Vcc darf
> Ausgang nicht überschreiten.

Das ist ein durchaus brauchbarer Notnagel.
Aber keine Konfiguration.
Der AVR kennt keinen Open Drain Mode.
Außer, wie schon gesagt die TWI Einheit.

von Maxim B. (max182)


Lesenswert?

Arduino Fanboy D. schrieb:
> Der AVR kennt keinen Open Drain Mode.

Und die Variante mit DDR - ist das keine Open Drain Mode? Dann was ist 
das?
Wenn etwas sieht aus wie eine Ente, geht wie eine Ente, schwimmt wie 
eine Ente, spricht wie eine Ente - ist das bestimmt der Falke, nicht 
wahr? :)

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Maxim B. schrieb:
> Und die Variante mit DDR - ist das keine Open Drain Mode?
Nein!

Maxim B. schrieb:
> Dann was ist das?
Eine Nachbildung per Software, weil die Hardware es nicht vorsieht.

Maxim B. schrieb:
> enn etwas sieht aus wie eine Ente, geht wie eine Ente, schwimmt wie
> eine Ente, spricht wie eine Ente - ist das bestimmt der Falke, nicht
> wahr? :)
Nee, das ist Donald Trump!

von Maxim B. (max182)


Lesenswert?

Arduino Fanboy D. schrieb:
> Eine Nachbildung per Software, weil die Hardware es nicht vorsieht.

Software kann in jedem Fall keinen Strom leiten. Das macht nur Hardware. 
Es gibt komplementare Paar von Transistoren. Wenn wir obere, P-MOSFET, 
ausschalten, bekommen wir N-MOSFET alleine, d.h. mit offenem Drain. Wenn 
wir untere, N-MOSFET, ausschalten, bekommen wir P-MOSFET alleine. Das 
alles macht Hardware. Wäre separate Steuerung von Transistoren mittels 
Hardware nicht vorgesehen, so wäre das nicht möglich.
Welche Bit in welchem Register sollte man dafür auf 1 oder auf 0 setzen, 
ist nicht prinzipiell.

Also, wir haben in AVR Möglichkeit, N-MOSFET oder P-MOSFET mit offenem 
Drain benutzen. Im Fall von N-MOSFET ist dann Ausgang invertierend, aber 
das ist kein Problem für einen Mikrocontroller: entweder gibt man "~" in 
C, oder in Assembler schreibt man sbi statt cbi und umgekehrt, das macht 
keine Verluste von Flash oder von SRAM.

Mag sein, daß du damit ein Verständnisproblem hast. Aber erinnere mal, 
wie viele "verschiedene" Assembler-Befehle in AVR gleiche Maschinencode 
haben. Oder sagst du etwa, einige sind "echte" Befehle und andere sind 
"falsche" ? :) Genau so mit Ausgangssteuerung: es ist nicht wichtig, wie 
genau du N-MOSFET oder P-MOSFET ausschaltest. Wichtig ist nur, daß das 
funktioniert. Und das funktioniert nur deshalb, weil Hersteller solche 
Möglichkeit in Hardware vorgesehen hat.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ach Du grüne Neune schrieb:
>> Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen
>> Kollektor konfigurieren,
> Nein, das kann ein AVR normaler weise nicht!

Da hast du zweifels ohne Recht. Die AVR Controller sind in CMOS-Technik 
aufgebaut, d.h. die kann man folglich auch nur als Open Drain ansteuern.

Die Sache mit den 12V geht nicht, weil maximal eine Spannung von 
VCC+0.5V an den Pins zulässig ist (Ausnahme Reset). Grund dafür sind die 
Schutzdioden. Die schematische Darstellung des Innenlebens der IO-Ports 
findet sich in jedem AVR Datenblatt.

von Christian S. (roehrenvorheizer)


Lesenswert?

> Habe nun den Pulldown auf 39k verringert und zusätzlich einen 1.2k in Reihe 
>zwischen AVR Pin und Gate vom MOSFET gelötet: es funktioniert!

Applaus, Applaus, es funktioniert! Und die Diode leitet putzige 
Fehlerströme ab.


MfG

von Wolfgang (Gast)


Lesenswert?

Rene Meier schrieb:
> Da ich aber dachte, dass die nur "Fehlerströme" ableiten muss und
> nicht den vollen Strom, hatte ich da so eine kleine gewählt.

Du hast die Funktion einer Freilaufdiode noch nicht verstanden. Die 
sorgt dafür, dass in der Induktivität der Strom nicht schlagartig 
aufhört zu fließen, wenn der FET abschaltet.
Bau dir die Spuleninduktivität mit dem schaltenden FET einfach mal in 
LTSpice nach und guck, was beim Abschalten passiert (Ströme durch Diode 
und Induktivität, Spannung am Drain), einmal mit und einmal ohne 
Freilaufdiode. Und dann überlege dir, wie der Stromkreis bei 
abgeschaltetem FET aussieht.

von Einer K. (Gast)


Lesenswert?

Wolfgang schrieb:
> Da hast du zweifels ohne Recht. Die AVR Controller sind in CMOS-Technik
> aufgebaut, d.h. die kann man folglich auch nur als Open Drain ansteuern.

Als Open Drain ansteuern, ist eine Sache.
Als Open Drain konfigurieren, ist die andere Sache.
Das letztere, eben das konfigurieren, kann man beim AVR nicht machen.
Andere µC können das schon.

Maxim B. schrieb:
> Mag sein, daß du damit ein Verständnisproblem hast.
Wenn dir der semantische Unterschied nicht klar ist, zwischen "zum Open 
Drain konfigurieren", oder als "Open Drain betreiben", dann tust du mir 
leid.
Dann hast du noch ganz andere Probleme, als du bisher geglaubt hast.

Die Ansage war:
Ach Du grüne Neune schrieb:
> Ach soo, und ich dachte schon man könnte den Ausgang auch als offenen
> Kollektor konfigurieren,...
Das geht bei AVRs eben nicht, bei anderen µC u.U. schon.

Da kannst du dich ruhig uneinsichtig zeigen und  dich höllisch 
blamieren.
Meinen Segen du hasst.

von Rene Meier (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

auch wenn das hier ausartet, anbei noch der zusammenkopierte Schaltplan 
in einem Stück.

Gruß, Rene

von Finga Heba (Gast)


Lesenswert?

Rene Meier schrieb:
> auch wenn das hier ausartet, anbei noch der zusammenkopierte Schaltplan
> in einem Stück.

Bin gespannt ob dich roehrenvorheizer rettet. Aber nachdem
was ich bis jetzt von dir gelesen habe - eher nicht.

von Maxim B. (max182)


Lesenswert?

Arduino Fanboy D. schrieb:
> Als Open Drain ansteuern, ist eine Sache.
> Als Open Drain konfigurieren, ist die andere Sache.

Bravo Professor! Gute Erklärung erfunden! :)

Hauptsache, das funktioniert: auch AVR kann Outputs mit Open Drain 
haben. Wie du das nennst, ist nicht wichtig.

von Einer K. (Gast)


Lesenswert?

Rene Meier schrieb:
> anbei noch der zusammenkopierte Schaltplan
> in einem Stück.

R19 und R6 bilden einen Spannungsteiler.
Das ist eher kontraproduktiv an der Stelle.

Abhilfen:
Das Verhältnis verbessern, z.B. 100R zu 100k
Oder den Pulldown vor dem Gatewiderstand anschließen.


------------------

Maxim B. schrieb:
> Bravo Professor! Gute Erklärung erfunden! :)

Klar kannst du mich für dein mangelhaftes Textverständnis verantwortlich 
machen.
Viel Spaß dabei.....

von Wolfgang (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wolfgang schrieb:
>> Da hast du zweifels ohne Recht. Die AVR Controller sind in CMOS-Technik
>> aufgebaut, d.h. die kann man folglich auch nur als Open Drain ansteuern.
>
> Als Open Drain ansteuern, ist eine Sache.
> Als Open Drain konfigurieren, ist die andere Sache.
> Das letztere, eben das konfigurieren, kann man beim AVR nicht machen.

Sprich mal Klartext.
Was willst du da groß konfigurieren. Du setzt das Port-Bit fest auf Low 
und steuerst das DDR-Bit. Schon hast du einen Open-Drain Ausgang.

von Einer K. (Gast)


Lesenswert?

Wolfgang schrieb:
> Du setzt das Port-Bit fest auf Low
> und steuerst das DDR-Bit. Schon hast du einen Open-Drain Ausgang.

Das sollte doch mittlerweile klar sein, das der übliche AVR GPIO keinen 
Open Drain Mode kennt, man es also auf diese Art simulieren muss.
Da gibt es nichts zu konfigurieren.
Und nichts anderes sage ich die ganze Zeit.
Wie ein Papagei....

Die grüne neune wollte genau das aber tun.
Zumindest sagte er das.
Soll ich es nochmal zitieren, oder findest du das selber?

Andere µC können das allerdings sehrwohl!
Die kennen einen expliziten Open Drain Mode.
Als Beispiele seien genannt:
8051
ESP32
ESP8266
Manche ARM
Dort stellt man den GPIO auf Open Drain, und der Pin ist in dieser 
Konfiguration nicht mehr in der Lage Vcc auszugeben, sondern muss per 
Pullup dahin gezogen werden.

Vorteil:
Man verwendet den gleichen Code zum toggeln des Pins.
Sowohl im Open Drain Mode, als auch im Push-Pull Mode.
Ein nettes Feature, welches der gemeine AVR nicht bietet


Das ist der Unterschied!
Einmal die Simulation, und einmal die Konfiguration.
Jetzt klarer geworden?
Ansonsten kann ich nur raten, sich über die beiden Worte kundig zu 
machen, so lange, bis die korrekte Bedeutung in die Hirnwindungen 
getropft ist.

von Wolfgang (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Das sollte doch mittlerweile klar sein, das der übliche AVR GPIO keinen
> Open Drain Mode kennt, man es also auf diese Art simulieren muss.

Da ist nichts simuliert. Das ist echt.
Was kennt der nicht? Steht irgendwo geschrieben, dass es verboten ist, 
das DDR zu benutzten.
Oder wird dieser Mode nur von deiner Assemblercodeerzeugungssoftware 
nicht unterstützt?

von HildeK (Gast)


Lesenswert?

@Arduino Fanboy D., heute der Don Quichotte im Forum: du kämpfst gegen 
Windmühlenflügel 😉

von Maxim B. (max182)


Lesenswert?

HildeK schrieb:
> du kämpfst gegen
> Windmühlenflügel 😉

Nein, er kämpft gegen DDR :)

von Carsten-Peter C. (carsten-p)


Lesenswert?

Wolfgang schrieb:
> Du setzt das Port-Bit fest auf Low
> und steuerst das DDR-Bit. Schon hast du einen Open-Drain Ausgang.

Genau so ist es. Gut beschrieben.

von Einer K. (Gast)


Lesenswert?

HildeK schrieb:
> @Arduino Fanboy D., heute der Don Quichotte im Forum: du kämpfst
> gegen
> Windmühlenflügel 😉

Ach sollen sie doch glücklich werden, in ihrer kleinen AVR Welt, und den 
Rest ausblenden.
(wenn Dummheit quietschen würde, dann müssten die Burschen den ganzen 
Tag mit der Ölkanne rum laufen)

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.