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
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
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?
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
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.
Ich hab das jetzt mit: TIMSK1 |= 1<<OCIE1A; gemacht und es geht auch. Kann man des so lassen? LG
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.
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.
Hmmm... scheinbar reagiert das Programm aber auf beide...?! In beiden Situationen schaltet der AVR. LG
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.
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
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
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.
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.
Newbie schrieb: > Ps.: ... und nix 'getoggelt', sondern 'Clear on Compare...' ok, hab mich verlesen. Dann hast du aber gar keine PWM o.O
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.
@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
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.
Upps... dann hab ich das ja schon immer falsch gemacht.........;-) Ist das besser?: TCCR1B = (1<<WGM14)|(1<<WGM13)|(1<<CS10);
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
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.
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?:(
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.