Hallo liebe Forengemeinde,
ich versuche mich seit einiger Zeit in das Thema PWM auf dem ATtiny85
einzufuchsen, bekomme es aber irgendwie nicht hin.
Ich bin immerhin soweit, dass am PB3 eine PWM erzeugt wird, sie hat auch
in etwa die gewünschte Frequenz (4-5Hz Abweichung laut Oszi, für
internen RC Oszillator also in Ordnung), allerdings bekomme ich das
Tastverhältnis nicht eingestellt. Unabhängig davon, welchen Wert ich für
OCR1B eintrage, liegt das Tastverhältnis bei geschätzt 25%.
Ich hab meinen Code, mit der ich den Timer initialisiere im folgenden
notiert.
1 | #include <avr/io.h>
|
2 | FUSES =
|
3 | {
|
4 | .low = (FUSE_CKSEL0 & FUSE_CKSEL2 & FUSE_CKSEL3 & FUSE_SUT0 & FUSE_SUT1), //Clock set to 8MHz internal RC oscillator CKSEL[0010], Start-up Time with BOD enabled SUT[00]
|
5 | .high = (HFUSE_DEFAULT & FUSE_BODLEVEL0 & FUSE_BODLEVEL1), // BOD-Level set to ~4.3V BODLEVEL[100]
|
6 | .extended = (EFUSE_DEFAULT)
|
7 | };
|
8 |
|
9 | #include <avr/interrupt.h>
|
10 |
|
11 |
|
12 | void init_timer1(void)
|
13 | {
|
14 | DDRB |= (1<<DDB3); // Port !OC1B set output
|
15 | PORTB &= ~(1<<PB3); // Set PB3 off
|
16 | GTCCR = (1<<PWM1B) | (1<<COM1B0); // PWM-Mode, !OC1B set on compare match, Cleared when TCNT1 = 0
|
17 | TCCR1 = (1<<CTC1) | (1<<CS12) | (1<<CS11); // timer on, timer cleared on compare match with OCR1C, prescaler 1/32 => F_TIMER = 125kHz
|
18 | OCR1C = 199; // F_PWM = 625Hz
|
19 | OCR1B = 99; // PWM 50% duty cycle on startup | Inversion of PWM signal by driver
|
20 | }
|
21 |
|
22 | int main(void)
|
23 | {
|
24 | cli();
|
25 | CLKPR = 0b10000000; // Clock Prescaler Change enabled
|
26 | CLKPR = 0b00000001; // Clock Prescaler set to division by 2, thus setting F_CPU to 4 MHz
|
27 | init_timer1();
|
28 | sei();
|
29 | while(1)
|
30 | {
|
31 |
|
32 | }
|
33 | }
|
Ich würde mich sehr freuen, wenn mir jemand den entscheidenden Tipp
geben könnte, an welcher Stelle ich etwas falsch mache und wo ich
nachlesen kann, wie man es richtig macht.
Mit freundlichen Grüßen und Dank schon im Voraus für eure Hilfe
Florian