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

[Mega32][C] PWM Phase and Frequency Correct - czemu czest/2

Pawel_Piatek 06 Lip 2008 22:29 1486 3
REKLAMA
  • #1 5318292
    Pawel_Piatek
    Poziom 11  
    Witam serdecznie.

    Pisze programik do sterowanie silnikiem krokowym. Sterowanie odbywa sie przez driver z wejściami STEP i DIR. Do generowania impulsów na wejściu STEP drivera używam Timera1 w trybie Phase and Frequency Correct w którym wartością TOP jest wartość przechowywana w rejestrze OCR1A (bity WGM13:0 = 9). Mój przypadek polega na tym że częstotliwość jaką otrzymuje na wyjściu OC1A jest dokładnie 2 razy mniejsza niż wynika z moich obliczeń. Kwarc ma 16MHz i procek nie jest ustawiony na wewnętrzne 8MHz.

    	
    	TCCR1A |= (1<<WGM10);
    	TCCR1B |= (1<<WGM13)|(1<<CS12)|(1<<CS10); //preskaler 1024
    	
    	OCR1A = 78;
    	TCCR1A |= (1<<COM1A0);
    

    Według powyższego powinienem uzyskać częstotliwość 100Hz bo

    16Mhz/(1024(preskaler) * 2 (bo licznik liczy w gore a potem w doł) * 78 (wartosc TOP z OCR1A))

    daje ok. 100Hz. Tymczasem na wyjściu OC1A mam 50Hz. W zasadzie problem jest rozwiązany bo wpisuje po prostu 2 razy mniejsza wartość do OCR1A ale zastanawia mnie jaka jest przyczyna takiego stanu rzeczy. Czy ktoś ma podobne doświadczenia czy ja czegoś nie zrozumiałem z dokumentacji czy może jest w niej jakiś błąd?

    Pozdrawiam
  • REKLAMA
  • #2 5318905
    Ch.M.
    Poziom 27  
    Twoje wpisy do rejestrów wyglądają poprawnie. Te 50Hz to zmieryłeś, czy symulator tyle pokazuje?
    Jeśli symulator to się tym mocno nie przejmuj - on tak juz ma, że często się myli. Jeśli fizycznie coś jest nie tak z PWM to sprawdź program pod kątem przeprogramowywania rejestru OCR1A ewentualnie sprawdź czy ten sam problem dotyczy generacji z wykorzystaniem ICR1 jako TOP.
    Pozdro
  • REKLAMA
  • #4 5322001
    Pawel_Piatek
    Poziom 11  
    Przebieg PWM jest zmierzony miernikiem. Po zmianie trybu na taki że w rejestrze ICR1 jest wartość TOP oraz ustawieniu dodatkowo bitu COM1A1 częstotliwość zgadza się z tym jaką chciałbym uzyskać.

    Co do tabeli 46 i prawie poprawności wpisów to wygląda to tak że ten tryb działania pinu OC1A jest jedynym poprawnym. Otóż miałem problem z uruchomieniem PWM'a właśnie przez to że wybrałem inny tryb pracy pinu OC1A i nie pojawiał sie na nim żaden przebieg - miałem ustawiony bit COM1A1 zamiast COM1A0 i wydaje mi się że w ostatnim trybie wyglądałoby podobnie. A co do tego że stan końcówki jest przełączany przy każdym zdarzeniu porównania to cóż... właśnie zrozumiałem dlaczego tak jest z tą częstotliwością. Pisząc już poprzedniego posta pomyślałem że może to mieć coś wspólnego z przełączaniem stanu końcówki zamiast ustawiania go przy liczeniu w górę i kasowaniu przy liczeniu w dół (lub na odwrót) ale zasugerowałem się wykresami z PDF'a z ilustracją sposobu działania tego PWM'a gdzie przy liczeniu w górę i w dół było zaznaczone zdarzenie OCR1A Compare Match ale pomyślałem że skoro jest ono 2 razy (raz przy liczeniu w górę a raz w dół) to i tak powinna być 2 razy większa częstotliwość. Tymczasem skoro w rejestrze OCR1A jest wartość TOP to zdarzenie porównania występuje tylko raz w każdym okresie pracy timera (w górę i w dół) przy zmianie kierunku zliczania a nie jak na wykresach raz kiedy liczy w górę i drugi raz kiedy liczy w dół. W takiej sytuacji wszystko będzie się już zgadzać.

    Dziękuje szczególnie ZbeeGin za ponowne skierowanie na właściwy tok myślenia. Niby sam prawie do tego wczoraj doszedłem ale jak widać czasami potrzebny jest ktoś inny żeby do końca coś zrozumieć.

    P.S. Wiem że mogłem już tyle nie pisać ale może dokładne wyjaśnienie takiego stanu rzeczy przyda się kolejnym osobą szukającym odpowiedzi na to pytanie.

    Pozdrawiam.
REKLAMA