Forum: Mikrocontroller und Digitale Elektronik ATtiny861A / PWM funktioniert nicht richtig


von roland (Gast)


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

von Karl H. (kbuchegg)


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.

von roland (Gast)


Angehängte Dateien:

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.

von roland (Gast)


Lesenswert?

hätte vielleicht noch jemand eine Idee?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

roland schrieb:
> Ich denke, dass ich noch irgend etwas an den Registern falsch
> eingestellt habe.

Du kannst an den Registern nichts soo falsch einstellen, das der MC eine 
falsche Pulshöhe ausgibt. Hast du AVcc (und AGND) angeschlossen? Mit was 
belastet du den PWM Ausgang? Zeig am besten ein Schaltbild, das hilft am 
meisten.

von roland (Gast)


Lesenswert?

Danke noch für den Denkanstoß. Es liegt an der nachfolgenden 
Beschaltung.

Grüße
roland

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.