Forum: Mikrocontroller und Digitale Elektronik Timer 1 phase & frequenz correct Vergleichswert


von Oli (Gast)


Lesenswert?

Hallo zusammen,

hat hier schon jemand mit einem Timer1 (16-Bit) in meinem Fall ein 
Atmega 168 eine Phasen und Frequenz korrekte PWM Mode 9 hinbekommen? 
Nach Datenblatt habe ich den Timer folgendermaßen konfiguriert.
1
//TIMER1 PWM Generator initialisieren
2
void timer1_init(void)  
3
{
4
  //Timer1 stop
5
  TCCR1B &=~ ((1<<CS12)|(1<<CS11)|(1<<CS10));
6
   //Modus auf Phase und Frequenz korrekt Mode 9
7
  TCCR1B = ((1<<WGM13)|(1<<WGM10));
8
  //Topwert 255 also 8 Bit
9
  OCR1A=255;
10
  //Starte Timer mit Preascaler 64
11
  //fpwm=4000000Hz/2*64*255
12
  //fpwm=122,5Hz
13
  TCCR1B = ((1<<CS11)|(1<<CS10));
14
}

OCR1A dient zur Frequenzeinstellung bzw. Einstellung der Auflösung.
Ich denke meine Frequenzberechnung sollte stimmen,aber in welches 
Register soll denn nun der Vergleichswert gesetzt werden um das 
Pulsverhältnis einzustellen. An dieser Stelle komme ich leider nicht 
weiter.

Vielen Dank schonmal im Vorraus, und ja ich weiß, Timer Threads gibts 
wie Sand am Meer aber die meisten doch noch zu anderen Modi, möchte aber 
gerne Diesen nutzen.

Bye Oli

von spess53 (Gast)


Lesenswert?

Hi

>TCCR1B = ((1<<WGM13)|(1<<WGM10));

WGM10 befindet sich in TCCR1A.

MfG Spess

von Oli (Gast)


Lesenswert?

Danke für den Hinweis, korrigiert, aber wohin mit dem Vergleichswert?

Bye Oli

von STK500-Besitzer (Gast)


Lesenswert?

OC-Register... Die, die noch "frei" sind.

von Oli (Gast)


Lesenswert?

Das zum Timer1A gehörende OC Register OCR1A hab ich ja zur 
Frequenzfestlegung schon beschrieben. Zu diesem Register gehören ja noch 
OCR1AH/L das sind doch die beiden 8-Bit Register die zusammen das 16-Bit 
OCR1A ergeben, oder sehe ich das falsch, Welches ich ja schon 
beschrieben habe. Weitere zum Timer1A gehörende OC Register kann ich 
nicht jedoch nicht finden, welche meinst du also?

Bye Oli

von spess53 (Gast)


Lesenswert?

Hi

>Weitere zum Timer1A gehörende OC Register kann ich nicht jedoch nicht >finden, 
welche meinst du also?

Es gibt keinen Timer1A. Sondern nur Timer1. Und dieser besitzt 2 
OC-Register, nämlich OCR1A und OCR1B. In deinem Fall wird OCR1A zur 
Festlegung des Topwertes benutzt. Der für die PWM notwendige 
Compare-Wert kommt in das Register OCR1B.

MfG Spess

von Oli (Gast)


Lesenswert?

Hi,

Du hast recht, habe mich falsch ausgedrückt. Ich meinte die zwei PWM 
kanäle also A und B von Timer1. Danke für Erkärung, werde dies mal 
einarbeiten. Das heißt also für 50% Duty Cycle müsste in OCR1B=128 
stehen?

Bye Oli

von spess53 (Gast)


Lesenswert?

Hi

>Das heißt also für 50% Duty Cycle müsste in OCR1B=128 stehen?

Ja.

MfG Spess

von Oli (Gast)


Lesenswert?

Hi,

also der Timer läuft dank der Hilfe von spess53. Dieses möchte ich nun 
als Invertierte PWM am Ausgang PB1(OC1A) ausgeben. Laut Datenblatt

TCCR1A |= (1<<COM1A1);

Aber ausser dass nach Simulator kurz nach anlaufen des Timers, PB1 auf 
High gesetzt wird, passiert am genannten Port nichts mehr. Auf jeden 
Fall ist PB1 als Ausgang gesetzt. So wie ich das Datenblatt verstehe ist 
es doch möglich am Port PB1(OC1A) eine phasen und frequenz korrekte 
invertierte PWM auszugeben. Wo liegt jetzt schon wieder mein Denkfehler?

