Forum: Mikrocontroller und Digitale Elektronik PWM und Timer?


von Newbie (Gast)


Lesenswert?

Hallo,

ich benutze mittels:

// Mode:Fast PWM;TOP:OCR1A;Update:BOTTOM;TOV1:TOP
TCCR1A = (1<<COM1A1)|(1<<WGM13)|(1<<WGM12)|(1<<WGM11)|(1<<WGM10);
// Clock Select Bits(Vorteiler):1
TCCR1B = (1<<CS10);

die PWM von Timer1.

Ich kenne mich leider noch nicht so gut aus, aber kann man simultan zur 
PWM auch irgendwie einen Sekunden-Takt(für einen Timer) realisieren - 
alle anderen Timer sind schon belegt und deshalb nicht zu gebrauchen?

Viele Grüße

von Düsendieb (Gast)


Lesenswert?

Du kannst die PWM Takte zählen, indem du für den Timer 1 auch dem 
Timerinterrupt aktivierst. Must halt schauen wann da eine Sekunde 
rauskommt.


Axel

von Vlad T. (vlad_tepesch)


Lesenswert?

klar,
solange die PWM-Frequenz nicht verändert wird (per CTC-Modus), rechne 
dir doch aus, wie oft der Timer in der Sekunde überläuft und zähle 
entsprechend im Overflow-Interupt mit.
kann natürlich sein, dass es nicht ganz genau aufgeht. Ist halt die 
Frage, wie genau du es braust.

Was machen denn die anderen Timer? vielleicht kannst du die 
Funktionaliäten ja bündeln?

von Newbie (Gast)


Lesenswert?

Hi,

danke für die schnellen Antworten.

Ich bastle an einem Bus, bei dem ich die ISP-Anschlüsse des AVRs 
benötige. Ich habe deshalb nur noch 4 PWMs an 3 Timern zur Verfügung.
Soooooooooo genau muß das gar nicht sein. Ich brauche einmal ein etwa 
2s-Signal für ein Relais und einen etwa 10-15min.-Timer für eine 
Standby-Schaltung des AVR.

Kann ich den PWM-Takt mit TCNT1 zählen?

MfG

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:

> Kann ich den PWM-Takt mit TCNT1 zählen?

Wozu.
Du hast deine PWM auf eine bestimmte Frequenz eingestellt. Also weißt du 
wieviele Compare Matches du in der Sekunde kriegst (=x).
An den Timer klemmst du eine ISR, die dann eben beim Compare Match (wenn 
der Timer seine Obergrenze in OCR1A erreicht) aufgerufen wird. Dort 
zählst du eine globale Variable hoch und wenn die den Wert x erreicht 
hat, ist wieder mal 1 Sekunde vergangen.
Wenns eh nicht so genau sein muss (auf Hunderstel Sekunden), dann langt 
das Dicke.

von Düsendieb (Gast)


Lesenswert?

TIMSK1= (1 <<TOIE1);
und dann wird die ISR aufgerufen.

von Newbie (Gast)


Lesenswert?

Ich hab das jetzt mit:

TIMSK1 |= 1<<OCIE1A;

gemacht und es geht auch. Kann man des so lassen?

LG

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du hast deine PWM auf eine bestimmte Frequenz eingestellt. Also weißt du
> wieviele Compare Matches du in der Sekunde kriegst (=x).

ich würde trotzdem den Overflow Int nehmen, da so der Fehler wenigstens 
fix ist, ansonsten ist es ja (wenn auch verscwindend gering abhängig vom 
PWM-Wert.
und wenn er bisher keinen der Ints benutzt, ist es egal, welchen er 
aktivert.

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:
> Ich hab das jetzt mit:
>
> TIMSK1 |= 1<<OCIE1A;
>
> gemacht und es geht auch. Kann man des so lassen?

Kann man nicht nur, muss man sogar.
Du verwendest einen Timer Mode mit einem TOP Wert aus OCR1A. Da wird 
kein Overflow ausgelöst.

von Newbie (Gast)


Lesenswert?

Hmmm... scheinbar reagiert das Programm aber auf beide...?! In beiden 
Situationen schaltet der AVR.

LG

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:
> Hmmm... scheinbar reagiert das Programm aber auf beide...?! In beiden
> Situationen schaltet der AVR.

Echt?

OK, Ich hab das jetzt aus dem Gedächtnis geschrieben, weil mir das auch 
vor etlicher Zeit mal unklar war, ob da ein Overflow kommt oder nicht. 
Und mein Gedächtnis sagt: da war keiner.

Danke für die Klarstellung.

von Newbie (Gast)


Lesenswert?

Macht ja nix. Ich denke, dies kann auch einem 'Moderator' mal 
passieren.;-)
Desweiteren ist es sowieso unglaublich, was ihr euch alle immer merken 
könnt.^^

