Hallo zusammen,
ich verwende einen ATtiny861A und betreibe mit dem Timer1 eine PWM. Die
PWM funktioniert soweit, dass die Frequenz stimmt. Jedoch beträgt die
Flankenhöhe nur 1,6V.
Meiner Meinung nach sollte die Flankenhöhe z.B. 1/3 lang 5V betragen und
2/3 lang 0V.
Versorgt wird der Controller mit 5V. Diese Spannung bleibt auch
konstant.
An anderen Ausgängen sind 5V Ausgangsspannung vorhanden.
Ich denke, dass ich noch irgend etwas an den Registern falsch
eingestellt habe.
1 | #define F_CPU 8000000UL
|
2 | #include <avr/io.h>
|
3 | #include <stdlib.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 |
|
8 | void timer1_init()
|
9 | {
|
10 | TCCR1A |= (1<<PWM1B) | (1<<COM1B1); //PWM-Mode for OCR1B
|
11 | TCCR1B |= (1<<CS10) | (1<<CS11) | (1<<CS12) | (0<<CS13); //Prescaler64
|
12 | TCCR1C |= (1<<COM1D1) | (1<<PWM1D); //PWM-Mode for OCR1D
|
13 | TCCR1D |= (1<<WGM10) | (0<<WGM11); //Phase & Frequency Correct PWM
|
14 | }
|
15 |
|
16 | int main(void)
|
17 | {
|
18 | //===== inputs =====
|
19 | DDRA &= ~((1<<DDA0) //Analog-Input, Current-Measure Coil 2
|
20 | | (1<<DDA1) //Signal Coil 2
|
21 | | (1<<DDA2) //Analog-Input, Current-Measure Coil 1
|
22 | | (1<<DDA3)); //A_ref, 5V
|
23 | DDRB &= ~((1<<DDB0) //USI (DI) / ISP (MOSI)
|
24 | | (1<<DDB4) //Signal Coil 1
|
25 | | (1<<DDB7)); //Reset SPI
|
26 |
|
27 | //===== outputs =====
|
28 | DDRA |= (1<<DDA4) //activate actual-value coil 1
|
29 | | (1<<DDA5) //activate given-value coil 1
|
30 | | (1<<DDA6) //activate actual-value coil 2
|
31 | | (1<<DDA7); //activate given-value coil 2
|
32 | DDRB |= (1<<DDB1) //USI (DO) / ISP (MISO)
|
33 | | (1<<DDB2) //USI (USCK) / ISP (SCK)
|
34 | | (1<<DDB3) //OC1B, coil 2
|
35 | | (1<<DDB5) //OC1D, coil 1
|
36 | | (1<<DDB6); //ChipSelect D/A-converter
|
37 |
|
38 |
|
39 | //==== Pull-Up ====
|
40 | PORTB |= (1<<PB7) | (1<<PB0);
|
41 |
|
42 | //===== Timer, etc =====
|
43 | timer1_init();
|
44 | usi_init();
|
45 | sei();
|
46 |
|
47 | while(1)
|
48 | {
|
49 | //===== Program =====
|
50 | if (!(PINB &(1<<PINB4)) && !(PINA &(1<<PINA1)))
|
51 | {
|
52 |
|
53 | OCR1B = 0;
|
54 | }
|
55 |
|
56 | if (PINB &(1<<PINB4)) //Signal 1
|
57 | {
|
58 | OCR1B = 128;
|
59 | }
|
60 | }
|
Grüße
roland