Hi Leute, ich versuch mit einem ATmega32 eine 500kHz PWM zu erzeugen (besser wären 1MHz), was nicht gelingen will. Er wird extern mit 20MHz getaktet und im Mode 5 Fast-PWM, 8Bit betrieben. Den Prescaler hab ich auf 1:1 gesetzt. Dabei spukt er 78kHz aus. Ist ja schon mal was, aber bei weitem nicht ausreichend :-(( Wie kann ich die PWM-Frequenz denn noch beeinflussen? Dieter
Bei einer 8bit PWM sind nicht mehr als 78kHz möglich: 78kHz * 2^8 = 20Mhz Um die PWM-Frequenz zu erhöhen kannst du nur die Auflösung der PWM herabsetzen.
Danke für die schnelle Antwort. Aber wie setze ich die Frequenz höher ? Auflösung brauch ich so gut wie keine. Mir reichen grob 50% Puls/Pausenzeit.
Mathematik hilft ;) 20 MHz / 256 = 78125 Hz => 20 MHz / 500kHz = 40 So nun mußt Du nur noch 2^x = 40 auflösen ;) Allerdings muß der Controller auch solche Dinge unterstützen ;) Bye, Markus
Leider ist es nicht die Mathematik, sondern die Atmel-Datenblaetter.
Über welche Register bzw. Bits ändert man bei Fast-PWM die Frequenz.
>>>>>>>>>>>>Das ist meine Frage !!!
Über das OCR1A-Register ändert sich nur das Puls/Pausenverhältnis.
Die schönen Sägezahn-Grafiken im Datenblatt widersprechen sich dauernd.
Dort liest man, dass der TOP-Level über das OCR-Reg. modifiziert wird...
2^5 würde also noch ausreichen... Bei einer Auflösung von 5 bit könnte der Prozessor also bis 666 kHz gehen - wenn er sich einstellen lässt!
Timer 1 im CTC Mode mit OCR1A als TOP, OC1B als Compare-Ausgang. Dann kannste beliebig variieren.
...oder Du schaust Dir mal die Datenblätter zum AT90PWM2 bzw 3 an... vielleicht ist das ja was (geht bis max. 64 MHz PWM wenn ich das Datenblatt richtig deute). PWM3 SOIC32-Geäuse liegt bei ca. 5
Steht doch drin ;) Seite 74 Mega32 Zitat: The PWM frequency for the output can be calculated by the following equation: ******************************************************************** f_pwm = f_clkio / N*256 ******************************************************************** The N variable represents the prescale factor (1, 8, 64, 256, or 1024). The extreme values for the OCR0 Register represents special cases when generating a PWM waveform output in the fast PWM mode. If the OCR0 is set equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0 equal to MAX will result in a constantly high or low output (depending on the polarity of the output set by the COM01:0 bits.) A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by setting OC0 to toggle its logical level on each compare match (COM01:0 = 1). ********************************************************************** The waveform generated will have a maximum frequency of fOC0 = fclk_I/O/2 when OCR0 is set to zero. ********************************************************************** This feature is similar to the OC0 toggle in CTC mode, except the double buffer feature of the output compare unit is enabled in the fast PWM mode. Also entweder Du hast eine 8bit PWM mit 78kHz oder eine 1bit PWM, die dann bei 20MHz 10MHz ausgeben würde, als reines Rechteck ohne irgendwelche Modulationen. Verstanden ? Bye, Markus
Nehme einen anderen PWM Modus -> WGMxx Bits. Es gibt zwei die entweder OCR1A/1C oder ICR1 als TOP benutzen können. Du kannst also zb. OCR1A auf 40 setzen und Prescaler auf 1. Macht dann deine 500KHz bei 20Mhz. Nun kannst du über OCR1B/OCR1C zwei PWMs mit variablem Duty in 40 Schritten erzeugen ca. 5 Bit Auflösung -> 2^5 = 32. Statt dem OCR1A als TOP geht auch das ICP1 Register. Oder eben der besagte CTC Modus. Duty ist dann immer 50% und die Frequenz kannst du über den Prescaler + OCR1A feinjustieren. Damit kommst du bis auf 10Mhz PWM bei 20Mhz Takt. Gruß Hagen
Nimm Waveform Generation Mode Nr. 15 (fast PWM mit OCR1A als TOP) und COM1B0 und COM1B1 jeweils 1 (set OC1B at Compare Match, clear at TOP). Über OCR1A kannste dann die PWM-Frequenz (und damit gleichzeitig die Auflösung(!)) frei einstellen, OCR1B ist dann das Compare-Register. Wenn Du dann (Prescaler auf 1:1) in OCR1A ne 40 reinschreibst, bekommst Du ne PWM mit 500 kHz, mit ner 20 dann 1MHz. Hast dann allerdings nur noch 40 bzw. 20 Schritte Auflösung.
Johnny, DANKE! Das war ein Spitzentipp Die Hilfe hier im Forum ist echt klasse un schnell! Das treibt mich ja fast dazu, als PIC-Programmierer die Fronten zu wechseln ;-)
Hi, melde mich nochmal... hab mich durch sämtliche Atmel Doku gekämpft um euer Wissen wenigstens nachvollziehen zu können. Muss leider passen!! In welcher Doku könnte ich denn nur ansatzweise das finden, was johnny so gut zusammengefasst hat. Also, wo wird mode 15 (fast PWM denn ausführlich beschrieben. In meinem ATmega32 Datasheet werden alle fastPWM modes zusammen abgehandet (ca. S.73). Als Atmel-Neuling kann man auch nach 2 Tagen intensiven Lesen und Ausprobieren nur im Nebel rumstochern. Das kann's doch wohl nicht sein oder???
@ Dieter, Seite 73 bezieht sich auf den Timer0. Johnnys Lösung hat sich aber auf Timer1 bezogen. Der Mode 15 ist bei mir also auf Seite 107 beschrieben und die Fast PWM auf den Seiten 97ff. Gruß Markus
Also mit den unterschiedlichen PWM-Modi musste wahrscheinlich schon mit dem Datenblatt vorlieb nehmen. Kannst übrigens auch Mode 14 nehmen und dann mit OC1A und OC1B zwei PWM-Kanäle mit gleicher Frequenz nutzen. Ich weiß aber auch nicht, was für Informationen zusätzlich zu den von mir genannten und denen im Datenblatt Du noch bräuchtest. Eigentlich ist das im Datenblatt vollständig beschrieben, man muss sich nur die entsprechenden Tabellen zusammensuchen (für die COM1-Bits gibts mehrere Tabellen, von denen eine für die Fast PWM-Modi ist). Gruß Johnny
Und Markus hat natürlich recht... Du hast an der falschen Stelle geschaut. Mit Timer 0 und 2 geht das so nicht. Da kannste nur ne 8-Bit-PWM machen.
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.