Timer2 tryb CTC...

Mar 20, 2006 20 Replies

Mam pytanie jak za pomoca trybu CTC w Atmedze8 sterowac wypelnieniem impulsu - bo chcialbym zronbic PWM? Korzystam z dokumentacji ale nie moge znalesc nic o tym jak zmeniac wypelnienie...Czy chodzi czasem o to ze zmiania wartosci OCR2 powoduje zmiene wypeleniania?



Napisalem cos takiego ale nie wiem czy jest ok:



//------------- int main () { TIMSK = (1<<OCIE2)|(1<<TOIE2); //musi to byc ??? TCNT2=0; //zerowanie licznika -profilaktycznie TCCR2 = (1<<WGM21)|(1<<CS20)|(1<<COM21);//ustawnie tryby CTC // pleskalera na "1" ,and Toggle OC2 On Compare Match DDRB=0xFF; PORTB=0xFF; while (1) { OCR2 = 100; //ziarnistosc do obliczenia jeszcze TIFR=0xFF; // zgaszenie flag przerwan } } /--------------



Jak mozna to sparwdzic nie majac oscyloskopu czy AVR Studio oferuje takie mozliwosci?



uC to Atmega8 z kwarcem 8MHz (wwwnetrznym ustawionym programowo -dac zewnetrzny?)



Pozdarwiam, Rafal k.


zeby zrobic PWM to nie rób w trybie CTC

CTC to jest skracanie zliczania np licznik liczy od zera jak sie zrówna z OCR to sie zesryuje i zlicza od nowa i jak sie zrówna z OCR to na wyjsciu "cos sie robi"

tryb FAST PWM dzia³a fajnie

np

//PWM TCCR1A=0B10000001; TCCR1B=0B00001001;

OCR1A=wype³nienie;

ja tak to robilem

przerwan nietrzeba wykorzystywac chodzi sobie to samo tylko wartoscia rejestru OCR1A zmieniasz wype³nienie

Pozdrawiam

AzaZeL

Ok ale ja musze wykonac PWM na innym Timer'ze oprucz wlasnie T1..Czyli albo T2 tak jak ja probuje albo T1..I z lad moje watpliwosci.

Czyli w trybie CTC ciezko jest zrobic PWM? Bo mi sie wydaje ze sie da?

Pozdarwiam, Rafal k.

Troche nie bardzo rozumiem..gdzie mam podlaczyc woltomierz i jak woltomierz moze mi dac odpowiedz czy generowany przezemnie sygnal jest odpowiedniej czestotliwsoci?

Pozdrawiam, Rafal k.

zalezy jaka chcesz dokadnosc pwm i czestotliwosc

bo mozesz puscic w tryb ctc i programowo zwiekszac sobie jakis programowy licznik PWM i zliczac zrównania OCR i w zaleznosci od tego jakie chcesz miec wype³nienie wy³aczac wtedy wyjscie pwm a jak licznik programowy sie przekreci to np ustawic w stan "1" wyjscie.

to takie programowe PWM

AzaZeL

Hmm chcialbym zrobic PWM o stalym wypeleniu rownym 50%. Jesli zas chodzi o CTC to ten tryb rozumiem w ten sposob, ze w wartosci OCR2 nadaje jakas wartosci czyli moja ziarnistosc...

No i potem licznik zlicza w gore i jak wartosc TCNT2 zrowna mi sie z OCR2 to nastepuje jego zerowanie i zmiana stanu na wyjsciu OC2? Jesli sie myle to prosze mnie poprawoc, bo wlasnie moim glownym problemem jest to ze nie wiem jak zmieniac wypelnienie. A wiec w COMPARE OUTPUT MODE ustawilem

COM21= 1 i COM20= 0 Co oznacza ze nastepuje zerowanie sie wyjscia OC2 w chwili porownania jednak potem musze je na nowo ustawic na 1?

Reasumujac czy noga procka Oznaczona jako OC2 poprzez swoje wlacz/wylacz sluzy do generownia wypelnienia?

Pozdarwiam, Rafal k.

Najpierw zdefiniuj co chesz zrobic, generator o zmiennej czestotliwosci, czy o stalej f ale zmiennym wypelnieniu (PWM) Bo to dwie rozne sprawy

PDF str 116 tabelka 43 " Toggle OC2 on Compare Match" czyli zmiana stanu na przeciwny

wtedy wartosc OCR2 to jest pó³ okresu przebiegu prostokatnego o wype³nieniu

50%

AzaZeL

Ok a wiec chce generowac sygnal PWM o stalej czestotliwosci = 40KHz (taka f potrzebna do wprawienia w drgania przetwornika ultradzwiekowego) o wylenieniu

50%.

Pozdrawiam, Rafal k.

Hmm masz racje ale pojawila mi sie jeszcze jedna watpliowsc otoz, wzor na czestotliwosc wyjscia OC2 jest dana wzorem :

f=(f_clk_I/0)/ (2*N*(1+OCR2))

