ATMega 64 Timer 1 Fast PMW

Gast #2298256
Lesenswert?

Hallo Leute.

Ich möchte mit einem ATMega 64 und dessen Timer 1 ein PWM erzeugen. Soll 
zur Ansteuerung eines Stromausgangs dienen.

Ich möchte ein Fast PMW erzeugen.

Ich habe folgendes initialisiert:

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Toggle
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off

TCCR1A=0x43;     // Mode 15 Laut Datenblatt, Fast PWM mit OCR1A=Top
TCCR1B=0x1B;     // Prescaler auf 011=/64 entspricht 250kHz bei 16MHz 
Clk
TCNT1H=0x00;
TCNT1L=0x00;

ICR1H=0x00;
ICR1L=0x7F;      // Halber Top Wert --> 50% Tastverhältnis
OCR1AH=0x00;
OCR1AL=0xFF;     // Top Wert

OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

Leider messe ich am gewünschten PIN OCR1A (PIN 15, PORTB.5) kein PMW. 
Der Pegel ist ständig auf low.

Ich habe das PORT PIN als Ausgang definiert und zunächst low gesetzt. 
Nach erfolgt die Timer 1 Initialisierung.

Habe ich etwas vergessen, um den Timer richtig zu initialisieren?
Gast #2298475
Lesenswert?

Hi

>Wieso nicht?
>Verändere ich ICR1L verändert sich auch das Tastverhältnis.

Beim Mode 15 ist ICR1 nicht beteiligt. Da ist OCR1A Top und OCR1B/OCR1B 
die Compare-Register.
Und es macht sich auch gut, die OCR-Pins als Ausgang zu setzen.

MfG Spess
Gast #2299523
Lesenswert?

Sorry, aber ich kann im Datenblatt die Stelle nicht finden wo 
beschrieben wird, dass diese Register die Compare Rageister sind.

Wenn dem so ist müßte bei der Veränderung der Inhalte der Register 
OCR1B/OCR1C auch das Tastverhätnis ändern.

Ist das korrekt?
#2299545
Lesenswert?

Michael_SS schrieb:
> Sorry, aber ich kann im Datenblatt die Stelle nicht finden wo
> beschrieben wird, dass diese Register die Compare Rageister sind.

Wieso nicht?
Im Datenblatt gibt es ein großes Kapitel über den Timer 1. In dem wird 
alles beschrieben, bis hin zu einer Einführung in PWM und deren 
unterschiedliche Modi.

Hat man den ersten kapiert (und das ist so nicht weiter schwer), kann 
man sich alle anderen durch ein wenig lesen und logisches Querschliessen 
leicht erarbeiten. Aber lesen muss man schon.

> Wenn dem so ist müßte bei der Veränderung der Inhalte der Register
> OCR1B/OCR1C auch das Tastverhätnis ändern.
>
> Ist das korrekt?

Du hast also eine Hypothese.
Warum probierst du sie nicht einfach aus?
#2299618
Lesenswert?

> Was mach ich falsch?

3 Dinge
1
TCCR1A=0x43;     // Mode 15 Laut Datenblatt, Fast PWM mit OCR1A=Top
2
TCCR1B=0x1B;     // Prescaler auf 011=/64 entspricht 250kHz bei 16MHz Clk
3
TCNT1H=0x00;
4
TCNT1L=0x00;

* du benutzt keine vernünftige Schreibweise an der man schnell ablesen 
kann, welche Bits du wirklich gesetzt hast. Dann könnte man das nämlich 
einfach mit dem Datenblatt vergleichen, was du da wirklich gesezt hast.

* du schaust nicht ins Datenblatt

* du postet kein komplettes Programm
Gast #2299630
Lesenswert?

Hi

>Das Ändern der Inhalte von OCR1B/OCR1C erbringt keine Änderung. Das
>Tastverhälrnis bleibt bei 50%.

Wo? Bei deiner obigen 'Initialisierung' hast du lediglich das OC1A-Pin 
mit COM1A1:0 = 01 aktiviert. Das da überhaupt etwas herauskommt ist eine 
Besonderheit des ATMega64 bei Fast-PWM Mode15. Auf S.134 steht was da 
passiert.
Um eine PWM zu erhalten musst du mit den COM1B- und COM1C-Bits das 
PIN-Verhalten von OC1B und OC1A einstellen. Vorzugsweise 
COM1B/C[1:0]=10.

Und tue dir und anderen den Gefallen und benutze bitte statt TCCR1B=0x1B 
TCCR1B=1<<COMxy|1<<.... .

MfG Spess
Gast #2299695
Lesenswert?

Hier nochmal meine Timer 1 Initialisierung

// COM1A0 = 1, OCR1A wird aktiviert, Ausgabe PWM am PORT, WGM11  = 1, 
WGM10  = 1

TCCR1A=1<<COM1A0 | 1<<WGM11 | 1<<WGM10;

 // WGM12 = 1, WGM13 = 1, CS12 = 0, CS11 = 1, CS10 = 1, Prescaler auf 
!/64 entspricht maximal 250kHz bei 16MHz Clk

TCCR1B=1<<WGM12 | 1<<WGM13 | 1<<CS11 | 1<< CS10;

TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x3F;                      // Top Wert, Einstellung der Frequenz
OCR1BH=0x00;
OCR1BL=0x10;                      // Einstellung Tastverhätnis 30%
OCR1CH=0x00;
OCR1CL=0x10;                      // Einstellung Tastverhätnis 30%

Laut Datenblatt müßte dass jetzt funktionieren. Es kommt nach wie vor 
ein Rechteck mit einem Tastverhältnis von 50% heraus.
Gast #2299729
Lesenswert?

Hi

>Laut Datenblatt müßte dass jetzt funktionieren.

Nein. OC1A ist im Mode15 kein PWM-Ausgang

>Es kommt nach wie vor ein Rechteck mit einem Tastverhältnis von 50% heraus.

Kein Wunder.

Datenblatt (für COMnA[1:0] = 01):

WGMn3:0 = 15: Toggle OCnA on Compare Match,
OCnB/OCnC disconnected (normal port operation).
For all other WGMn settings, normal port operation,
OCnA/OCnB/OCnC disconnected.

Vergiss alles, was mit OCR1A zusammenhängt und benutze die PWM-Kanäle B 
unc C.

MfG Spess

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