Forum: Compiler & IDEs PWM für Anfänger


von Rocco L. (kaufparkangucker)


Lesenswert?

Hallo,

ich bin gerade im GCC Tutorial über PWM gestolpert und fand das eine 
feine Idee um mal mit einem LED herum zu spielen.

Mir fehlt nur die Idee wie ich das Signal einem PORT Pin in einer While 
übergebe. Also so das das LED hoch und runter fadet.

bisher sieht es so aus:
1
  #include <avr/io.h>
2
 
3
int main()
4
{
5
  // OC1A auf Ausgang
6
  DDRB = (1 << PB1 );  //ATMega8
7
  // DDRD = (1 << PD5 ); //ATMega16
8
  //
9
  // Timer 1 einstellen
10
  //  
11
  // Modus 14:
12
  //    Fast PWM, Top von ICR1
13
  //
14
  //    WGM13    WGM12   WGM11    WGM10
15
  //      1        1       1        0
16
  //
17
  //    Timer Vorteiler: 1
18
  //     CS12     CS11    CS10
19
  //       0        0       1
20
  //
21
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
22
  //     COM1A1   COM1A0
23
  //       1        0
24
 
25
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
26
  //TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
27
  TCCR1B =  (1<<CS10);
28
 
29
  //  den Endwert (TOP) für den Zähler setzen
30
  //  der Zähler zählt bis zu diesem Wert
31
 
32
  ICR1 = 0x6FFF;
33
 
34
  // der Compare Wert
35
  // Wenn der Zähler diesen Wert erreicht, wird mit
36
  // obiger Konfiguration der OC1A Ausgang abgeschaltet
37
  // Sobald der Zähler wieder bei 0 startet, wird der
38
  // Ausgang wieder auf 1 gesetzt
39
  //
40
  // Durch Verändern dieses Wertes, werden die unterschiedlichen
41
  // PWM Werte eingestellt.
42
 
43
  OCR1A = 0x3FFF;
44
 
45
  while (1) {
46
47
  }
48
}

von Karl H. (kbuchegg)


Lesenswert?

Rocco L. schrieb:

> Mir fehlt nur die Idee wie ich das Signal einem PORT Pin in einer While
> übergebe. Also so das das LED hoch und runter fadet.

Wozu musst du da einer 'while' einen Pin übergeben?

Deine PWM und damit die Helligkeit, wird eingestellt, indem du an OCR1A 
einen Wert zuweist. Und genau das machst du dann
1
int main()
2
{
3
  uint16_t i;
4
5
  ....
6
7
  while( 1 ) {
8
9
    for( i = 0; i < 0x6FFF; ++i ) {
10
      OCR1A = i;
11
      _delay_ms( 10 );
12
    }
13
14
    for(  ; i > 0; --i ) {
15
      OCR1A = i;
16
      _delay_ms( 10 );
17
    }
18
  }
19
}

von Rocco L. (kaufparkangucker)


Lesenswert?

Danke, macht genau was es soll.
Ich hoffe das ich auch langsamm da ran komme das mir der Code selber 
einfällt.

Und fals es nochmal jemand machen will:

PWM Pulsweitenmodulation an einem LED am Atmega:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4
#define F_CPU 100000UL
5
#include <util/delay.h>
6
#include <stdint.h>
7
 
8
int main()
9
{
10
  uint16_t i;
11
  // OC1A auf Ausgang
12
  DDRB = (1 << PB1 );  //ATMega8
13
  // DDRD = (1 << PD5 ); //ATMega16
14
  //
15
  // Timer 1 einstellen
16
  //  
17
  // Modus 14:
18
  //    Fast PWM, Top von ICR1
19
  //
20
  //    WGM13    WGM12   WGM11    WGM10
21
  //      1        1       1        0
22
  //
23
  //    Timer Vorteiler: 1
24
  //     CS12     CS11    CS10
25
  //       0        0       1
26
  //
27
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
28
  //     COM1A1   COM1A0
29
  //       1        0
30
 
31
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
32
  //TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
33
  TCCR1B =  (1<<CS10);
34
 
35
  //  den Endwert (TOP) für den Zähler setzen
36
  //  der Zähler zählt bis zu diesem Wert
37
 
38
  ICR1 = 0x6FFF;
39
 
40
  // der Compare Wert
41
  // Wenn der Zähler diesen Wert erreicht, wird mit
42
  // obiger Konfiguration der OC1A Ausgang abgeschaltet
43
  // Sobald der Zähler wieder bei 0 startet, wird der
44
  // Ausgang wieder auf 1 gesetzt
45
  //
46
  // Durch Verändern dieses Wertes, werden die unterschiedlichen
47
  // PWM Werte eingestellt.
48
 
49
   while( 1 ) {
50
51
    for( i = 0; i < 0x6FFF; ++i ) {
52
      OCR1A = i;
53
      _delay_ms( 10 );
54
    }
55
56
    for(  ; i > 0; --i ) {
57
      OCR1A = i;
58
      _delay_ms( 10 );
59
    }
60
61
   }
62
  //OCR1A = 0x3FFF;
63
 
64
}

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.