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
Wenn du den Ausgang auf 0 schaltest ist das der beste Pulldown, denn du haben kannst :) Ist es vll. ein mechanisches Problem? Gruss Tobias
Und auch nicht richtig ein. S*****ding. Ich häng nochmal den Schaltplan an, vielleicht fällt Euch ja was ein. Bitte!?
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
Und wie sieht deine Software aus? Ist der FET überhaupt logic-level-kompatibel?
Wie wäre es hiermit: DDRD = 0x03 & (1<<6); // PD0, PD1, PD6 sind Ausgänge, Rest Eingänge
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.
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
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.
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.
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..
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.
:-) 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.