hardware PWM Pin schaltet nicht komplett ab

OP #2840047
Lesenswert?

Hallo,
zunächst nochmal ich bin Neueinsteiger und dies ist mein zweiter Beitrag 
hier im Forum. Ich habe ein Hardware RGB PWM programmiert in der sich 
die Farben zyklisch tauschen. Problem ist das dem Quelltext nach, OCR2 
komplett auf 0 sinken sollte. Allerdings kann ich eine Spannung von 80 
mV an PB2 messen, sodass ein ungewolltes glimmen der LED zu verzeichnen 
ist.
Die beiden anderen Farben sinken vollständig auf 0!
Verwendet wird ein Atmega8.
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
int main()
5
{
6
  // OC1A auf Ausgang
7
  DDRB = (1 << PB1 )|(1 << PB2)|(1 << PB3);
8
  
9
  //
10
  // Timer 1 einstellen
11
  //
12
  // Modus 1:
13
  //    Set 8 bit Phase correct PWM Mode for channel 1 + 2(A/B)
14
  //
15
  //     WGM13    WGM12   WGM11    WGM10
16
  //      0        0       0        1
17
  //
18
  //    Timer Vorteiler: 1
19
  //     CS12     CS11    CS10
20
  //       0        0       1
21
  //
22
  //  Aktivierung der Ausgangsports: Set at BOTTOM, Clear at match
23
  //     COM1A1   COM1A0  COM1B1   COM1B0
24
  //       1        0      1        0
25
  
26
  TCCR1A = (1<<COM1A1) | (1 << COM1B1)| (1<<WGM10);
27
  TCCR1B = (1 << CS10);
28

29

30
  //
31
  // Timer 2 einstellen
32
  //
33
  // Set 8 bit phase correct PWM Mode
34
  //   WGM20    WGM21
35
  //    1        0
36
  //
37
  // Clock select channel 3
38
  //   CS20    CS21
39
  //    1        0
40
  //
41
  // Connect output Pin channel 3
42
  //   COM20    COM21
43
  //    0        1
44

45
  TCCR2 |=  (1 << WGM20) | (1 << CS20) | (1 << COM21);
46
  TCCR2 |= (1 << CS20);
47

48
  // Durch Verändern der Werte OCR1A, OCR1B und OCR2 werden die Werte der
49
  // drei Kanäle eingestellt
50

51

52
  unsigned char counter1 = 255;  //maximale Leuchtkraft
53
  unsigned char counter2 = 0;     // LED aus
54
  unsigned char counter3 = 0;    //LED aus
55
  OCR1A = counter1;
56
  OCR1B = counter2;
57
  OCR2 = counter3;
58
  unsigned char a = 1;  //1-->Auschalten
59
  unsigned char b = 0;  //0-->Anschalten bzw const 0 bleiben
60
  unsigned char c = 0;
61

62

63
  while( 1 )
64
  {
65
    if(a==1 & b==0 & c==0)
66
    {   counter1--;
67
      counter2++;
68
    }
69
    if(a==0 & b==1 & c==0)
70
    {   counter2--;
71
      counter3++;
72
    }
73
    if(a==0 & b==0 & c==1)
74
    {   counter1++;
75
      counter3--;
76
    }
77
    
78
    
79
    if (counter1==255 )
80
    {a=1;
81
    }
82
    if (counter2==255 )
83
    {b=1;
84
    }
85
    if (counter3==255 )
86
    {c=1;
87
    }
88
    if (counter1==0 )
89
    {a=0;
90
    }
91
    if (counter2==0 )
92
    {b=0;
93
    }
94
    if (counter3==0 )
95
    {c=0;
96
    }
97
    OCR1A = counter1;   //Setze Counter ein
98
    OCR1B = counter2;
99
    OCR2 = counter3;
100
    
101
    _delay_ms(140);
102
    
103
  }
104
}

Ich denke manches mag für euch noch umständlich aussehen, aber bisher 
krieg es besser nicht hin. Wer also Verbesserungsvorschläge im Code 
findet darf mich gern verbessern!

Grüße

Eric
Gast #2840051
Lesenswert?

Hi

>Allerdings kann ich eine Spannung von 80
>mV an PB2 messen, sodass ein ungewolltes glimmen zu verzeichnen ist.
>Verwendet wird ein Atmega8.

Bei Fast PWM ist die minimale Einschaltdauer ein Timertakt. Wenn du auf 
Null kommen willst kannst du entweder invertierte PWM oder Phase Correct 
PWM nehmen.

MfG Spess

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