Forum: Mikrocontroller und Digitale Elektronik hardware PWM Pin schaltet nicht komplett ab


von Eric W. (ceikolon)


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

von Spess53 (Gast)


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

von Eric W. (ceikolon)


Lesenswert?

Aber wieso gehen die beiden anderen Ports auf 0?

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.