Und, soll ich dann nun doch OVF benutzen?

LG

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Kann man nicht nur, muss man sogar.
> Du verwendest einen Timer Mode mit einem TOP Wert aus OCR1A. Da wird
> kein Overflow ausgelöst.

das mit dem OCR1A als TOP hab ich überlesen,
Aber laut Datenblatt (zumindest atmega8) wird der trotzdem ausgelöst.

da macht das mit dem COM1A aber nicht viel sinn, oder? Wo ist denn da 
die PWM? die könnte ja höchstens mit OCR1B erzeugt werden.

Ich frag mich, ob er tatsächlich das macht, was er denkt.
Es sieht so aus, als soll mit OCR1A der PWM-Wert beeinflust werden.
Tatsächlich wird ja aber nur die Frequenz verändert und das 
Tastverhältnis ist immer 50:50 (Da ja Pin-Toggel eingestellt wurde).
Unter diesen Umständen ist das Zeitmessen natürlich etwas anstrengender

von Vlad T. (vlad_tepesch)


Lesenswert?

Ergänzung:
Ich würde Modus 14 benutzen, der hat den Vorteil, dass nicht einer der 
OCRs blockert wird.

Allerdings muss dann der Overflow-Int zum Zählen benutzt werden.

von Newbie (Gast)


Lesenswert?

Wie meinst du das denn genau?

LG

von Newbie (Gast)


Lesenswert?

Ps.: ... und nix 'getoggelt', sondern 'Clear on Compare...'

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:
> Ps.: ... und nix 'getoggelt', sondern 'Clear on Compare...'

Ja eben drumm.
Das macht jetzt nicht wirklich Sinn.

Angenommen OCR1A sei 5

dann passiert:
 Timer zählt      PIN OC1A ist
    0                1
    1                1
    3                1
    4                1
    5                0    weil Copmare Match und COM1A1
                          gleichzeitig wird aber der Timer zurückgesetzt
    0                1    weil BOTTOM
    1                1
    2                1
    3                1
    4                1
    5                0
    0                1
    1                1
 ...

Es ist schon irgendwie eine PWM. Aber auch nicht so richtig. Denn wenn 
OCR1A den Wert 6 hat, dann lautet die Reihe

    0                1
    1                1
    2                1
    3                1
    4                1
    5                1
    6                0
    0                1
    1                1


d.h. hier hat man 6 Takte 1 und nur 1 Takt 0. Dafür verändert sich aber 
die PWM Frequenz gleich mit.

von Vlad T. (vlad_tepesch)


Lesenswert?

Newbie schrieb:
> Ps.: ... und nix 'getoggelt', sondern 'Clear on Compare...'

ok, hab mich verlesen.
Dann hast du aber gar keine PWM o.O

von Newbie (Gast)


Lesenswert?

Ich hab ja vorher schon nix verstanden... jetzt verwirrt ihr mich 
total!;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

was für einen Controller hast du, dass die WGM-bits alle in einem 
Register sitzen? Die sind doch meistens (die die ich mir grad angeschaut 
habe:alle) in verschiedenen Registern anzutreffen.

von Newbie (Gast)


Lesenswert?

@Karl:

Nach deinem obigem Bild läuft meine PWM ja dann, genauso so, wie ich es 
immer 'annahm'.
Wie soll das denn sonst gehen?

@Vlad: ATMega88

von Vlad T. (vlad_tepesch)


Lesenswert?

Newbie schrieb:
> @Vlad: ATMega88

dann ist deine Timerinitialisierung in jedem Fall falsch

von Newbie (Gast)


Lesenswert?

@Vlad: Warum denn genau?

LG

von Vlad T. (vlad_tepesch)


Lesenswert?

Du hast dir hier also einen Modus 3 (10bit phasenkorrekt) und den 
OutputCompareB eingeschalten

Newbie schrieb:
> @Vlad: Warum denn genau?
>
> LG

weil du das Register mit Bitwerten fütterst, die zu einem anderen 
Register gehören.

WGM12 und WGM13 sitzen im TCCR1B-Regsiter.
Schau dir im Datenblatt mal an, was du eingeschalten hast.

von Newbie (Gast)


Lesenswert?

Upps... dann hab ich das ja schon immer falsch gemacht.........;-)

Ist das besser?:
TCCR1B = (1<<WGM14)|(1<<WGM13)|(1<<CS10);

