Forum: Mikrocontroller und Digitale Elektronik irf540ns - pull-down notwendig?


von leif (Gast)


Lesenswert?

Hallo,

meine LEDs leuchten jetzt auch mit C! Und ich kann xe senden. Toll,
was!? anfängereuphorischsei
Ich werde allerdings nochmal rausfinden müssen, warum jetzt schon knapp
20% meines tn2313 gefüllt sind.. liegt's an der delay.h? naja.

Jedenfalls habe ich es eben gewagt, eine Spule meines Schrittmotors
anzuschalten, was sogar funktioniert hat - nur leider bleibt der MOSFET
auch durchgeschaltet, wenn nach 60ms der AVR seinen Pin wieder 'low'
setzt (wenn ich mit dem Oszi rangehe, reicht es jedoch schon, um
auszuschalten).

Also nehme ich an, da fehlt noch ein pull-down!? 10K?
Wie messe ich, ob das Ding voll durchschaltet? Über den
Spannungsabfall?

Wenn der Motor sich dann dreht, mach ich mich an die Timer ran .. und
hoffe, daß ich für mein Programm mit dem vorhandenen Platz auskomme.

Wieder in dankbarer Erwartung,

Leif

von leif (Gast)


Lesenswert?

Mhh. schaltet auch mit 10K nach GND nicht ab!

von Tobias S. (tobias)


Lesenswert?

Wenn du den Ausgang auf 0 schaltest ist das der beste Pulldown, denn du
haben kannst :)

Ist es vll. ein mechanisches Problem?

Gruss Tobias

von leif (Gast)


Angehängte Dateien:

Lesenswert?

Und auch nicht richtig ein. S*****ding. Ich häng nochmal den Schaltplan
an, vielleicht fällt Euch ja was ein. Bitte!?

von leif (Gast)


Lesenswert?

und hier der code, könnte ja sein:

initialisierung..

PORTD = 0x00;   /* Low */
DDRD  = 0x03;   /* Ausgänge, alles andere Eingänge */


einschalten geht..

        PORTD |= (1<<6);
        _delay_ms(100);
              PORTD &= ~(1<<6);

aber aus geht er nicht.
es reicht wenn ich mit dem finger ans gate gehe, dann brummt der motor
mit 50hz.
wenn ich mit dem oszi am gate messe, schaltet er mehr oder weniger ab.

kann es irgendwas damit zu tun haben, daß an derselben spule noch ein
anderer fet hängt?

ratlos,

leif

von Rolf Magnus (Gast)


Lesenswert?

Und wie sieht deine Software aus?
Ist der FET überhaupt logic-level-kompatibel?

von key (Gast)


Lesenswert?

Wie wäre es hiermit:
DDRD  = 0x03 & (1<<6);  // PD0, PD1, PD6 sind Ausgänge, Rest Eingänge

von Rolf Magnus (Gast)


Lesenswert?

Ups... zu lange gebraucht ;-)

> PORTD = 0x00;   /* Low */
> DDRD  = 0x03;   /* Ausgänge, alles andere Eingänge */

Also nur PORTD0 und PORTD1 sind Ausgänge. Ich empfehle das zu schreiben
als:

DDRD  = (1 << DDD0) | (1 << DDD1);

>        PORTD |= (1<<6);

Also PORTD6, der als Eingang konfiguriert ist. Es wird also der Pull-Up
eingeschaltet. Das schaltet den FET durch, wenn auch nicht besonder
schnell.

        _delay_ms(100);
>              PORTD &= ~(1<<6);

Und hier wird der Pull-Up von PORTD6 wieder ausgeschaltet. Er ist dann
auf tristate geschaltet, also offen. Mich wundert sehr, daß du glaubst,
das funktioniere.

von key (Gast)


Lesenswert?

ups! Korrektur: muss natürlich ver-odert werden. Also:
DDRD  = 0x03 | (1<<6);  // PD0, PD1, PD6 sind Ausgänge, Rest Eingänge

besser, weil übersichtlicher wie oben:

DDRD  = (1<<0) | (1<<6) | (1<<6); // PD0, PD1, PD6 sind Ausgänge, Rest
Eingänge

von leif (Gast)


Lesenswert?

www.alldatasheet.com/datasheet-pdf/pdf/IRF/IRL540NS.html

gate threshold voltage 1-2 V

im DAtenblatt Fig 10a.  Switching Time Test Circuit wird er auch mit 5
V betrieben.

Die Software tut, was sie soll, wenn auch meine Clock noch nicht so
ganz richtig tickt. Der pin wird brav ein (5V) und ausgeschaltet,
zumindest, wenn ich zugucke.

von Rolf Magnus (Gast)


Lesenswert?

Nochmals: Port D6 ist bei dem von dir beschriebenen Code als Eingang
konfiguriert. In diesem Fall wird der Pin nicht zwischen High- und
Low-Pegel umgeschaltet, sondern es wird nur der integrierte
Pull-up-Widerstand ein- und ausgeschaltet.
Wenn du das dann misst, kann es so aussehen, als funktioniere alles
korrekt, aber der Pull-up hat einen sehr hohen Widerstandswert, der FET
wird also damit nicht optimal geschaltet. Und beim Ausschalten ist
plötzlich gar nichts mehr da (weder high- noch low-Pegel), also hält
die Gatekapazität des FET diesen leitend.

von leif (Gast)


Lesenswert?

MIST! Alles falschherum.
Und danke vielmals! Ich werde nächstes mal besser darauf achten, wo ich
mir die Bitoperationen kopiere.
Jetzt werde ich mich wohl noch länger über mich aufregen..

von leif (Gast)


Lesenswert?

danke, es klappt jetzt! ich habs erst nach meinem post gesehen.

von Bolle (Gast)


Lesenswert?

Auch wenn Du dieses Problem gelöst hast, und ich dazu nichts beigetragen
habe, ein Tip aus der Praxis des Programmierens:

Schreib nicht

PORTD = 0x00;   /* Low */
DDRD  = 0x03;   /* Ausgänge, alles andere Eingänge */

sondern gewöhne Dir diese Art der Notation an:

PORTD = 0<<PD7 | 0<<PD6 | 0<<PD5 | 0<<PD4 | 0<<PD3 | 0<<PD2 | 0<<PD1 |
0<<PD0
DDRD = 0<<PD7 | 0<<PD6 | 0<<PD5 | 0<<PD4 | 0<<PD3 | 0<<PD2 | 1<<PD1 |
1<<PD0

Das Mehr an Schreibarbeit macht sich bezahlt, denn wenn Du mal fix zu
Testzwecken ein oder mehrere Bit ändern willst, dann ist es von großem
Vorteil, das möglichst schnell, bequem und struddelfehlersicher
erledigen zu können, und das Maximum all dessen bietet Dir nur die
zweite Variante.

von leif (Gast)


Lesenswert?

:-)
Danke für den Rat, so liest man es ja auch 'überall'. Ich hatte die
Pins für den Motor schon per define eingerichtet, in der mittlerweile
bestätigten Hoffnung, die Anordnung der Spulen dann noch einfach durch
Probieren herauszufinden.

Jetzt dreht sich schon der Motor, und ich toggele die jeweils zu
ändernden Spulen. Hat gedauert, bevor ich die Möglichkeit gesehen
habe.

Jetzt kommt noch PWM, dann Timer, dann Interrupts..

Wahrscheinlich bis demnächst :-)

leif

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.