Forum: Mikrocontroller und Digitale Elektronik DutyCyle schwankt beim ATmega328


von Bernd E. (niro)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

gerade versuche ich auf dem ATmega328 ein 32kHz PWM-Signal mit dem 16Bit 
Timer (OC1A /PB1) zu erzeugen. Der Duty Cycle sollte zum Testen erst mal 
50% sein, später aber einstellbar.
Folgende PWM-Initalisierung habe ich verwendet:

-----------------------------------
//PWM-Timer 1A

DDRB |= (1 << DDB1);
// PB1 is now an output

ICR1 = 0x0079;
// set PWM for 32000kHz @ fclk=4MHz
// PWM freq = fclk /[N x (1+TOP)]

TCCR1A |= (1 << COM1A1);
// set none-inverting mode

TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12)|(1 << WGM13);
// set Fast PWM mode using ICR1 as TOP (MODE 14)

OCR1A = 0x003C;
//Duty cycle = 50% -> = 50%-Wert von ICR1

TCCR1B |= (1 << CS10);
// START the timer with no prescaler
-----------------------------------

Im Anhang seht Ihr das Ergebnis.
Irgendwie ist die Breite des High-Signal abwechselnd immer 21us und dann 
14us!

Hat vielleicht jemand eine Idee, wieso das so ist oder besser, wie ich 
einen konstanten DC bekomme.

Danke!
Niro

von holger (Gast)


Lesenswert?

Schmeiss dein Spielzeugosci weg.

von Roger W. (Firma: ruin ltd.) (superguest)


Lesenswert?

Die USB-Scopes sind für den Anus.

[Edit] guckst du hier:
http://www.youtube.com/watch?v=bEuPtWE8FOI

von Bernd E. (niro)


Angehängte Dateien:

Lesenswert?

OK, prinzipiell gebe ich Euch ja Recht, dass das Teil Probleme beim 
Triggern hat, aber bei einem single shot stimmts dann doch schon 
innerhalb eines Bildes meistens ganz gut.
Zum Vergleich im Anhang ein Bild mit meinem teuren Tektronix gemacht.
Sieht irgendwie sehr ähnlich aus.
Dann kommen wir leider doch wieder zum Atmel... (..anders wärs mir auch 
lieber gewesen ;-))

Hat nicht irgend jemand noch eine Idee, woran das liegen könnte?

Danke und Grüße,
Niro

von Ingo (Gast)


Lesenswert?

Eh, wie sieht deine Versorgungsspannung und die Quarz? Beschallung aus? 
Ich tippe hier tatsächlich auf einen Hardwarefehler

von Karl H. (kbuchegg)


Lesenswert?

Dann zeig mal deinen ganzen Code, damit wir dir suchen helfen, wo du 
OCR1A irrtuemlich ueberbuegelst

von holger (Gast)


Lesenswert?

>Schmeiss dein Spielzeugosci weg.

Ich nehm alles zurück und entschuldige mich bei dir
und deinem Osci. Verdammte Inzucht das sieht ja tatsächlich so aus.

Hast du mal ein komplettes Projekt für uns?

Du hast übrigends Clear on Compare Match an.
Die Low Phasen sehen doch recht gleich lang aus.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Bernd E. schrieb:
> TCCR1A |= (1 << COM1A1);
> // set none-inverting mode
>
> TCCR1A |= (1 << WGM11);
> TCCR1B |= (1 << WGM12)|(1 << WGM13);

Wenn das die erste Intialisierung des Timers ist, schadet es nicht, 
ruhig in einem Schwupps und explizit die Register zu beschreiben, 
verODERn musst du eigentlich nur dann, wenn du den Rest des 
Registerinhaltes bewahren willst. Also ruhig:
1
TCCR1A =  (1 << COM1A1) | (1 << WGM11); // inverted mode
2
TCCR1B = (1 << WGM12)|(1 << WGM13);
Das ist im Moment vermutlich nicht das Problem, so weisst du aber 
sicher, was wirklich im Register drin steht. Später kannst du dann 
verODERn.

von Christian (Gast)


Lesenswert?

Matthias Sch. schrieb:
>(...) Also ruhig:TCCR1A =  (1 << COM1A1) | (1 << WGM11); // inverted mode
> TCCR1B = (1 << WGM12)|(1 << WGM13);

nö da finde ich seine Variante übersichtlicher!

von Bernd E. (niro)


Lesenswert?

...Danke für den Tip, Karl Heinz hatte recht.
Ich hab natürlich gepennt und nachträglich das PWM1 noch zu der SW 
hinzugefügt, obwohl ich Timer1 schon benutze...
Naja, muß ich halt auf PWM 0 ausweichen, dann klappts zwar mit den 32kHz 
nicht mehr so genau, aber dafür funktioniert der Rest ;-)

Danke nochmal...
Niro

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Christian schrieb:
> Matthias Sch. schrieb:
>>(...) Also ruhig:TCCR1A =  (1 << COM1A1) | (1 << WGM11); // inverted mode
>> TCCR1B = (1 << WGM12)|(1 << WGM13);
>
> nö da finde ich seine Variante übersichtlicher!

Es geht nicht um übersichtlicher, sondern um das Gleichheitszeichen 
statt des ODER. Ausserdem vermeidest du durch Beschreiben des Registers 
in einem Rutsch ungewollte Zwischenzustände.

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.