Hier mal betreffende Code
1
//TIMER1 PWM Generator initialisieren
2
void timer1_init(void)    
3
{
4
    //Timer1 stop
5
    TCCR1B &=~ ((1<<CS12)|(1<<CS11)|(1<<CS10));
6
     //Modus auf Phase und Frequenz korrekt
7
    TCCR1B |= (1<<WGM13);
8
    TCCR1A |= (1<<WGM10);
9
    //Topwert 255 also 8 Bit
10
    OCR1AH=0;
11
    OCR1AL=255;
12
    //Vergleichswert auf 128 also 50% duty cycle
13
    OCR1BH=0;
14
    OCR1BL=128;
15
    TCCR1A |= (1<<COM1A1);
16
    //Starte Timer mit Preascaler 64
17
    //fpwm=CKLcpu/2*64*255
18
    //fpwm=122Hz
19
    TCCR1B = (1<<CS11);|(1<<CS10));
20
}

Danke schonmal im Vorraus.

Bye Oli

von Karl H. (kbuchegg)


Lesenswert?

Oli schrieb:

> also der Timer läuft dank der Hilfe von spess53. Dieses möchte ich nun
> als Invertierte PWM am Ausgang PB1(OC1A) ausgeben. Laut Datenblatt


Wenn du die PWM mit dem OCR1B Register veränderst, dann wird die PWM 
auch am OC1B Ausgang rauskommen

Du verwendest den B-Kanal um die PWM zu erzeugen. Dies deshalb, weil du 
den A-Kanal nicht benutzen kannst, weil OCR1A schon für die Festlegung 
des Top-Wertes gebraucht wird und dir daher nicht mehr zur Verfügung 
steht.

B-Kanal heißt aber: bei allem B!
Bei den OCR Werten, bei den Pin Einstellungen, beim Pin an dem die PWM 
rauskommt.

von Oli (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Du verwendest den B-Kanal um die PWM zu erzeugen. Dies deshalb, weil du
> den A-Kanal nicht benutzen kannst, weil OCR1A schon für die Festlegung
> des Top-Wertes gebraucht wird und dir daher nicht mehr zur Verfügung
> steht.

Die PWM soll schon am Kanal A ausgegeben werden, da aber bei PWM Mode 9 
TOP=OCR1A angegeben ist, habe ich dort den Top Wert angegeben. Sehe ich 
es richtig, dass ich um Kanal A nutzen zu können auf Mode 8 gehen müsste 
und somit TOP=ICR1 und dann OCR1A als Vergleichswert angeben muss? Wäre 
nicht schlimm da ich die Frequenz nicht ändern will.

Bye Oli

von Karl H. (kbuchegg)


Lesenswert?

Oli schrieb:

> Die PWM soll schon am Kanal A ausgegeben werden, da aber bei PWM Mode 9
> TOP=OCR1A angegeben ist, habe ich dort den Top Wert angegeben. Sehe ich
> es richtig, dass ich um Kanal A nutzen zu können auf Mode 8 gehen müsste
> und somit TOP=ICR1 und dann OCR1A als Vergleichswert angeben muss? Wäre
> nicht schlimm da ich die Frequenz nicht ändern will.

Es ist wirklich ganz einfach.
Du benutzt den Kanal, über dessen OCR Register du den PWM Duty Cycle 
einstellst.

Wenn du mittels OCR1A den Duty Cycle einstellst, dann benutzt du den 
A-Kanal. Benutzt du OCR1B um den PWM Duty Cycle einzustellen, dann 
benutzt du den B-Kanal.


Alles andere folgt daraus.

von Oli (Gast)


Lesenswert?

Also dass ist mir irgendwie...

Es heißt doch beim Mode 9 TOP=OC1RA wo soll denn da noch der 
Vergleichswert hin? Mehr OC Register gibts doch für Kanal A nicht? Wenn 
ich TOP bei OC1RB reinschreibe und den Vergleichswert in OCR1A läuft der 
Timer nur noch bis zu dem dort gesetzten Wert und wieder zurück und 
nicht bis zum TOP Wert. Vielleicht sollte ich lieber ins Bett gehen, ist 
woll heute ein Hoffnungsloser Fall bzw. doch nicht ganz so einfach. 
Schade eigentlich.

Bye Oli

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.