Forum: Mikrocontroller und Digitale Elektronik PWM gibt kein Ausgangssignal


von Martin *. (mistermister606)


Lesenswert?

Hallo zusammen,

ich versuche erneut die pwm an meinem Atmega168 zu programmieren nur 
leider mit mäßigen erfolg.
1
  
2
3
void main(void) {
4
 
5
  DDRD = (1 << PD6 );  
6
7
8
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
9
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
10
  ICR1 = 0xFFFF;
11
12
 OCR1A = 0x3FFF;
13
 
14
  while (1) {}
15
16
   return 0;                 
17
   
18
}

Ich verstehe an diesem Tutorial zwei sachen absolut nicht

1. was bedeutet ICR1 = 0xFFFF ?

2. der Atmega168 hat so wie ich das sehe 3 PWM Ausgänge PD3, PD5 und 
PD6.

lt. DB;
PD6 (PCINT22/OC0A/AIN0)
PD5 (PCINT21/OC0B/T1)
PD3 (PCINT19/OC2B/INT1)
Ist es dann richtig wenn ich OCR1A einfach in OCR0A für PD6 ändere und 
bekomme ich dann bei einem "OCR0A" Wert von 128 nur 50% der Spannung an 
PD6?

Danke für eure Erläuchtung.

von spess53 (Gast)


Lesenswert?

Hi

>2. der Atmega168 hat so wie ich das sehe 3 PWM Ausgänge PD3, PD5 und
>PD6.

>lt. DB;
>PD6 (PCINT22/OC0A/AIN0)
>PD5 (PCINT21/OC0B/T1)
>PD3 (PCINT19/OC2B/INT1)

OC1A und OC1B an PB1/PB2 vergessen.

>Ist es dann richtig wenn ich OCR1A einfach in OCR0A für PD6 ändere und
>bekomme ich dann bei einem "OCR0A" Wert von 128 nur 50% der Spannung an
>PD6?

OCR0A gehört zu Timer0. Der PWM-Ausgang für deinen geposteten Code ist 
PB1 nicht PD6.

MfG Spess

von dunno.. (Gast)


Lesenswert?

spess53 schrieb:

>>lt. DB;
>>PD6 (PCINT22/OC0A/AIN0)
>>PD5 (PCINT21/OC0B/T1)
>>PD3 (PCINT19/OC2B/INT1)
>
> OC1A und OC1B an PB1/PB2 vergessen.


und OC2A, fehlt auch.

die 48/88/168 megas haben insgesamt 6 pwm channels.


und wie spess schon sagte, es werden immer OC0,OC1,und OC2 zusammen 
konfiguriert.

steht alles auch wunderschön im datenblatt..

von Martin *. (mistermister606)


Lesenswert?

Ich seh schon einige Sachen stehen nicht im Tutorial bzw. sind so 
einfach das ein Anfänger gar nicht drauf kommt :)
Ich habe es nun fast geschafft  (glaub) ich habe das Ergebnis eines 
Potis genutzt um die PWM zu beeinflussen.
1
int main(void)
2
{
3
4
uint16_t result;
5
uint16_t result2;
6
7
ADMUX = (1<<REFS1) | (1<<REFS0);
8
ADCSRA = (1<<ADPS1) | (1<<ADPS0); 
9
ADCSRA |= (1<<ADEN);
10
ADCSRA |= (1<<ADSC);                  
11
while (ADCSRA & (1<<ADSC) ) {}  
12
result2 = ADCW;
13
14
//////// |////////////////////////////////////////////////////////////////////////7
15
16
TCCR0A = ( 1<<WGM01) |( 1<<WGM00) | (1<<COM0A1) | (1<<COM1A0);
17
18
//    WGM01 + WGM00 = 10 BIT  
19
//    COM0A1  = Nicht Invertierender PWM 
20
21
TCCR0B = (1<<CS00);
22
23
//    CS00 + CS02 = Takt des PWM  = CF / 1024
24
25
/////////////////////////////////////////////////////////////////////////////////7
26
27
DDRD= (1<<PD6) | (1<<PD7) | (1<<PD3) ;
28
DDRC = (1<<PC4);
29
30
  while (1) 
31
  {  
32
33
    ADMUX |= PC5;
34
    ADCSRA |= (1<<ADSC);           
35
    while (ADCSRA & (1<<ADSC) ) {} 
36
    result = ADCW;                 
37
      
38
      
39
    if(result > 10)    //wert in result 1024
40
    {
41
      PORTC &= ~(1<<PC4);
42
    }
43
    else
44
    {
45
      PORTC |= (1<<PC4);
46
    }  
47
        
48
49
50
    if(result > 1000)    //wert in result 1024
51
    {
52
      PORTD &= ~(1<<PD7);
53
    }
54
    else
55
    {
56
      PORTD |= (1<<PD7);
57
    }  
58
59
    if(result > 500)    //wert in result 1024
60
    {
61
      PORTD &= ~(1<<PD3);
62
    }
63
    else
64
    {
65
      PORTD |= (1<<PD3);
66
    }  
67
      
68
    OCR0A = result;
69
  }
70
71
return 0;       
72
73
}

Jetzt kommt aber etwas was ich nicht verstehe. Ich drehe den Poti die 
LED (PD6) wird gedimmt und auf einmal ist sie wieder voll beleuchtet. 
Ich drehe wieder ein Stück sie wird wieder gedimmt und das Spielchen 
beginnt von neuem. Dies wiederholt sich 3 bis 4 mal.
Der result wert vom Poti müsste passen habe diesen habe ich mit 3 LEDs 
getestet.

könntet ihr mir nochmal einen Denkanstoß versetzen?

Danke

von Ben _. (burning_silicon)


Lesenswert?

OCR0A ist 8 Bit breit, das Resultat Deiner ADC-Wandlung hat 10 Bit. 
Daher durchläuft Deine LED 4x0..255 weil die höchsten 2 Bits verworfen 
werde.

von Martin *. (mistermister606)


Lesenswert?

Hallo

sorry aber das verstehe ich jetzt echt nicht. Der PWM ist doch mit 
WGM01 + WGM00 auf 10 bit gestellt oder meinst du was anderes?

Danke

von spess53 (Gast)


Lesenswert?

Hi

>sorry aber das verstehe ich jetzt echt nicht. Der PWM ist doch mit
>WGM01 + WGM00 auf 10 bit gestellt oder meinst du was anderes?

Dann hast du in der falschen Tabelle nachgesehen. Timer0 ist ein 
8-Bit-Timer.

MfG Spess

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.