logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PWM - czas trwania całego cyklu.

soulreaver1 27 Lut 2009 11:36 2062 6
REKLAMA
  • #1 6211397
    soulreaver1
    Poziom 21  
    Witam.

    Chciałbym obliczyć czas trwania całego cyklu PWM (nie wiem czy dobrze napisałem; chodzi mi o czas trawnia wszystkich kroków, czyli w tym przypadku od 0 do 255). Bardzo proszę o wytłumaczenie mi jakie obliczenia trzeba wykonać.

    oto mój kod (dla ATmega8):



    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define F_CPU		8000000 
    #define PWMout OCR2    //makro na OCR2
    
    int main(void)
    {
    int ipwm;               
    DDRB =0x00;            //portB jako wyjscie
    TCCR2 =0b01101001;     //fast PWM, non-inverted, bez preskalera
    TCNT2 =0x00;           //zainicjowanie licznika
    
    while(1)               //pętla nieskończona
    {
    	ipwm=0;
    	while (ipwm <= 255) 
    	{
    		PWMout = (ipwm++);
    		_delay_ms(5);    			
    	}
    	
        ipwm=255;
        while (ipwm >= 0) 
    	{
          PWMout= (ipwm--);
          _delay_ms(5); 
    	}  
    
      }  //koniec pętli nieskończonej			
    }
    
  • REKLAMA
  • Pomocny post
    #2 6211466
    Freddie Chopin
    Specjalista - Mikrokontrolery
    pomijajac juz to ze petle sa kiepsko napisane (po co ci zmienna int, skoro wystarczy char?), to predkosc tego kodu zalezna jest od optymalizacji. jedyny sposob - poza syzyfowym liczeniem czasu instrukcji assemblerowych - to symulator. tak czy siak nie ma to jednak specjalnego sensu, bo czas twoich instrukcji bedzie stanowil ulamek tego opoznienia 5ms, ktore masz w kazdej z petli.

    co do petli

    zmien typ ipwm na char, a warunki na takie, aby to mialo sens (czyli nie >= i <= tylko > lub <), a typ petli na do {} while(), dzieki czemu zrobisz wszystkie 256 mozliwych krokow.

    anyway - skoro chcesz wykonac okreslona ilosc krokow, z okreslonym przyrostem, to wlasnie po to jest funkcja for - wtedy ladniej to wyglada. w pierwszym for zrobisz kroki od 0 do 254, a w drugim od 255 do 1 - tym sposobem rowniez wykonasz wszystkie mozliwe kroki.

    4\/3!!
  • REKLAMA
  • #3 6211494
    soulreaver1
    Poziom 21  
    Dzięki, wszystkie twoje uwagi są dla mnie bardzo pomocne. Mógłbyś mi jeszcze wyjaśnić jak obliczyć czas trwania pojedynczego kroku?
  • #4 6211552
    Freddie Chopin
    Specjalista - Mikrokontrolery
    musialbys policzyc czas trwania instrukcji assemblerowych, co nie jest ani proste, ani przyjemne [; najprosciej uzyc symulatora wbudowanego w AVR Studio. A jeszcze prosciej - jesli nie budujesz zegara atomowego - olac to po prostu. Czas trwania kodu kontrolujacego petle i przypisujacego jakas wartosc do PWMout to sa pojedyncze mikrosekundy (na oko może 1-3us max). W porownaniu do nastepujacego po nich pięcio-milisekundowego opoznienia nie jest to nawet 1 promil tego czasu.

    4\/3!!
  • REKLAMA
  • #5 6211627
    soulreaver1
    Poziom 21  
    Chyba źle się wyraziłem (pewnie dlatego że jeszcze nie bardzo wiem o o co chodzi); Jeśli mam częstotliwość PWM = 5kHz i rozdzielczość 255, wypełnienie impulsu zwiększa się z każdym krokiem rozdzielczości, do wyprowadzenia PB3 uC mam podłączoną diodę LED to jaki jest czas do jej zaświecenia? (wystarczy mi dokładność w ms)
  • REKLAMA
  • #6 6211652
    Freddie Chopin
    Specjalista - Mikrokontrolery
    nie wiem o co pytasz... jeśli o to, kiedy zaczniesz widzieć, że dioda świeci, to jest to zależne od samej diody. jeśli zaś o to, kiedy zmiany w rejestrze wprowadzone zostaną "w życie" to natychmiastowo. pozatym twoja czestotliwosc PWM to 8M/256 = ~ 31kHz

    to wszystko naprawde opisane jest w datasheecie.

    4\/3!!
  • #7 6211703
    zumek
    Poziom 39  
    soulreaver1 napisał:

    
    //...
    DDRB =0x00;            //portB jako wyjscie
    TCCR2 =0b01101001;     //fast PWM, non-inverted, bez preskalera
    TCNT2 =0x00;           //zainicjowanie licznika
    //...


    Zastanów się przez chwilę nad tym fragmentem kodu i z ręką na sercu powiedz, czy te 3 instrukcje wykonują dokładnie to , co jest napisane w komentarzach do nich :?:
REKLAMA