Fast PWM initialisieren

Gast #269630
Lesenswert?

Hi @all,

Habe ne kleine Frage: Ich verwende einen ATMega8 und bekomme nur ne PWM
mit 4kHz hin. Der Controller arbeitet mit dem internen Clock von 8MHz.
Daher mache ich entweder bei der "normalen" PWM was falsch oder ich
benötige die Fast PWM. Könnte mir bitte bei der initialisierung jemand
behilflich sein. Eine PWM mit 40-50kHz sollte ich erreichen.
MFG
Thomas
Gast #269632
Lesenswert?

so habe ich die pwm initialisiert:

/* normale 8-bit PWM aktivieren ( nicht invertiert ),
     Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
  TCCR1A = (1<<COM1B1)|(1<<WGM10);

  /* Prescaler = 1 also CPU Takt */
  TCCR1B = (1<<CS10);

  // Alle Timer Interrupts deaktivieren
  //TIMSK &= ~0x3c;

OCR1BL = x;

in x schreibe ich einen von zwei AD-Wandlungen berechneten Wert. Umso
höher der Wert, umso größer soll die Einschaltzeit sein.
Gast #269636
Lesenswert?

Die Initialisierung ist insoweit richtig, wenn Du da eine PWM-Frequenz
im MHz-Bereich haben willst. Auf Seite 89 im Datenblatt steht, wie man
die Frequenz berechnet.

Ich persönlich habe bisher nur den Fast-PWM-mode genutzt. Mit denen
lässt sich auch einfacher arbeiten. Denn der Phase-Correct-Mode ändert
ja immer die Richtung des Timers, was beim FastPWM nicht so ist.

Was mir allerdings auffällt, dass Du nur den Low-Wert des
Counterregisters änderst und nicht das komplette Register.
Gast #269637
Lesenswert?

loop:
sbi PORTD, 1
cbi PORTD, 1
jmp loop:

;)
1 Takt an, 1 Takt aus, 1 Takt branch sind Takt/3 oder seh ich das
falsch?
Ok nicht sehr sinnvoll aber ich weiß ja nicht was er vor hat :D

War auch mehr sone... naja kreative Art zu sagen er soll mal etwas mehr
infos rausrücken :D
Gast #269638
Lesenswert?

Hallo,

zwei AD-gewandelte Werte multipliziere ich miteinander. Umso höher der
Wert, umso größer soll die Einschaltzeit sein. Da das ganze dann einen
MOSFET (Tiefsetzstelle) ansteuert, sollte die PWM zwischen 30 und 50kHz
liegen. Mit der oben geposteten Initalisierung bekomme ich allerdings
nur 4kHz raus. Das verstehe ich nicht so wirklich.
Gast #269639
Lesenswert?

@Läubi:

Ein jmp braucht drei Taktzyklen. Wenn du einen rjmp draus machst,
werden es zwei.

@Ronni:

Warum sollte phase-correct schwieriger sein? Man wählt bei der
Initialisierung den phase-correct-Modus, der Rest ist dann gleich.

@Thomas:

Bei 8Mhz Takt sind bei fast-PWM mit 8 Bit maximal 31,25kHz PWM-Takt
möglich, bei phase-correct ist es die Hälfte. Bist du sicher, daß du
den Controller auf 8Mhz hochgetaktet hast?
Um die 40-50 kHz zu erreichen, müßtest du deinen Controller höher
takten - mindestens mit ca. 10Mhz.

Übrigens: Wenn du 8bit-PWM machst, warum nimmst du dafür eigentlich
nicht gleich den 8bit-Timer?
Gast #269640
Lesenswert?

Wäre jetzt auch meine Frage gewesen, Timer 2 könnte das, aber sicher
hast Du schon alles an OC-Pin1B angeklemmt, auf jeden Fall mußt Du noch
Bit WGM12 in TCCR1A setzen. Damit hast Du dann schonmal die doppelte
Frequenz, weil das wäre dann 8-Bit Fast-PWM. Jetzt guckst Du nochmal
Deinen Prozessortakt an.
Gast #269642
Lesenswert?

am internen Takt lags! Jetzt habe ich bei der normalen PWM 16kHz. Das
ist schon mal ganz ok. könnte ja jetzt einen externen quarzoszillator
mit 16MHz anlöten, dann hätte ich schon mal 32kHz. Bei der fast pwm
habe ich noch ein kleines problem: 33kHz habe ich, aber irgendwie
funktioniert das mit dem gewandelten adwert (der wert, den ich in x
schreibe) nicht so recht.

TCCR1B = 0x00;                   // stop Timer
TCCR1A = (1<<COM1B1)|(1<<WGM11);        // Prescaler = 1 also CPU Takt
TCCR1B = (1<<CS10)|(1<<WGM12)|(1<<WGM13);
//TIMSK &= ~0x3c;                // Alle Timer Interrupts deaktivieren
OCR1B = X;
Gast #269643
Lesenswert?

Öhem, wer hat denn gesagt, daß Du nun auch noch das WGM13 Bit in TCCR1B
setzen sollst? Damit läuft Dein PWM bis zum im OCR1A oder ICR1
enthaltenen Wert. Das willst Du doch nun wohl nicht wirklich , oder?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren