Forum: Mikrocontroller und Digitale Elektronik PWM Modus "frequenz correct" Mega8


von Chris J. (Gast)


Lesenswert?

1. Ich möchte ein PWM Signal erzeugen mit einer festen Frequenz (feste 
Periodenlänge). Geht das auf diese Weise?

 FastPWM: WGM 12=1 , WGM 10=1
 PWM (Frequenz,Phase Correct): WGM 13=1 , WGM10=1


2. Die Frequenz soll so hoch wie nur möglich sein. (8 Bit Auflösung, 
kein Prescaler)

Bekomme ich dann bei 16MHz @ 8Bit eine PWM Frequenz von (16000000/256=) 
62.5KHz (bei FastPWM) und bei Phase/Frequenz Correct nur 31.25KHz?

3. Ist das so richtig, hab ich etwas vergessen?

Ich will folgendes:
-Wenn der Timer hoch zählt soll so lange der Wert kleiner als der Wert 
in OCR1A/OCR1B ist soll high am Ausgang anliegen, wenn der Timer wert 
größer ist soll der Ausgang auf Low fallen.
1
void initPWM(void)
2
{
3
DDRB = 0xff; // Port B als Ausgang
4
5
// beide Kanäle A und B haben die gleiche Frequenz/Taktung
6
// COM1A , COM1B: Clear wenn down, Set wenn Up Counting
7
// WGM11,WGM10 (TCCR1A):
8
// WGM13,WGM12 (TCCR1B):´
9
10
// Fast PWM 8-bit (WGM12,10 = Mode 5)
11
  TCCR1A  = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
12
  TCCR1B  = (1<<CS10) | (1<<WGM12); // kein Prescaling + PWM Mode 5
13
  
14
// PWM (Frequenz,Phase Correct) (WGM13,10 = Mode 9)
15
// TCCR1A  = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
16
// TCCR1B  = (1<<CS10) | (1<<WGM13); // kein Prescaling + PWM Mode 9
17
18
OCR1A   = 0; // initialwert Pulslänge/Takte
19
OCR1B   = 0; // initialwert Pulslänge/Takte
20
}

von Jörg X. (Gast)


Lesenswert?

>Wenn der Timer hoch zählt soll so lange der Wert kleiner als der Wert
>in OCR1A/OCR1B ist soll high am Ausgang anliegen, wenn der Timer wert
>größer ist soll der Ausgang auf Low fallen.
klingt nach "Clear on Compare match"
1
// "Clear on Compare" -- nur jeweils Bit x1 setzen
2
TCCR1A  = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);
> The extreme values for the OCR1x Register represents special cases when
> generating a PWM waveform output in the fast PWM mode. If the OCR1x is set
> equal to BOTTOM (0x0000) the output will be a_narrow_spike for each
> TOP+1 timer clock cycle. Setting the OCR1x equal to TOP will result in a
> constant high or low output (depending on the polarity of the output set
> by the COM1x1:0 bits.)
(datenblatt "Modes of operation")
Wenn OCR1x=0 beabsichtigt ist....

Alles andere sieht korrekt aus.

hth.Jörg

von Chris J. (Gast)


Lesenswert?

Auf Seite 109 (Mega8 Datenblatt) steht dass man beim CTC Mode die 
Frequenz verändert. Das brauch ich ja gerade nicht, soll schon eine 
feste Periodenlänge haben.
> Wenn OCR1x=0 beabsichtigt ist....
Soll ich dann CS12=0 CS11=0 und CS10=0 setzen um die clock zu 
deaktivieren damit es keine mini Impulse gibt?

von Jörg X. (Gast)


Lesenswert?

ich hab aber auch "Clear on Compare" (wie in tab. 38 "Compare output 
mode") geschrieben und nicht "Clear TIMER on Compare" (CTC) ;)

> Soll ich dann CS12=0 CS11=0 und CS10=0 setzen um die clock zu
> deaktivieren damit es keine mini Impulse gibt?
Den Timer abzuschalten ist eine Möglichkeit - außer der Timer erzeugt 
Interrupts.
 Aber wenn der Spike nicht stört ist das auch egal, sonst könntest du 
auch die COM1xn-Bits auf "normal operation" und den Output (ab)schalten, 
wenn du kein PWMsignal (also 0% oder 100% Duty-Cycle) brauchst.

hth. Jörg
ps.: die Kapitel 'Modes of Operation' und 'Register description' sind 
die wichtigsten bei den Timern ;)

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.