Forum: Mikrocontroller und Digitale Elektronik 500kHz PWM mit 20MHz Takt ATmega32


von Dieter (Gast)


Lesenswert?

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

von Jan M. (mueschel)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

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...

von Tobias Holst (Gast)


Lesenswert?

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!

von johnny.m (Gast)


Lesenswert?

Timer 1 im CTC Mode mit OCR1A als TOP, OC1B als Compare-Ausgang. Dann
kannste beliebig variieren.

von Manos (Gast)


Lesenswert?

...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€

von Markus (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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 ;-)

von Dieter (Gast)


Lesenswert?

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???

von Markus S. (schmidle)


Lesenswert?

@ 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

von johnny.m (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.