Hi, Ist es möglich per Hardware pwm des at90s2313 eine 40 khz frequenz zu erzeugen? Mein programm läuft schon, ich betreibe den avr mit 4 Mhz, doch die höchste frequenz die ich hinbekomme liegt bei ca. 6,8 khz. MFG Jörn
wenn man den PWM mit 8bit fährt dann ist der Vorteiler 510. Die maximal erreichbare Frequenz müsste bei 4 MHz Takt also bei etwa 7,8 kHz liegen. Mehr ist bei 4 MHz leider nicht drin.
die Grössenordnung stimmt, exakt sind es 7,8xx kHz. Schneller gehts beim 2313 mit 4MHz nicht.
Du must den Timer im "clear on compare match" betreiben und das Compareregister auf 49 setzen, dann hast Du 4MHz 2 (49 + 1 ) = 40kHz. Peter
Hi, erstmal danke für die schnellen antworten!! So was in der art habe ich mir schon gedacht. @peter dannegger Kannst du das mit dem Timer noch etwas genauer erklären? Eventuell kurzes Codebeispiel z.B. wie man das initialisiert? MFG Jörn
"Kannst du das mit dem Timer noch etwas genauer erklären? Eventuell kurzes Codebeispiel z.B. wie man das initialisiert?" TCCR1A = 1<<COM1A0; // toggle pin on compare match OCR1A = 49; // count: ...48,49,0,1... TCCR1B = 1<<CTC1^1<<CS10; // clear on compare match, // CK / 1, // start Peter
@Peter Vielleicht versteh ich das auch falsch, aber so bekommst nur 1:1 Tastverhältnis raus, oder? PWM muss ja bis MAX laufen und bei TOP umschalten. @Jörn: hat dein µC einen Fast-PWM Mode? Damit lässt sich die Frequenz zumindest verdoppeln.
Also ich habe auch schon mal so ca. 20 khz pwm gebraucht und das bei 8 bit Auflösung. Es geht definitiv nur, wenn Du den Controller übertaktest. Bei mir läuft ein mega8-16 schon lange mit einem 24 Mhz Quarz. Anders ist das nicht zu machen. 40 Mhz ist aber so sicherlich nicht zu machen. Gruß Mattias
@Fritz, "PWM muss ja bis MAX laufen und bei TOP umschalten." Mit PWM kannst Du doch nur Gleichspannungen erzeugen bzw. sehr niederfrequente Wechselspannungen. Die Wandlerfrequenz wird ja danach über einen Tiefpaß rausgefiltert. Die PWM läßt sich also nicht zur Frequenzerzeugung mißbrauchen, sondern es geht nur, wie oben beschrieben. Peter
Hmm, wollte er jetzt PWM oder bloss eine Frequenz? Ich habs so verstanden, dass er PWM machen will mit einem 40kHz Takt. Reine Rechteckfrequenzen gehen natürlich mit dem Counter viel höher.
"Die PWM läßt sich also nicht zur Frequenzerzeugung mißbrauchen, sondern es geht nur, wie oben beschrieben." Doch, wenn man einen Kondensator in Reihe schaltet. Der Filtert den Gleichspannungsanteil raus, man bekommt den reinen Wechselspannungsanteil.
Die neueren Tinys erlauben PWM's mit hoher Frequenz, bei 25Mhz PCK. Die PWM Frequenz und Pulsweite kann dann fast stufenlos eingestellt werden. Dazu wird das Register ICP oder OCR1A als TOP benutzt und OCR1B bestimmt im Bereich von 0 bis TOP die Pulsweite. 40KHz mit annähernd 8Bit Auflösung ist da kein problem. Gruß Hagen
Achso, nutzt man ICP = Input Capture Reegister dann kann man über OCR1A und OCR1B jeweils zwei verschiedene PWM's mit unterschiedlichen Pulseweiten erzeugen, bei gleicher PWM Frequenz und auf zwei Pins ausgeben. Nutzt man aber OCR1A als TOP Register so kann man die Pulseweite nur vom B Kanal einstellen, über OCR1B. Der A kanal arbeitet dann immer mit 50% Duty Cycle. In jedem Falle benötigt man bei diesen Modis dann keinerlei extra Software Controlling, d.h. die hardware macht alles selber. Im zweiten Modus hat man aber den Vorteil das die Änderung der PWM Frequenz über das Register OCR1A ohne Störungen läuft, also synchronisiert zum PWM Counter durchgeführt wird. Dies ist beim ICP als TOP nicht der Fall. Gruß Hagen
Die Modulation dieser PWM's ist dann ebenfalls absolut einfach. Die DDR's der Pins werden dann einfach als Eingang oder Ausgang geschaltet. Am besten nutzt man den Compare Match Interrupt um das DDR entsprechend zu setzen. So hat man dann die Möglichkeit exakt die PWM Pulse eines Burst's abzuzählen und entsprechend die PWM auf die Pins ein/aus zu schalten. Gruß Hagen
Hi, Eigentlich geht es mir nur um die 40 khz, ich wusste nur nicht das ich mit pwm nicht so hohe frequenzen erzeugen kann. Die 40 khz brauche ich als Trägersignal für einen Infarotsender. Was für ein ein-auschaltverhältnis sollte man dafür nehmen ? 50%? MFG jörn
Also nochmal ganz langsam zum Mitschreiben: Eine PWM dient dazu, GLEICHSPANNUNG zu erzeugen !!! Die Wandlungsfrequenz will man dabei NICHT haben !!! Deshalb wird diese durch den nachfolgend angeschalteten Tiefpaß komplett rausgefiltert. Im PWM-Mode kann man also nur das Tastverhältnis, nicht aber die Frequenz ändern. Um variable Frequenzen zu erzeugen, nimmt man den clear-on-compare-Mode. Das Tastverhältnis ist dabei immer 50%. Das bei einer PWM eine Frequenz mit entsteht, ist also nur ein unerwünschter Nebeneffekt des Prinzips PWM, aber nicht das Ziel. Peter
30-50% Duty Cycle und der Burst sollte bei 40KHz mindestens 10 Pulse groß sein. Besser sind 16 oder mehr wie beim RC4. beim RC4 sind es zB. 2x 32 Pulse pro Bit. Gruß Hagen
Hab ich schonmal hier erwähnt: http://web.archive.org/web/20030618100058/http://www.nwlink.com/~kevinro/guide/infrared.html Mit dieser Schaltung lassen sich IR-Dioden mit einer beliebigen (einstellbaren) Frequenz modulieren.
Hi, Wow das funzt ja supergut mit diesem clear on compare match!! hab 39,7 khz gemessen! Vielen dank für eure schnelle hilfe!! Nun noch eine frage wie kann ich das signal an und ausschalten? muss ich dafür den timer abschalten? wenn ja wie? oder einfach den pin mit cbi oder sbi löschen oder setzen? MFG Jörn
Hi @Peter Warum dient PWM nur dazu Gleichspannung zu erzeugen? Mann kann mit PWM doch viel mehr machen. z.B. zur Helligkeitseinstellung von LED's. Da brauchts keinen Filter. Weitere Anwendung hier war die Ansteuerung von Propventilen in der Hydraulik. Hier war neben dem Tastverhältnis der PWM auch deren Frequenz mitentscheidend da diese nicht zu hoch werden durfte um die Schaltverluste klein zu halten und das Ventil immer ein bischen "flattern" zu lassen. Matthias
@Matthias "Da brauchts keinen Filter." Na dann rate mal, was Dein Auge ist. Ein richtig super Tiefpaß, sonst würde ja Film und Video nicht funktionieren. Und das Ventil hat auch eine super mechanische Trägheit als Filter. Ich hab ja nicht behauptet, das Filter muß elektrisch aufgebaut sein. In jedem Fall ist bei einer PWM der sich aus dem Tastverhältnis der Ausgangsspannung ergebende Mittelwert die zu steuernde Größe und nicht die Frequenz. Peter
Hi @Peter Du hast aber von Gleichspannung und Filter geschrieben. Da dachte ich ich muß erwähnen das man aus einer PWM nicht generell Gleichspannung macht sondern diese auch direkt verwenden kann (das dürfte sogar viel öfters der Fall sein). Und auch die Frequenz spielt natürlich eine Rolle. Bei einer Motorsteuerung wird man wohl nicht in den hohen Kiloherz-Bereich gehen um die Schaltverluste gering zu halten. Natürlich ist bei einer LED das Auge der Tiefpass-Filter und bei einem Motor die Massenträgheit. Matthias
>Nun noch eine frage wie kann ich das signal an und ausschalten? >muss ich dafür den timer abschalten? wenn ja wie? oder einfach den > pin mit cbi oder sbi löschen oder setzen? Nein, du kannst es ohne Timer machen. Der Timer bringt dich da nicht weiter und wäre zu ungenau. Also eine PWM besteht aus einer Halbwelle von 50% High und nachfolgend 50% Low. Der Übergang von High nach Low erfolgt exakt zum Compare Match. Da du aber den CTC Mode benutzt wird also bei jedem Compare Match der Pegel des Ausgangspins invertiert. D.h. heist für dich also das nach 2x Compare Match ein Pulse der PWM erfolgt ist. Nun, du installierst also eine Interrupt Service Routine für den Compare Match Interrupt. Innerhalb dieser Routine zählst du mit wie oft nun der Pegel sich geändert hat. Nach exakt 32 Pegel Änderungen, also 16 Pulsen der IR Diode schaltest du abhänig von den zu sendenden Datenbits das Datenrichtungsregister auf Eingang oder Ausgang. Der Pin an dem also deine IR Diode hängt wird wenn er als Ausgang geschaltet ist mit 40KHz gepulst. Ist er als Eingang geschaltet wird er mit Hilfe des Pullps auf High gezogen. Da deine IR Diode ja von Vcc zum Pin geschaltet ist, "leuchtet" sie nur wenn am Pin ein Low anliegt. Zum mitmeiseln. Statt einem Timer wird durch die hardware zur Erzeugung der 40KHz PWM bei jedem Puls ein Interrupt ausgelösst, der sogenannte Compare Match ISR. Diesen benutzt du nun um exakt 10 bis 32 Impulse abzuzählen, unabhänig davon ob der Pin an dem die IR Diode als Ein- oder Ausgang geschaltet ist. Diese 10-32 Pulse sind der sogenannte Burst beim RC5 Protokoll, also ein exakter Block von 32 Lichtblitzen. Jedes Bits beim RC5 besteht immer aus 2 * 32 Impulsen, wobei aber eben nur 32 Impulse geblitzt wird und der Rest der 32 Impulse die IR Diode nicht sendet. Abhängig davon ob nun zuerst ein 16 Lichtblitz Burst erfolgt und dann 16 Impulse Ruhe ist, oder eben umgekehrt entsteht also ein Pegelwechsel im Signal von entweder High->Low oder Low->High. Exakt dieser Pegelwechsel bestimmt beim Manchastercode ob es ein 1 oder 0 Datenbit ist. Gruß Hagen
Hm, oben bin ich mit den zahlen ein bischen durcheinander gekommmen. Also: RC5 arbeitet mit 36KHz und Manchaster Codierung. Ein Datenbit wird innerhalb von 64 Impulsen übertragen, macht also 1.77778 ms pro Bit. Die Information ob ein Bit einen 1 oder 0 ist wird exakt nach 32 Impulsen übertragen. Je nachdem ob zuerst 32 mal geblitzt wurde und danach 32 Impulse Ruhe ist, oder eben umgekerht, handelt es sich um eine 1 oder 0 beim datenbit. Somit blitzt die IR Diode maximal 64 mal am Stück und maximal 64 Impulse kann Ruhe sein. Minimal blitzt die Diode 32 mal und auch 32 Impulse ist die kürzeste Ruhepause. Das ist der Vorteil der Manchastercodierung. Somit heist das für dich: Du zählst per ISR die Impulse mit. Nach 32 Impulsen = 64 mal ein Compare Match im CTC Mode, musst die IR Diode ein oder ausgeschaltet werden, sprich das Signal moduliert werden. Am besten ist es wenn exakt in der Compare Match ISR der Pin durch die PWM Hardare auf High gesetzt wurde. Dadurch brauchst du nun nur noch das Datenrichtungsregister des Pins nur noch auf Ein- oder Ausgang setzten. Wird es auf Eingang gesetzt so ist alos automatisch dser Pullup nach Vcc aktiviert, wird es auf Ausgang gesetzt so liegt High am Pin an = ID Diode ist aus. Nun wird in deiner ISR 2 2 32 * 14 Bits aufgerufen, und raus ist der RC5. 2 32 14 = 896 * 1/36000 = 24.888ms. Gruß Hagen Gruß Hagen
Es erstaunt mich wirklich, wie hartnäckig hier am Begriff PWM festgehalten wird, obwohl ja nun inzwischen klar sein sollte, daß es kein PWM ist. Und da es also nicht der PWM-Mode ist, kann man im Compare-Interrupt die Impulse mitzählen und dann im Register TCCR1A den Pin von "Toggle" auf "Set" (LED gegen VCC) oder "Clear" (LED gegen GND) setzen. Und nach weiteren 32 Interrupts wieder zurück. Peter
Auch der CTC Mode wird in den Datenblättern unter dem Oberbegriff PWM geführt. Ich finde dies auch logisch da es nichts anderes als eine PWM mit 50% Duty Cycle ist. Ok Peter, wir können auch den Begriff PWM ausklammern und von einer Amplitudenmodulation einer Frequenz mit 50% Pulseverhältnis reden. Das macht aber keinen Unterschied. Was ich aber nicht ganz verstanden habe ist das du meinst das man nur im TCCR1A register den "Pin" Modus ändern muss. Wenn ich die Datenblätter aber richtig verstanden habe würde beim deinem Vorschlag sich nur die Phase der Frequenz um jeweils eine Halbwelle verschieben. D.h. egal ob der Toggle Mode oder Set/Clear Mode benutzt wird die LED würde denoch fortwährend gepulst werden. Sehe ich dies richtig oder habe ich da einen Denkfehler ? Gruß hagen
Set heißt, er wird beim nächsten Compare auf 1 gesetzt, egal wie der Zustand davor war. Pulsen geht erst wieder, wenn man auf Toggle umschaltet. Alternativ könnte man auch bei jedem Interrupt zwischen Set und Clear umschalten. Das geht aber alles nur im nicht PWM. Peter P.S.: Es ging mir ja nur darum, eine Begriffsverwirrung zu vermeiden. Wenn man mit jemandem von PWM spricht, dann weiß derjenige, daß man eine variable Spannung erzeugen will. Wie man ja deutlich sehen kann, sind durch das Wort PWM in der Frage erstmal völlig falsche Antworten gegeben worden.
>Set heißt, er wird beim nächsten Compare auf 1 gesetzt, egal wie der >Zustand davor war. Ok, danke Peter. Es ist ja auch im CTC Mode logisch. Gruß Hagen
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.