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
voidtimer1_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
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
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
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
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
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.
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
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.
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