Bo z wykresu na stronie 109 wynika ze jeden kres trwa dwa wyzerowania licznika TCNT2 a wiec z tad moje pytanie czy jak po podstawieniu i obliczeniu danych dla f=40KHz wyjdzie mi przykladowo OCR2 = 100 to jaka mam wartosc wpisac w OCR2 z koro az dwa liczenia timera skladaja sie na okres? Czy nie opowieniem OCR2 podzielic na 2 i wpisac tym samy 50? Ale czy wtedy nie zmieni mi sie f?

Pytam bo nie mam oscyloskopu i nie wiem jak mam zmierzyc f generowana przez uC...I stad kolejne pytanie czy da sie to jako zasymulac a AVR_Studio?

Pozdarwiam, Rafal k.

U¿ytkownik "ToR" <ToR snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

W takim razie do tego celu najlepiej bedzie zastosowac tryb Fast PWM a nie CTC W CTC mozesz zmieniac latwo czestowliwosc przy PWM=50%, a w Fast PWM mozesz ustalic sobie czestoliwosc (rejestem ktory oglranicza zlicznie licznika) a rejestem COMPARE ustalisz sobie wrtosc PWM 0-100% (nie pisze nazw rejestrow, bo jest kilka mozliwosci pracy w Fast PWM)

Tez o tym myslalem jednak wzor na czestotliwosci OCR2 wprowadzil mnie w watpliwosci bo wynosi on np: (strona 112)

f = fclk_I/O / (N*256);

no i z koro u mnie :

f=40KHz fclk_I/0 = 8HHz

no to jedyny parametr do zmiany to N, a zeby otrzymac na wyjsci f=40KHz to po podstawieniu danych N=0,78...A wiec chyba nie da sie tego uzyskac ? bo najlizsza wartosc N (jako pleskaler) to jeden.

Pozdrawiam, Rafal k.

[...]

Mi wychodzi 10.24 MHz...

8/10.24 = 0.78... Czyżby przypadek? ;-P [...]

Ano uC taktuje z wewnetrznego kwarcu 8MHz (ale zawsze moge wlutowac zewnetrzny) a preskaler jest dowolny...Tzn w calosci projektu tzn dla TCNT1 i TCNT1 sotsuje pleskaler=1 ale jako ze kazdy timer mozna taktowac dowolnie to jesli chodzio TCNT2 to jeszcze nie wybralem i z tad dowolnie.

Pozdarwiam, Rafal kula

Jesli chodzi o FastPWM to prosze zobacz do mojego przedostatniego postu w tym watku tzn przed odpowiedzia RoMana Mandziejewicza, gdzie wlasnie opisuje w czym mam problem odniesnie tego trybu..bo moim zdaniem we wzorze na foc2PWM jest za malo danych do zmiany przez co nie da sie dokladnie uzyskac chcianych foc2PWM mam racje?

Pozdarwiam, Rafal k

U¿ytkownik "ToR" <ToR snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

no czytalem

dziwi mnie tylko ze CTC jest dla twojego przypadku gorsze od PWM skoro masz miec przebieg o wype³nieniu 50% (którys kolega napisa³)

ja bym ustawi³ CTC z negacja wyjscia wpisa³ do OCR wartosc odpowiadajaca pó³ wartosci przebiegu i tyle

OCRXX = 100 tyle taktów zegara 8MHz da Ci na wyjsciu OCRXX 40kHz o wype³nieniu 50%

AzaZeL

No to czy ma byc tak:

...

TIMSK = (1<<OCIE2)|(1<<TOIE2); OCR2 = 100; // CZY 50???

TCCR2 = (1<<WGM21)|(1<<CS20)|(1<<COM20);//ustawnie trybu CTC // pleskalera na "1" ,and Toggle Oc2 On Compare Match

// z tego co mowisz zmiast (1<<COM20) mam dac (1<<COM21)? ale czy wtedy OC2 samo ustawi sie na jedynke po dwoch zliczeniach TCNCT2? Bo COM21 oznacza czyszczenie po porownaniu no i jak potem jak samo nie ustawi sie na "1" to nie bedzie zmiany stanu...

Hmm z jakiego wzoru korzystales bo mi wychyszlo:

OCR2 = (8Mhz/ 80KHz) -1; (str.109 ,PDF)

Sorry ze tak mecze ;),ale bardzo zalezy mi zna poprawnym zrozumienu...

Pozdrawiam, Rafal k.

potrzebne Ci przerwanie czy to ma chodzic samopas?

no 100 -1 :) wed³ug pdf

wed³ug pdf

zmiana stany wyjscia OCXX na przeciwny czyli co 2 zmiany bedzie ustawiane co dwie kasowane

no dokladnie

ja mam w ten sposób zrobiona modulacje do pilota IR tylko ze 36kHz wiec pó³ okresu to 1 / 72 kHz

ustawiles pin OCXX jako wyjscie? jak nie to ustaw

po to grupa jest tylko mnie zastanawia czy ty to sprawdzasz co ludzie Ci pisza?

AzaZeL

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required