Hallo,
ia das geht nur dein code stimmt nicht, OCR1C ist das
Vergleichsregister.
1 | #define PWM_PRESCALER 1UL
|
2 | #define PWM_CLOCK 64000000UL
|
3 | #define PWM_FREQ 500000UL // 500.000kHz
|
4 |
|
5 | void Setup_Timer1(void)
|
6 | {
|
7 | // PLL Starten
|
8 | PLLCSR |= _BV(PLLE) ; // PLL Starten
|
9 | delay_us(100); // warte >=100µS
|
10 | while ( ! ( PLLCSR & _BV(PLOCK)) ) ; // warte auf PLL Lock
|
11 |
|
12 | PLLCSR |= _BV(PCKE); // Timer1 PLL Clock Source
|
13 |
|
14 | SET_BIT_PSR1(); // Prescaler Timer1 auf 0 setzen
|
15 |
|
16 | SET_TCNT1(0);
|
17 | SET_OCR(1A, SIN_SHIFT); // OC1A pin (PB1)
|
18 | SET_OCR(1B, SIN_SHIFT); // OC1B pin (PB4)
|
19 |
|
20 | // PWM Frequency
|
21 | SET_OCR(1C, (uint8_t)((PWM_CLOCK / PWM_PRESCALER / PWM_FREQ + 0.5) -1) );
|
22 |
|
23 | SET_PWM_T1_A();
|
24 | SET_PWM_T1_B();
|
25 | SET_PRESCALE_T1(_T1_PRESCALE_1);
|
26 |
|
27 | }
|
Im Bild siehst Du wie alles Zusammenspielt.
Ich verwende die PLL mit 64MHz als Takt für die PWM und die Macros im
obigen Vode sollen ihr lesbarer machen und sorgen auch dafür dass ich
ihn einfach auf einen anderen µP, z.B. dem atTiny861, portieren kann.