Forum: Compiler & IDEs Übergabe Bottom Wert bei PWM Ausgabe


von Chris123 (Gast)


Lesenswert?

Servus erstmal,

ich bin gerade dabei mich mit dem Thema PWM zu beschäftigen, doch leider 
klappt es nicht so gut.
Die PWM selbst funktioniert einwandfrei jedoch hab ich das Problem das 
ich gerne würde, dass das Programm wie eine Art Dimmer die ganze Zeit 
zuerst ein kleines Tastverhältnis von beispielsweise 25% ausgibt und 
dann langsam auf z.B. 75% Prozent hochregelt.
Doch irgendwie steh ich auf dem Schlauch was die Übergabe des 
Bottomwertes betrifft.
Programm sieht wie folgt aus:

#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>


int main()
{
  volatile uint16_t counter=0x0028;
  while(1){
  // OC1A auf Ausgang
  DDRB = (1 << PB1 );  //ATMega88
  //
  // Timer 1 einstellen
  //
  // Modus 14:
  //    Fast PWM, Top von ICR1
  //
  //    WGM13    WGM12   WGM11    WGM10
  //      1        1       1        0
  //
  //    Timer Vorteiler: 1
  //     CS12     CS11    CS10
  //       0        0       1
  //
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
  //     COM1A1   COM1A0
  //       1        0

  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

  //  den Endwert (TOP) für den Zähler setzen
  //  der Zähler zählt bis zu diesem Wert

  ICR1 = 0x00A0;

  // der Compare Wert
  // Wenn der Zähler diesen Wert erreicht, wird mit
  // obiger Konfiguration der OC1A Ausgang abgeschaltet
  // Sobald der Zähler wieder bei 0 startet, wird der
  // Ausgang wieder auf 1 gesetzt
  //
  // Durch Verändern dieses Wertes, werden die unterschiedlichen
  // PWM Werte eingestellt.

  OCR1A = counter;
  _delay_ms(50);
  counter=counter+1;
  if (counter=0x008C)
    {
      counter=0x0028;
    }
  }

}

Schonmal vielen Dank an alle.

von Stefan E. (sternst)


Lesenswert?

1
  if (counter=0x008C)
Vergleich und Zuweisung sind zwei unterschiedliche Dinge. Daher gibt es 
auch zwei unterschiedliche Operatoren dafür.

von Falk B. (falk)


Lesenswert?

@ Chris123 (Gast)

>Die PWM selbst funktioniert einwandfrei jedoch hab ich das Problem das
>ich gerne würde, dass das Programm wie eine Art Dimmer die ganze Zeit
>zuerst ein kleines Tastverhältnis von beispielsweise 25% ausgibt und
>dann langsam auf z.B. 75% Prozent hochregelt.

Dann tu das doch.

>Doch irgendwie steh ich auf dem Schlauch was die Übergabe des
>Bottomwertes betrifft.
>Programm sieht wie folgt aus:

Eine Initialaisierung macht man EINMAL, nicht dauernd. Eher so.
1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
#include <util/delay.h>
4
5
6
int main()
7
{
8
  uint16_t i;
9
  
10
  // Timer init
11
12
  DDRB = (1 << PB1 );  //ATMega88
13
 
14
  // OC1A auf Ausgang
15
  //
16
  // Timer 1 einstellen
17
  //
18
  // Modus 14:
19
  //    Fast PWM, Top von ICR1
20
  //
21
  //    WGM13    WGM12   WGM11    WGM10
22
  //      1        1       1        0
23
  //
24
  //    Timer Vorteiler: 1
25
  //     CS12     CS11    CS10
26
  //       0        0       1
27
  //
28
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
29
  //     COM1A1   COM1A0
30
  //       1        0
31
32
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
33
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (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 = 160;
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
 
50
  while(1){
51
    for (i=40; i<120; i++) {
52
      OCR1A = i;
53
      _delay_ms(50);
54
    }
55
  }

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.