PWM für Anfänger

OP #2042339
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
}
#2042355
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
}
OP #2042380
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.