PWM und Timer?

Gast #2481794
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
#2481815
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?
Gast #2481827
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
#2481840
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.
#2481859
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.
#2481886
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
#2481909
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.
#2481985
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.
Gast #2482007
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?:(
#2482016
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
Gast #2482066
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

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