Hilfe bei Konfiguration von PWM bei Timer1

OP #2434909
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.
OP #2435102
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.
OP #2435138
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));

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren