ATmega32, TIMER1, PWM i problem :-)

Oct 02, 2004 10 Replies

Witam Walczę z następujacym problemem. Potrzebuję wygenerować ciąg imulsów o regulowanym czasie trwania (w przykładzie 10ms) i stałej przerwie 0,1ms. Wykombinowałem sobie, że wręcz idealne do tego będzie PWM. Z tego co wyczytałem z pdf-a to TIMER1 w trybie WGM13=15 działa w następujący sposób:



  1. TCNT1 liczy w górę
  2. gdy TCNT1 = ORC1B następuje ustawienie wyjścia OC1B
  3. gdy TCNT1 = OCR1A następuje zerowanie TCNT1 i oczywiście skasowanie wyjscia OC1B
  4. GOTO 1 :-)

niestety taki fragment kodu odpala TIMER1 w trybie PWM-10bit i licznik liczy se w górę i w dół, w górę i w dół... jak na typowe PWM przystało (przynajmniej tak pokazuje VMLAB3.10 i AVR-Studio4), a wartość OCR1A jest w tym przypadku bez znaczenia.



OCR1A = 10000; // czas impulsu (zmienny) OCR1B = 100; // czas przerwy (stały) TCCR1A = (1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10); TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS11); // CK/8 OSC=8MHz



Czy ktoś z Szanownych Grupowiczów wie jak to ugryźć ? czy źle zintrerpretowałem dokumentację...


Sat, 02 Oct 2004 13:45:40 +0200, na pl.misc.elektronika, Grzegorz Kurczyk napisał(a):

Może lepiej weź zwykłe CTC. W przerwaniu będziesz przestawiać na przemian

0,1ms i zadaną wartość a wyjście OC1A ustawisz na toggle.

Użytkownik Jurek Szczesiul napisał:

Witam

Tak to już kombinowałem i chyba to jedyne rozwiązanie. Myślałem, że można to zrobić bardziej elegancko :) Druga metoda, którą przećwiczyłem to tryb CTC i obsuga przerwań SIG_OUTPUT_COMPARE1A i SIG_OUTPUT_COMPARE1B. Niestety takie rozwiązanie odpada w związku z brakiem wielopoziomowych przerwań w AVR-ach :-( Procek oprócz generowania tych impulsów będzie miał jeszcze trochę do roboty (konwersja A/D na przerwaniach i obsługa szeregówki) i jak będzie zajęty np obsługą RS-a, to nie przyjmie krytycznego czasowo przerwania. Wykona je dopiero po zakończeniu bieżącej obsługi co powoduje niedopuszczalne przedłużenie impulsu. Swoją drogą AVR-ki mogły by mieć przerwania wielopoziomowe. W algorytmach sterowania często zachodzi potrzeba natychmiastowej i bezwarunkowej obsługi jakiegoś zdarzenie. Z tego wszystkiego dziwi mnie tylko, że ustawianie/kasowanie bitu WGM13 w TCCR1B kompletnie nic nie zmienia !!! Przynajmniej na symulatorach nie zauważyłem żadnej różnicy w zachowaniu się TIMER'a1

P.S. Mały Tiny15 ma PWM-kę działającą dokładnie tak jak mi trzeba, tyle że 8-mio bitową :(

Sat, 02 Oct 2004 17:08:32 +0200, na pl.misc.elektronika, Grzegorz Kurczyk napisał(a):

Czy ja wiem ? IMHO mało prawdodpodobne. Nawet przy 0,1 ms będzie 800 cykli zegara do dyspozycji żeby przeładować TOP timera. To jest właśnie fajne w CTC że nie jest zbyt krytyczne. Albo jeszcze inaczej : niech licznik sobie chodzi jako CTC ale z czasem (impuls + 0,1 ms), więc na zmianę długości bedzie dużo czasu. Natomiast dodatkowo ustawisz porównanie na OCR1B = 0,1 ms z przełączaniem wyjścia OC1B. W efekcie na OC1B wyjdą impulsy 0,1 ms co (0,1+nastawiany ) czyli to samo co ma być - tylko polaryzacje trzeba podobierać. Da się tak ? bo dokładnie się nie przyglądałem.

Fakt, to dość wnerwiająca wada. Niby można kombinować z programowym włączaniem przerwań w handlerze ale jakoś to wygląda na źródło większych kłopotów niż pożytku ;-)

Witam,

Ostatnio pope³ni³em serwokontroler w³a¶nie na COMPARE1A i COMPARE1B (ATmega8). Serwa modelarskie steruje siê impulsami od 0,5ms do 2,5ms mniej wiêcej, powtarzanymi co 20ms. Kontroler obs³uguje razem 16 serw i jest sterowany z RSa. Nie zauwa¿y³em ¿adnych niechcianych wahañ impulsów, ani drgañ serw. A serwa s± wra¿liwe, bo nawet zastosowanie w kontrolerze wewnêtrznego czasomierza RC zamiast kwarcu powoduje zauwa¿alne wibracje. Mo¿e jednak ten sposób jest dobry wbrew wszelkim obawom.

Pozdrawiam, Marcin Sommer

formatting link

Sat, 2 Oct 2004 18:16:48 +0200, na pl.misc.elektronika, Jurek Szczesiul napisał(a):

E, za dobrze by było ;-) Owszem, jeszcze z przełączaniem OC1A i brameczką exor na OC1A OC1B

