Hallo, ich möchte eine PWM mit einer Frequenz von 1kHz und einem Duty Cycle von 30% programmieren. Ich verwende einen AT90PWM316 mit 8MHz. Als TOP-Value möchte ich OCR1A (Mode 15) verwenden. Bei einem Prescaler von 8 brauche ich den Wert 999 für OCR1A als TOP-Value um eine PWM-Frequenz von 1kHz zu generieren. Wie kann ich aber nun den compare match setzen, wenn ich OCR1A bereits als TOP-Value verwendet habe?
Hi >Wie kann ich aber nun den compare match setzen, wenn ich OCR1A bereits >als TOP-Value verwendet habe? Mit OCR1B. Oder du nimmst Mode14. Dann ist ICR1 der Tp-Wert und OCR1A der Compare-Wert. MfG spess
Hallo, ich hab das jetzt versucht, erhalte aber am OC1B eine PWM mit 8Hz ? Eigentlich sollten es 1kHz sein. Hier der Code:
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | //DDRD |= (1<<PD2); // OC1A = output
|
6 | DDRC |= (1<<PC1); // OC1B = output |
7 | |
8 | OCR1A = 1000; // Top Value = 1000 |
9 | OCR1B = 300; // Compare Match bei 300 |
10 | TCCR1A = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10); // Clear OC1B on Compare Match |
11 | TCCR1B = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << CS11); // Mode 15, Fast PWM, OCR1A = TOP, Prescaler = 8 |
12 | |
13 | while(1) |
14 | {
|
15 | asm ("NOP"); // Nichts tun |
16 | }
|
17 | }
|
Hi Zumindest ein Fehler ist da drin: >TCCR1A = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10) ^^^^^^ >TCCR1B = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << CS11); MfG Spess ^^^^^^
Hi Noch mal richtig: Zumindest ein Fehler ist da drin: >TCCR1A = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10) ^^^^^^ >TCCR1B = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << CS11); ^^^^^^ MfG Spess
Oh ja! So, jetzt geht´s!
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | DDRC |= (1<<PC1); // OC1B = output |
6 | |
7 | OCR1A = 1000; // Top Value = 1000 |
8 | OCR1B = 300; // Compare Match bei 300 |
9 | TCCR1A = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10); // Clear OC1B on Compare Match |
10 | TCCR1B = (1 << WGM13) + (1 << WGM12) + (1 << CS11); // Mode 15, Fast PWM, OCR1A = TOP, Prescaler = 8 |
11 | |
12 | while(1) |
13 | {
|
14 | asm ("NOP"); // Nichts tun |
15 | }
|
16 | }
|
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.