Forum: Compiler & IDEs Hilfe bei Konfiguration von PWM bei Timer1


von M. H. (dbzwerg)


Lesenswert?

Hallo,

ich möchte mittels Timer 1 zwei PWMs erzeugen.( µc läuft mit externem 8 
MHz Quraz).
Sie soll im modus WGM14 laufen.

Wenn ich das Datenblatt richtig verstanden hab funktioniert doch dieser 
Modus so, dass der Timer bis erreichen von ICR1 durchläuft. Bei 
erreichen von ICR1 wird dann noch ein Overflow flag gesetzt und der 
Timer beginnt bei "0". Während des inkrementieren vom Timer wird immer 
mit den Werten in
OCR1A bzw. OCR1B verglichen und bei erreichen wird je nach Konfigurtion 
entweder der PIN OC1A / OC1B auf low gelegt.
Das stimmt doch so oder?

Zu Testzwecken habe ich einfach eine LED an PIN PB1(OC1A) bzw. PB2(OC1b) 
geklemmt. Leider tut sich da garnix.



HIer mein C-Code:
1
volatile int pwm_period = 20000; // Variable zu Einstellung der PWM Periodenzeit ( in µs)
2
3
4
5
ISR (TIMER1_OVF_vect)
6
  
7
  {
8
    //Update der Compare Register für die PWM Erzeugung
9
  
10
      OCR1A = servo1_out;
11
      OCR1B = servo2_out;
12
  }
13
14
15
16
//Hauptschleife
17
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
18
19
DDRB |=(1<< PB1);  //Ausgang Servo Signal 1 ( OC1A)
20
DDRB |=(1<< PB2);  //Ausgang Servo Signal 2 ( OC1B)
21
22
23
// Konfig Timer1 für PWM
24
  
25
  TCCR1A &=~((1<<COM1A0)); // PIN OC1A auf low bei erreichen von OCR1A
26
  TCCR1A |=(1<<COM1A1);
27
  
28
  TCCR1A &=~((1<<COM1B0)); // PIN OC1B auf low bei erreichen von OCR1B
29
  TCCR1A |=(1<<COM1B1);
30
  
31
  TCCR1A &=~((1<<WGM10)); //WGM Mode 14 -> FAST PWM, TOP = ICR1
32
  TCCR1A |=(1<<WGM11);
33
  TCCR1B |=(1<<WGM12);
34
  TCCR1B |=(1<<WGM13);
35
  
36
  
37
  ICR1 = pwm_period; // PWM Periodendauer definieren
38
  
39
  
40
  TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
41
  TCCR1A |=(1<<CS11);
42
  TCCR1B &=~((1<<CS10));
43
  
44
  TIMSK |= (1<<TOIE1); // Overlfow ISR erlauben
45
  
46
  OCR1A = servo1_out;
47
  OCR1B = servo2_out;
48
49
50
//+++++++++++++++++++++++++++++++++++++++++++++++++++++


Hoffe ihr könnt mir helfen, denn leider seh ich meinen Fehler nicht.

von Stefan E. (sternst)


Lesenswert?

M. H. schrieb:
> Zu Testzwecken habe ich einfach eine LED an PIN PB1(OC1A) bzw. PB2(OC1b)
> geklemmt. Leider tut sich da garnix.

Was soll sich denn tun?
Der gezeigte Code enthält ja nichts, was dann an den LEDs zu sehen wäre.

von M. H. (dbzwerg)


Lesenswert?

Naja hab erwartet das die LEDS schwach leuchten.

Muss dazu sagen das die Variablen serv1_out / servo2_out mit 1500 
vorbelegt sind.

Demnach hätt ich meiner meinung nach ne pwm mit ti  =1500 µs , tp = 
18500µs , t-periode  = 20000µs.

Dies sollte ich mit meinem blossem auge sehen.

von M. H. (dbzwerg)


Lesenswert?

M. H. schrieb:
> TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
>   TCCR1A |=(1<<CS11);
>   TCCR1B &=~((1<<CS10));



Hallo!

So hab den Fehler gefunden.
Hatte das CS11 Bit im falschen Register gesetzt.

Unten seht ihr das richtige Register.

Nun leuchten auch meine LEDs :-).

1
TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
2
TCCR1B |=(1<<CS11);
3
TCCR1B &=~((1<<CS10));

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.