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
Naja wie machst du den die PWM das wäre mal interessant ;) mit 8Mhz kannst du (rechnerisch) bis zu 4mhz erreichen
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.
@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).
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.
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
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.
@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?
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.
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;
Ö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?!
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.