Hallo, ich taste mich gerade an eine Transistorschaltung ran, und ziehe diese 'Quellen' zu rate: Hier die Last zwischen Collector und GND: Beitrag "pnp transistor, wo die last" (1) Hier die Last zwischen VCC und Emitter: http://www.digitalhilfe.de/Transistor.htm (2) Die Frage ist, wo die Last jetzt 'richtig' hingehört. Ich vermute wie bei (1). Die Last ist ein Modellservo an 5V, ich habe einen PNP BC807-40 (SMD). http://www.nxp.com/pip/BC327.html (stimmt so). Steuerstrom müsste bei 4-5V für 400mA Strom etwa 4-5mA betragen, wenn ich das Datenblatt richtig lese. D.h. wenn die Basis gegen GND geschaltet wird, fließt der Steuerstrom, und somit auch der Last-strom. Was beeinflußt jetzt die unterschiedliche Beschaltung aus den Links? Wenn die Last zwischen GND und Collector liegt, ist der Emitter-Basis-Strom I_EB=(VCC-0.7V)/R_Basis !? Aber wenn die Last zwischen VCC und Emitter liegt, fällt dort ebenfalls eine Spannung ab (als ohmsche Last annehmbar?), und deswegen klappt das mit dem Steuerstrom nicht mehr? Vielen Dank!
Link 2 ist für mich in erster Näherung falsch. Und hier gibt es bestimmt auch einige Anleitungen, wie man einen PNP-Transistor ansteuert. Durch den kleinen Transistor würde ich den Strom nicht unbedingt schicken, aber ...
Ich nehme am Tiny13 den BC327 (in TO92) mit etwa 10mA Basisstrom in Emitterschaltung (Last an Kollektor) und schalte damit die Betriebsspannung billiger Conrad-Servos nur während der Positionsänderung ein. Geht prima und spart Strom. Die Servos bewegen (austarierte) Kameras (also keine Rückstellkräfte durch Schwerkraft) und lösen sie aus. ...
Ah, danke für die Bestätigung! D.h. der Basiswiderstand tatsächlich <1kOhm bei 5V VCC? Und Hannes: Wie erzeugst Du das Servosignal? Ich komme nicht ganz klar, vielleicht könntest Du mal einen Blick hier drauf werfen? Beitrag "AVR: 8 Bit PWM und Interrupt synchronisieren?" Das wäre toll, wenn ich das heute noch hinbekomme. Gleich erstmal den Transistor 'anbauen'.
> Wie erzeugst Du das Servosignal?
Sorry, ich muss mich korregieren, das war mit Tiny15 für ein Servo und
Mega48 für mehrere Servos. Tiny13 hatte ich bei einer Kamerasteuerung
für eine mit Optokopplern nachgerüstete Yakumo-Mega-Image4 eingesetzt.
Da gab es aber keine Servos.
Servoimpuls mit Tiny15:
Bei Tiny15 mit 1,6MHz erzeugt der OC-Interrupt von Timer1 (Vorteiler 16)
die Impulsdauer. Das Schalten des Impulses geschieht "von Hand" (also
per Programm) in der Timer-ISR. Den Impulsabstand erzeugt Timer0.
Mit Tiny13 würde sich anbieten:
4,8MHz, Vorteiler 64 für Timer macht 75kHz Timerzähltakt (100kHz wäre
schöner), das sind Zahlenwerte von 75..150 für 1,0..2,0ms.
Per OVF-Interrupt kann mittels Zähler der Impulsabstand (halbwegs genau)
gemessen/gesteuert werden und der Impuls ausgelöst werden (Impuls
beginnt daher immer bei Timerstand 0). Der OCR-Interrupt schaltet den
Impuls dann bei Timerstand 75..150 wieder ab. Eine Kollision der beiden
Interrupts ist also nicht möglich.
Für die Kamerasteuerung existieren wegen Plattenschaden leider keine
Dateien mehr. Macht aber nix, das Teil wird sowiso nicht mehr gebraucht.
...
Habe erst jetzt den Link im Link verfolgt und weiß jetzt auch, warum ich bisher nichts von Deinem Projekt bemerkt habe. Das ist einmal C (ich werkele nur in ASM, für C bin ich zu blöd) und andererseits der Wunsch "bitte mal nachsehen", da halte ich mich inzwischen zurück, solche Wünsche im Betreff halten mich inzwischen vom Lesen des Threads ab. ...
>Per OVF-Interrupt kann mittels Zähler der Impulsabstand (halbwegs genau) >gemessen/gesteuert werden und der Impuls ausgelöst werden (Impuls >beginnt daher immer bei Timerstand 0). Der OCR-Interrupt schaltet den >Impuls dann bei Timerstand 75..150 wieder ab. Eine Kollision der beiden >Interrupts ist also nicht möglich. DANKE! Im ersten Versuch hatte ich ja praktisch den T/C in der ISR nochmal per Software abgebildet. Völlig bescheuert! Ich muß ja nur das OCR anpassen. Das muß ich gleich ausprobieren! > "bitte mal nachsehen" Das ist natürlich eine direkte Aufforderung, und vermutlich etwas abschreckend. Kann ich verstehen, habe für diese Frage auch schon auf andere Weise versucht zu vermitteln, daß es sich nicht um eine diffuse Frage handelt, die möglicherweise schon an anderer Stelle beantwortet wurde. Bei sowas sehe ich nämlich auch eher nicht rein.
Danke, sowohl Transistor als auch Software funktionieren zur Abwechselung mal nach Plan!
Es freut mich, dass es nun läuft. Das "bitte mal nachsehen" gab es in letzter Zeit öfters mal, nach jedem gelösten Problem traten dann meist drei neue Probleme auf, worauf das gesamte Projekt vom Forum gemacht werden sollte... Das ist irgendwie nicht mein Ding. Auf konkrete Fragen antworte ich gerne mal, falls ich dazu in der Lage bin, anderer Leute Arbeit mache ich aber nicht. ...
Nochwas: Der OVF-Int zählt die Impulspause und startet den Impuls. Der OCR-Int schaltet den Impuls wieder aus. Nun könnte man im OVF noch managen, ob der OCR-Int überhaupt stattfinden soll. Dies ist aber überflüssig, denn wenn der OCR-Int "jede Runde" den Portpin (Impuls) ausschaltet, der (dieses mal) gar nicht eingeschaltet war, dann passiert auch nix, "aus"er (unerlaubte Steigerung von "aus") als "aus" geht nicht... Und der Verwaltungsaufwand sinkt. Deine Aktivität beschränkt sich also darauf, in der OVF-ISR zu prüfen, ob jetzt (und ob überhaupt) ein Impuls ausgelöst werden soll und (falls ja) den Impuls zu starten. Selbst das Setzen der Impulsdauer kann die Mainloop machen, wenn verhindert wird, dass das während des aktiven Impulses geschieht. Du kannst also den Transistor-Steuerport (für Servo-Stromversorgung) als Flag benutzen, ob Impulse generiert werden sollen. Die Mainloop setzt dann bei Bedarf den Impulsende-Termin in OCR, schaltet den Transistor ein und setzt ein Timeout (halbe Sekunde?), das vom OVF-Int (oder Timer-synchronisierter Mainloop) heruntergezählt wird und den Transistor-Port zurück schaltet. Wenn Du in der OVF-ISR noch ein Flag für die Mainloop setzt, kannst Du in der Mainloop einen Zähler als Uhr laufen lassen. Durch Verwenden der Sleep-Funktion (Idle-Mode) kannst Du die Mainloop auf den OVF-Int synchronisieren, also nur einen Mainloop-Durchlauf nach jedem OVF-Int zulassen. Damit läuft Deine Mainloop in einem exakten Zeitraster, was das Programmieren von Zeiten und Aktionen stark vereinfacht. Die Mainloop wird also alle 16k Takte für eine Runde "angeschubst" und der AVR pennt nach getaner Arbeit bis zum nächsten Int (mit vom OVF gesetztem Sync-Flag). Und die zur Verfügung stehenden 16k Takte müssen erstmal durch sinnvolle Arbeit "verprogrammiert" werden, denn Warteschleifen braucht man in diesem Programmierstil (im Normalfall) nicht. Ein Tip noch: Setze einen Widerstand von etwa 1k in die Impulsleitung zum Servo. Das schützt den Portpin vor Überstrom bei Programmierfehlern (Impuls bei fehlender Servostromversorgung). Viel Erfolg ...
Oh, Du bist nett, so ausführlich. Danke! Ich werde das morgen in aller Ruhe nachvollziehen.
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.