ATtiny861A / PWM funktioniert nicht richtig

Gast #3189417
Lesenswert?

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
#3189453
Lesenswert?

roland schrieb:

> Meiner Meinung nach sollte die Flankenhöhe z.B. 1/3 lang 5V betragen und
> 2/3 lang 0V.

Deine Verwendung des Begriffs 'Flankenhöhe' ist extrem missverständlich. 
Denn dein Symptom scheint nichts mit einer Flanke zu tun zu haben.

Wenn deine PWM 1/3 der Zeit auf 5V ist und 2/3 der Zeit auf 0V, dann 
hast du im zeitlichen Mittel eine Spannung von  (1*5 + 2*0) / 3 = 1.66V. 
Und das ist ja wohl das, was du misst.
Gast #3189549
Lesenswert?

ok ich sehe schon ich habe mich nicht gut ausgedrückt.

Die Messung habe ich mit einem Oszi gemacht und darauf kann man 
erkennen, das die einzelnen Flanken nur 1,6V haben.
In dem Zusammenhang dürfte der Begriff Flanke passen. Hab auch ein Bild 
angehängt, die Qualität ist leider nicht sehr gut. Aber man dürfte 
erkennen was ich meine.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren