www.mikrocontroller.net

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


Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
//TIMER1 PWM Generator initialisieren
void timer1_init(void)  
{
  //Timer1 stop
  TCCR1B &=~ ((1<<CS12)|(1<<CS11)|(1<<CS10));
   //Modus auf Phase und Frequenz korrekt Mode 9
  TCCR1B = ((1<<WGM13)|(1<<WGM10));
  //Topwert 255 also 8 Bit
  OCR1A=255;
  //Starte Timer mit Preascaler 64
  //fpwm=4000000Hz/2*64*255
  //fpwm=122,5Hz
  TCCR1B = ((1<<CS11)|(1<<CS10));
}

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

WGM10 befindet sich in TCCR1A.

MfG Spess

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, korrigiert, aber wohin mit dem Vergleichswert?

Bye Oli

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OC-Register... Die, die noch "frei" sind.

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Ja.

MfG Spess

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
//TIMER1 PWM Generator initialisieren
void timer1_init(void)    
{
    //Timer1 stop
    TCCR1B &=~ ((1<<CS12)|(1<<CS11)|(1<<CS10));
     //Modus auf Phase und Frequenz korrekt
    TCCR1B |= (1<<WGM13);
    TCCR1A |= (1<<WGM10);
    //Topwert 255 also 8 Bit
    OCR1AH=0;
    OCR1AL=255;
    //Vergleichswert auf 128 also 50% duty cycle
    OCR1BH=0;
    OCR1BL=128;
    TCCR1A |= (1<<COM1A1);
    //Starte Timer mit Preascaler 64
    //fpwm=CKLcpu/2*64*255
    //fpwm=122Hz
    TCCR1B = (1<<CS11);|(1<<CS10));
}

Danke schonmal im Vorraus.

Bye Oli

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.