von Newbie (Gast)


Lesenswert?

Hmmmmm... jetzt läuft meine PWM aber gar ned mehr und bei variablem 
OCR1A stehts auf TOP bzw. am Anschlag...?!:(

Was ist denn nun los?

LG

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:
> @Karl:
>
> Nach deinem obigem Bild läuft meine PWM ja dann, genauso so, wie ich es
> immer 'annahm'.

Wei stellst du denn deine PWM ein, wenn du haben willst, dass das 
Verhältnis von 1-en zu 0-en 2 zu 5 sein soll? (2 Takte auf 1 und 5 Takte 
auf 0)

> Wie soll das denn sonst gehen?

Im Regelfall will man ja haben, dass die PWM Frequenz konstant ist.
D.h. man ändert den TOP Wert nicht.
Aber man nimmt zb einen Modus in dem zb ICR1 den TOP Wert stellt.

Annahme: ICR1 sei 5
         OCR1A sei 2

Die COM Bits seien wieder so wie du das hattest: Clar on Match, Set at 
BOTTOM

Dann passiert das

 TCNT1         OCR1A Pin

  0              1                wegen BOTTOM
  1              1
  2              0                weil TCNT1 gleich OCR1A
  3              0
  4              0
  5              0        und Reset des Timers, weil TCNT1 == ICR1
  0              1                wegen BOTTOM
  1              1
  2              0                wegen COmpare Match OCR1A
  3              0
  4              0
  5              0        Reset, weil TCNT1 == ICR1
  0              1                wegen BOTTOM

und nur durch Verändern des Wertes im OCR1A Register kann ich das 
Verhältnis von 1-Ausgaben zu 0-Ausgaben verändern, wobei dei Frequenz 
konstant bleibt. Setze ich OCR1A auf 4:

 TCNT1         OCR1A Pin

  0              1                wegen BOTTOM
  1              1
  2              1
  3              1
  4              0                weil TCNT1 gleich OCR1A
  5              0        und Reset des Timers, weil TCNT1 == ICR1
  0              1                wegen BOTTOM
  1              1
  2              1
  3              1
  4              0                weil TCNT1 gleich OCR1A
  5              0        Reset, weil TCNT1 == ICR1
  0              1                wegen BOTTOM


Nur durch Verändern des Register Wertes OCR1A kann ich (im Rahmen des 
Wertes in ICR1) das Verhältnis von 1-Zeit zu 0-Zeit verändern. Und zwar 
OHNE das der Timer schneller oder langsamer durch einen Zyklus 
durchgeht. Der Timer zählt immer bis 5, aber bei unterschiedlichen 
Zählerständen wird der Output Pin abgeschaltet.

von Newbie (Gast)


Lesenswert?

Ich hab`s jetzt so versucht...

void pwm_start(uint16_t x,uint16_t y)
{
// Konfiguration des Timer/Counter:
// Mode:Fast PWM;TOP:OCR1A;Update:BOTTOM;TOV1:TOP
TCCR1A = (1<<COM1A1)|(1<<WGM11);
// Clock Select Bits(Vorteiler):1
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10);
OCR1A = x;
ICR1 = y;
}
pwm_start(5,2);

... aber die angeschlossene LED brennt auf Anschlag. Was mach' ich 
falsch?:(

von Karl H. (kbuchegg)


Lesenswert?

Newbie schrieb:

> OCR1A = x;
> ICR1 = y;
> }
> pwm_start(5,2);
>
> ... aber die angeschlossene LED brennt auf Anschlag. Was mach' ich
> falsch?:(

Geh noch mal den Vorgang durch, den ich weiter oben skizziert habe.
Aus dem Vorgang folgt, dass dein PWM-Wert (der in OCR1A) KLEINER als der 
Top Wert sein muss (der in ICR1). 5 ist nicht kleiner als 2

von Newbie (Gast)


Lesenswert?

Ich hatte es grad schon geschafft, danke.

ES LÄUFT!;-))

von Newbie (Gast)


Lesenswert?

Mal noch ne kurze Frage...

Ist das normal, dass bei einer niedrigen Auflösung und niedrigem 
PWM-Wert, eine Konstantstromquelle anfängt, leise, aber durchgehend zu 
fiepsen?

Das ist die KSQ:
http://pcb-components.de/index.php?page=shop.product_details&flypage=garden_flypage.tpl&product_id=95&category_id=6&option=com_virtuemart&Itemid=64&vmcchk=1&Itemid=64

Kennt sich da jemand aus? Kann man das irgendwie verhindern?

LG

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.