An die die (wie ich) auch immer Wieder zu wenig Analoge Ausgänge haben. Man kann sich einen oder auch mehrere zusätzliche analoge Ausgänge verschaffen indem man einen rail to rail-OP als Impedanzwadler verschaltet (Ausgang mit neg. Eingang verbunden) und einen Kondensator (beispielsweise 1uF) ueber beispielsweise 470 K, mit dem als Ausgang geschaltetem ADC Kanal, läd oder entläd. Die Spannung am Kondensator wird auf den + Eingang des Impedanzwandlers gegeben. Der Ausgang des impedanzwandlers wird auch über 5..20 k mit den Pin des ADC-Kanals verbunden. Der Trick ist jetzt daß man im Programm den ADC-Kanal bei jedem loop einmal als Eingang schaltet und prueft ob die Spannung die am Ausgang des Impedanzwandlers anliegt zu klein oder zu groß ist im Vergleich mit dem Sollwert. Anschließend definiert man den gleichen ADC-Kanal in einen Digitalen Ausgang um und setzt diesen auf Null falls die Spannung zu groß war bzw. auf 1 falls die Spannung zu klein war. Dadurch wird der Kondensator entsprechend ent- oder Geladen und die Spannung nähert sich dem gewünschten Sollwert. Fuer langsame Spannungsaenderungen mit sich nicht schnell ändernden Sollwerten funktioniert die Sache bestens. Sollte jemand Interesse haben und noch ein Verständnisproblem bestehen kann ich noch einen Schaltplan nachliefern. Michael
Wozu der Umweg über den ADC ? Mach doch einfach ne Software-PWM mit dem Timerinterrupt. Peter
Hallo Peter Ich hab schon alle 3 Timer verbraucht und dazu drei Interrupts. Kannst Du mir dennoch grob erklären wie Du es machen wuerdest.
@Michael "Ich hab schon alle 3 Timer verbraucht" Was meinst du damit ? Timer verbrauchen sich nicht. Man kann mit ihnen doch mehrere Sachen erschlagen. Die kleinste Zeiteinheit wird als Interuptrate genommen und darin werden für beliebig viele längere Zeiten Variablen (Register oder SRAM) runtergezählt. Peter
Hallo Peter Also eine Timer habe ich benutzt um eine Echtzeit-Uhr kombiniert mit einer Stoppuhr (mit 32,..khz Quarz) zu realisieren. Der zweite (8bit) macht schon PWM und der Dritte ist mit dem Messen einer Drehzahl beschaeftigt (zählt mit Vorteiler bis ein externer Interrupt kommt, wird zurueckgesetzt und zaehlt wieder los). Welchen hälst Du unter diesen Bedingungen fuer den geeignetsten um noch etwas anzuhängen. Nur der erste zählt durch und eigentlich immer bis zum selben Wert. Die beiden anderen werden unter Umständen lang vor dem Erreichen des Endwertes zurückgesetzt. Michael Ps: Ich komme ursprünglich aus der Analogtechnik und habe daher keinerlei Berührungsängste mit diesen Bauelementen. Aber man kann immer etwas dazulernen.
Der Grundgedanke ist, dass Du einen Timer verwenden kannst, um einen IRQ auszulösen. In diesem kannst Du dann beliebige Portpins ein- oder auschalten und somit auch ein Software-PWM erzeugen. Um z.B. 2,5V am Ausgang zu haben, schaltest Du den Ausgang einmal auf H und beim nächsten mal auf L. 4 x H und 1 x L ergibt z.B. 4V. Und genau das musst Du eben so umsetzen, dass es für deine Schaltung passt.
Hallo Peter, hallo Ronny Das Prinzip ist mir schon klar. Wenn ich also beispielsweise PWM mit drei Ausgängen an nur einem Timer machen will und also drei Parameter habe muß ich drei Mal einen Vergleich zwischen den Zählerregister und meinen Parametern machen. Dazu muß ich meine Parameter wohl erst der Größe nach sortieren und beispielsweise zunaechst den kleinsten Parameter nehmen und warten bis der Interrupt des Zählers (ausgelöst durch Vergleich mit dem Zählregister) erfolgt. Anschließend den Zweiten Wert zum Vergleich nehmen und als letztes den Dritten. Dabei darf der Zähler nicht zu schnell sein sonst gelingt das sequenzielle vergleichen nicht wenn Parameter sich nur um 1 bit unterscheiden. In meiner Anwendung müßte das immer mit dem Interrupt des Zählers gemacht werden da mein Programm nicht mit dem ständigen Vergleich von Registern beschäftigt werden darf. Ich habe zwar schon mit dem Auflösen der Leiterplatte begonnen aber der Gedanke drei (oder mehr) PWM Parameter über Software zu machen erscheint doch vielversprechend. Ich hab zwar dann noch das Problem ständig unkontrollierte Interrupts mit einigen Zeilen code zu haben die mit meinen anderen Interrupts kollidieren können was beispielsweise bei dem seriell arbeitenden MM5451 (LED-Treiber für 35 LEDs) zu flackernder Anzeige führen kann. Dieser Baustein mag es nicht wenn er mitten in der Seriellen Übernahme seiner 35 Bits unterbrochen wird. Dann erfindet er neue Zeichen auf dem Display was natürlich stört. Bisher konnte ich das Problem damit lösen daß ich den Displayteil immer kurz nach dem Interrupt angesprungen habe da ich wußte daß der nächste Interrupt erst nach ca 10 ms kommen kann. Vielleicht fällt Euch dazu auch noch etwas ein. Michael
Ich verwende einen mega8515 als 32 Kanal PWM Steuerung für LEDs. Die PWM hat 8bit und eine Ausgangsfrequenz von etwa 200Hz. Ich denke du hast die Funktionsweise von PWM nicht so ganz verstanden: In der Interrupt Routine wird ein Zähler hochgezählt und mit allen PWM Werten verglichen. Ist der Zähler kleiner als der PWM Wert, wird der entsprechende Pin auf 1 gesetzt, ansonsten auf Null. Genauso funktioniert FastPWM.
"Dieser Baustein mag es nicht wenn er mitten in der Seriellen Übernahme seiner 35 Bits unterbrochen wird. Dann erfindet er neue Zeichen" Wie soll das gehen ? Du hast einen Daten- und einen Takteingang und nach 36 Takten wird übernommen, völlig unabhängig, wie lange ein Takt dauert. Ich benutze die ICs auch und hatte noch nie Probleme. Wenn Du Probleme mit Interrupts hast, dann wird wohl der Interrupt den Taktpin auch benutzen und so zusätzliche Takte reinschummeln. Zu PWM: http://www.mino-elektronik.de/soft-pwm/pwm_software.htm Peter
Hallo Peter Das liegt daran daß ich als Takt fuer den mm5451 den des 32 Khz Quarzes der Uhr verwendet habe und der taktet natürlich weiter und nimmt keine Rücksicht auf den Interrupt. Du hast vermutlich den Takt aus einer Zähschleifer abgeleitet in der Du auch die 36 Zeichen uebertraegst. Da kannst Du jederzeit aussteigen, einen Interrupt abarbeiten und anschließend weitermachen. Auf diese Idee bin ich noch gar nicht gekommen, ich bin aber auch etwas knapp mit port pins. Frage, funktioniert der 5451-Baustein auch nahezu statisch so daß man ueberhaupt keinen gleichmaeßigen Takt benoetigt? Falls ja dann hast Du mir sehr geholfen da ich dann die Anzeigeroutine noch deutlich (etwa um den Faktor 10) schneller machen kann und auf den Takt des 32 Khz Quarzes verzichten werde. Ich wollte auch noch Temperaturversuche machen da ich mir nicht sicher war ob der Quarz, an den ich mich mit 20pf angehängt habe, bei -30....+70 Grad sicher anschwingt. Die könnte ich mir dann sparen. Einstweilen schon mal vielen Dank Michael
Hallo Benedikt Die Funktionsweise von PWM im allgemeinen habe ich schon verstanden und diese Technik bereits verwendet als man das noch überwiegend analog realisiert hat. PWM ist alles was "pulse width modulation" ist. Aber es gibt so unendlich viele Möglichkeiten diese zu realisieren (elegante und weniger elegante) das man nicht immer direkt zur besten Lösung kommt. Letztendlich ist es aber die Vielfalt die unser Hobby, oder diesen Beruf so faszinierend macht. In meiner Anwendung ist das PWM nur ein ganz kleiner Teil der Software (unter 1%) und dient nur dazu die Helligkeit der 7-Segmentanzeige abhängig von den Lichtverhältnissen zu regeln und die Lautstärke eines Tongebers auf die in einem Fahzeug herschenden Geräuschquellen anzupassen damit dieser nich überhört wird. Daher blieb für die PWMs nur noch übrig was vom Mega32 noch nicht bereits vergeben war. Michael
Nun, ich würde den mm5451 an die SPI hängen, denn dazu ist sie ja da. Du mußt dann natürlich 5 Byte (40 Takte) senden, was aber kein Problem ist, da er ja auf das Startbit wartet. Wenn da noch anderes am SPI hängt, dann mußt Du den Chipselect mit verwenden. Den Quarzoszillator sollte man generell nicht belasten, da er sehr hochohmig ist und auch kein Rechteck rauskommt, sondern Sinus. Wundert mich ehrlich, daß es überhaupt funktioniert. Wenn Du nicht den Power Save Mode benutzt, dann lass den 32kHz Quarz weg und nimm den Hauptquarz als Uhr. Dann hast Du außerdem 2 IOs mehr. Peter
Hallo Peter Danke für den Tip. Ich schau mir die SPI Spezifikation an und probier das Morgen mal aus. Zum Thema Quarz, ich habe diesen mit einem Hochpaß mit 20pf und 1 M-Ohm in Reihe belastet (am Atmega-pin der ein Ausgang sein soll) und schon gemerkt daß da nur eine kleine Sinusspannung mit 200 mV anliegt. Daher hab ich einen Komparator nachgeschaltet damit ich ein schönes Recheck kriege. Bisher gabs damit keine Probleme. Michael
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.