Hallo, ich verwende den ATtiny2313 und brauche drei PWM-Kanäle im Fast-PWM-Modus zur phasenverschobenen Sinuserzeugung. Die beiden Kanäle des Timer0 funktionieren wie sie sollen bei ca. 30kHz. Der eine Kanal des Timer1 bleibt allerdings bei 15-16kHz, sprich: der Hälfte. Dabei sind doch eigentlich beide korrekt eingestellt. Wo liegt der Fehler? Ich habe jetzt stundenlang gesucht und weiß nicht weiter. Hier ein Auszug aus dem Quellcode:
1 | #ifndef F_CPU
|
2 | #warning "F_CPU not defined"
|
3 | #define F_CPU 8000000UL
|
4 | #endif
|
5 | #include <inttypes.h> |
6 | #include <avr/io.h> |
7 | #include <stdlib.h> |
8 | #include <util/delay.h> |
9 | |
10 | int main() { |
11 | DDRA = 0b11111111; |
12 | DDRB = 0b11111111; |
13 | DDRD = 0b11111111; |
14 | |
15 | TCCR0A |= (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00); //einstellungen für die PWM |
16 | TCCR0B |= (1<<CS00); |
17 | |
18 | |
19 | TCCR1A |= (1<<WGM12) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); //einstellungen für die PWM |
20 | TCCR1B |= (1<<CS10); |
21 | |
22 | |
23 | int s = 0; //zaehlvariable fuer sinus |
24 | unsigned char sinus[61] = {127,149,170,191,209,224,237,246,252,254,252,246,237,224,209,191,170,149,127,105,84,64,45,30,17,8,2,0,2,8,17,30,45,63,84,105,127,149,170,191,209,224,237,246,252,254,252,246,237,224,209,191,170,149,127,105,84,63,45,30,17}; |
25 | |
26 | unsigned long int zeit = 20000; |
27 | |
28 | while(1){ |
29 | for(unsigned long int i = 0; i < zeit; i++) { |
30 | _delay_us(1); |
31 | }
|
32 | if(s == 36){ |
33 | s = 1; |
34 | }
|
35 | else{ |
36 | s ++; |
37 | }
|
38 | OCR0A = sinus[s]; |
39 | OCR0B = sinus[s + 12]; |
40 | OCR1B = sinus[s + 24]; |
41 | }
|
42 | return(0); |
43 | }
|
Das delay kommt in der finalen Version natürlich raus. Ich hoffe, ihr könnt mir helfen! Schöne Grüße Joo