Forum: Mikrocontroller und Digitale Elektronik Fast PWM initialisieren


von Thomas (Gast)


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

von Läubi (Gast)


Lesenswert?

Naja wie machst du den die PWM das wäre mal interessant ;)
mit 8Mhz kannst du (rechnerisch) bis zu 4mhz erreichen

von Thomas (Gast)


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.

von TravelRec. (Gast)


Lesenswert?

@Läubi: PWM mit 1 Bit Auflösung, oder wie?!


Also mit ´ner vernünftigen Auflösung von 8Bit läuft ein PWM im Mega8
bei 8MHz gerade mal mit maximal 31.25 kHz (fclk / 256).

von Thomas (Gast)


Lesenswert?

wieso ein bit auflösung?

von Thomas (Gast)


Lesenswert?

die 31,25 kHz würden mir für den Anfang vollkommen ausreichen.

von Ronny Schulz (Gast)


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.

von Läubi (Gast)


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

von Thomas (Gast)


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.

von Rolf Magnus (Gast)


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?

von TravelRec. (Gast)


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.

von TravelRec. (Gast)


Lesenswert?

Sorry, meinte WGM12 in Register TCCR1B!!!

von Thomas (Gast)


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;

von TravelRec. (Gast)


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

von Thomas (Gast)


Lesenswert?

stimmt.danke für eure Hilfe. werd es morgen gleichmal testen.

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.