Frohes Wochenende! Draußen scheint die Sonne, und was mache ich? Ich halte mich für zu blöd, um PWM nachzuvollziehen. Also das Prinzip ist ja einigermaßen klar. Ich weiß, die Rätsel tauchen hier oft auf, und es gibt dementsprechend viele Threads mit Bascom, ASM, und C, im AVR-GCC-Tutorial wird die Funktionsweise und die Register beschrieben, und schließlich und endlich gibt es das Datenblatt. Aber ich sehe die Parallelen irgendwie nicht (zu doof? zu blöd? :-). Z.B. frage ich mich, wo ich überhaupt anfangen soll. Das Tutorial versteckt das Thema PWM unter "DAC (Digital Analog Converter)" und spricht vom "16-Bit Zähler", im Datenblat zum tiny2313 taucht PWM zum ersten Mal unter "8-bit Timer/Counter0 with PWM" auf. Dann gibt es ungefähr vier verschiedene Modi, von denen ich nicht weiß, ob ich sie möchte, viele Register, von denen ich nicht wirklich verstehe, in welcher Reihenfolge ich sie definieren sollte (wird wohl teilweise egal sein?), und keinen mir ersichtlichen Hinweis darauf, wo das Signal eigentlich 'rauskommt. Ich suche also im Grunde eine Anleitung/Übersicht for Dummies, die mir erzählt nach welchen Kriterien und in welcher Reihenfolge ich die für meinen Anwendungszweck geeigneten Modi in die passenden Register schreibe, und wo dann das Signal rauskommt. Und das möglichst kostenlos und im www. Ich bin so anspruchsvoll. Hat jemand sowas schonmal gesehen oder weiß anderweitig Rat? Ich habe vorerst keine großen Ansprüche an 'mein' Hardware PWM, und möchte eigentlich nur mal sehen, ob wahlweise mein Piezo-Buzzer (OC0B) bei 4KHz piepst, oder meine LEDs (OC1A,OC1B) dimmbar sind. Die sind auch alle als Ausgang konfiguriert. Danke, Leif
"...ob wahlweise mein Piezo-Buzzer (OC0B) bei 4KHz piepst..." Du solltest erstmal wissen, was eine PWM ist. Frequenz erzeugen ist nämlich keine PWM !!! Geht aber auch und zwar mit dem Toggle-Pin-Modus. Und dann ist die Sache gar nicht so schwer. Ich gehe ins Datenblatt und klappere dann jedes Timerregister durch, welche Bits ich wie setzen muß. Und was ist denn daran nicht zu verstehen, daß der 8Bit T0 nur 8Bit PWM kann, der 16Bit T1 aber bis zu 16Bit ? Immer ruhig Blut und einfach der Reihe nach. Peter
Hallo Peter, danke für Deine Antwort. Ich erwarte im Falle meines Piezo Buzzers nicht, daß ein Sinus entsteht. Aber wenn ich eine PWM-Frequenz von ca. 4KHz erzeugen kann, mit 50% Duty-cycle, müsste ich doch schon was hören können, oder nicht? > Frequenz erzeugen ist nämlich keine PWM !!! Kann man das wirklich so sagen? > Und was ist denn daran nicht zu verstehen, daß der 8Bit T0 nur 8Bit > PWM kann, der 16Bit T1 aber bis zu 16Bit ? Gar nichts :-) Die Namen sind schon eindeutig, aber es hilft mir leider nichts, wenn ich den 8-Bit'er nutzen möchte, im Tutorial aber vom 16 Bit'er die Rede ist, und vice versa. > .. einfach der Reihe nach. Genau das möchte ich ja, aber ich finde den Anfang nicht. Schön wäre ein Kochrezept PWM, das die Möglichkeiten aufführt, und anhand dessen ich notwendigen Entscheidungen und Schritte entsprechend meiner Anwendung zu treffen lernen kann. Ich weiß nicht, wie ich es anhand des Datenblattes machen kann. Um den Anfang zu finden, enthält es zuviele Informationen, die ich als Anfänger nicht richtig bewerten kann. Und die Codebeispiele erläutern höchstens nur das, was gemacht wird, und nicht, was in einem anderen Fall gemacht werden könnte. Ich suche weiter, aber wenn Dir noch was einfällt, wie ich den Anfang finden könnte, würde ich mich freuen.
"Aber wenn ich eine PWM-Frequenz von ca. 4KHz erzeugen kann," Kannst du nicht, die PWM Frequenz ist automatisch festgelegt durch den Vorteiler und die Auflösung (Stufenzahl) der PWM. Eine PWM erzeugt Amplituden und keine Frequenzen. Natürlich kann man mit entsprechend hoher PWM-Frequenz z.B. einen 50Hz Sinus per Amplitudentabelle erzeugen. "Kann man das wirklich so sagen?" Nein, kann man nicht, sondern muß man, sonst ist es falsch. Die PWM-Frequenz ist nicht das Ziel sondern ein (meist) unerwünschter Nebeneffekt des PWM-Prinzips und deshalb wird sie auch ausgefiltert (Tiefpaß). "Genau das möchte ich ja, aber ich finde den Anfang nicht." Nun, wenn Du eine 8Bit PWM willst, fängst Du mit dem Kapitel über T0 an bzw. bei über 8Bit eben mit T1. Aber wenn Du eine Rechteckfrequenz erzeugen willst, nimmst Du den CTC-Mode und den Toggle-Pin-Mode. Peter
! Ich erzeuge erfolgreich einen Ton (980Hz) mittels PWM und T/C 0. Meine LEDs kann ich dimmen, und morgen/nachher werde ich rausfinden, wie ich mein Programm noch steuern kann, wenn die Timer schon benutzt werden. :-) Und bei Gelegenheit spendiere ich dem Wiki ein PWM Kochrezept für Anfänger. N8!
>! Ich erzeuge erfolgreich einen Ton (980Hz) mittels PWM und T/C 0. Genau das richtige für'n Wahlsonntag, wa? ;-) Kannst Du in wenigen Stichworten beschreiben, wie Du den Ton erzeugst? Hintergrund: T/C0 ist gar nicht PWM-fähig! Möglicherweise verwendest Du hier den Begriff PWM für etwas, das gar keine PWM ist, d. h. vielleicht gibt es hier noch eine Unklarheit zu beseitigen. >Meine LEDs kann ich dimmen, Das deutet allerdings auf eine "echte" PWM hin. >wie ich mein Programm noch steuern kann, wenn die Timer schon benutzt >werden. :-) Richtig, diese Frage will beantwortet sein.
> T/C0 ist gar nicht PWM-fähig!
Also bei mir sagt das Datenblatt was anderes. Wo hast du diese
Information her?
Mein Fehler, hatte den ATmega8 im Kopf. Sorry! (T/C0 beim ATmega8 ist tatsächlich nicht PWM-fähig, nur T/C1 und T/C2). >Meine LEDs kann ich dimmen, Ja, alles klar. Du hast mit dem PWM-fähigen T/C0 des ATtiny2313 eine echte PWM erzeugt, mit dieser die LED(s) betrieben und ihre Helligkeit durch Variation der pulse width gesteuert. Sehr gut.
Schritt Nummer eins sollte immer sein, darüber nachzudenken, was man eigentlich genau will. Wie soll das Signal am Ausgang aussehen? Was will man am Signal verändern können (1-zeiten, 0-zeiten, frequenz,...). Vielleicht einfach mal aufmalen, wie es aussehen soll. Danach dann erst das Datenblattkapitel durchgucken und dann ruhig auch mal was wegblättern - man braucht nicht immer alles zu verstehen. Einfacher ist es auf jeden Fall immer (und dringend anzuraten!) mit einem kleinen AVR zu beginnen - so ist z.B. der ATtiny13 sehr geeignet. Man muß ihn auch nicht unbedingt nutzen, nur eben mit dem sein Datenblatt anfangen, anstatt gleich ins ATmega128 Datenblatt zu gucken und vor lauter Funktionen sofort zu verzweifeln!! Wenn man dann in dem beschränkteren Funktionsumfang das gewünschte gefunden hat und grob den Sinn der Register, die wichtigsten Modes, TOP, usw verstanden hat, dann ist es ein leichtes, genau dasselbe auch beim ATmega128 oder ähnlich einzustellen. Auf diese Weise müßt ihr nicht selber das wichtige vom unwichtigen trennen, und es ist nicht immer alles gleich 3 mal vorhanden, sondern es gibt nur eine PWM! jörn
Fast hätte ich geglaubt, ich habe das Unmögliche geschafft! Aber danke für das Loben etwas nicht außergewöhnlichen! Allerdings laufen die LEDs mit Timer 1. Ich habe aus irgendeinem Grund gedacht, daß ich jeden beliebigen PWM Pin (der in Wirklichkeit ein OC Pin ist) mit 'der PWM Funktionalität' nutzen kann..und so sorg- und arglos meine Schaltung gebaut :-) Aber nachdem das bei mir reingegangen ist, hat auch das Anpassen des Codes aus dem Tutorial funktioniert (LEDs), und etwas später dann mit Timer 0. Ist tatsächlich nicht so schwer, wenn man's nur verstanden hat! Und weil einem als Anfänger die Zusammenhänge nicht so klar sind, habe ich angefangen (als Ergänzung zum GCC-Tutorial) eine kleine Anleitung zum Verwenden der PWM für Anfänger wie mich zusammenzustellen. Ist noch lange nicht fertig, aber falls das mit gleichzeitigem Editieren kein Problem ist (ich mache jetzt weiter, während ich auf Hilfe hoffe), seid ihr herzlich eingeladen, meine Fehler rot anzustreichen! http://www.mikrocontroller.net/articles/AVR_PWM
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.