Użytkownik Jurek Szczesiul napisał:

Hehe dokładnie na to samo wpadłem :)

Tak przy okazji dalszego drążenia problemu. Czy ktoś wie do czego służą bity FOC1A i FOC1B w rejestrze TCCR1A ? bo jakoś nie do końca mogę zrozumiec opisu w pdf-ie (str.106). Kombinowałem z nimi pod VMLAB-em, ale jakoś ni odkryłem sposobu ich działania. I dalej nie wiem czemu "nie działa" bit WGM13 w rejestrze TCCR1B ?

Sat, 02 Oct 2004 19:35:34 +0200, na pl.misc.elektronika, Grzegorz Kurczyk napisał(a):

Wygląda, że wpisując 1 można natychmiastowo wyzwolić reakcję OC1x przypisaną 'compare match' - ale tylko w niektórych konfiguracjach

Pewnie w realnej kostce zadziała. Nie wiem jak VM ale AvrStudio ma sporo takich rozmaitych niedoróbek.

Użytkownik Jurek Szczesiul napisał:

Huraaaa da się i to bez brameczki :-))) Metoda sprzętowo/programowa oparta o togglownicę w trybie CTC. Zbocza generowane sprzętowo (więc dokładnie), a czasy zmieniane programowo. Oto działajacy przykład:

/******************************/

SIGNAL(SIG_OUTPUT_COMPARE1A) { if(bit_is_clear(PIND, 5)) OCR1A = 100; // czas przerwy 0,1ms else OCR1A = 23555; // czas impulsu (np 2355,5ms) }

int main(void) { OCR1A = 100; // 0,1ms TCCR1A = (1<<COM1A0); // Toggle OC1A TCCR1B = (1<<WGM12)|(1<<CS11); // Tryb CTC; CK/8 -> T=1us TIMSK = (1<<OCIE1A); // przerwania z OCR1A sei(); for(;;); }

/******************************/

zmianę polaryzacji uzyskujemy przez bit_is_set(PIND, 5) w warunku na początku SIGNAL(SIG_OUTPUT_COMPARE1A)

Dzięki Wszystkim za Burzę Mózgów. Problem rozwiązany. Troche na okrętkę ale skutecznie. O ile obsługa żadnego z innych przerwań nie będzie trwała ponad 0,1ms (w co absolutnie nie wierzę) to wsio budiet OK :)

Użytkownik Marcin Sommer napisał:

Hmmmm... to dziwne, bo w swoim nadajniku RC mam własnoręcznie wyrzeźbiony koder na ATtiny15, który jak wiadomo ma tylko wewnętrzny oscylator RC 1,6MHz. Przy dobrym skalibrowaniu oscylatora i wykorzystaniu TIMER'a1 w trybie PWM (który w tym procku wręcz idealnie nadaje się do tego celu - poza małą 8-bitową rozdzielczością) na wyjściu dostajemy wzorcowe impulsy do modulowania nadajnika. Na początku też kombinowałem metodą częściowo programową i miałem lekkie trzepotanie serw. W tiny15 rejestr OCR1A ma dodatkowy rejestr tymczasowy. Wpisujesz nową wartość bez specjalnych restrykcji czasowych, która dopiero po zakończeniu cyklu PWM jest przepisywana sprzętowo do OCR1A. Jedyny problem to niska rozdzielczość. Zakres od 1ms do 2ms podzielony jest na

100 "kroków". Troche to mało, ale podczas oblatywania modelu nie odczułem jakiejś szczególnej niedokładności sterowania. Dla typowego serwa wychodzi ok 0,9stopnia/krok.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required