Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

konfiguracja wypełniania pwm w 18F2550

pedrus 04 Lis 2009 15:51 1338 2
  • #1 04 Lis 2009 15:51
    pedrus
    Poziom 10  

    Witam wszystkich na początek, to mój pierwszy post ;)

    W moim projekcie używam mikrokontrolera 18F2550. Potrzebuję generować sygnał PWM o częstotliwości 5kHz i o zmiennym wypełnieniu. Korzystając z dokumentacji udostępnianej przez Microchipa nie potrafię wytłumaczyć sobie jak konfigurować rejestry odpowiedzialne za wypełnienie. Wzory są znane i powtarzane w wielu publikacjach. Przytaczam przykład od microchipa - PWM o częstotliwości 20kHz i wypełnieniu 50%, oscylator 20MHz:


    Step #1: Choose Timer2 Prescaler:

    a) Fpwm = Fosc/((PR2+1)*4*prescaler) = 19531 Hz for PR2 = 255 and prescaler of 1.

    b) This frequency is lower than 20 kHz, therefore a prescaler of 1 is adequate.

    Step #2: Calculate PR2:

    PR2 = Fosc/(Fp w m*4*prescaler) – 1 = 249

    Step #3: Determine CCPR1L and CCP1CON<5:4>:

    a) CCPR1L:CCP1CON<5:4> = DutyCycle*0x3FF = 0x1FF

    b) CCPR1L = 0x1FF >> 2 = 0x7F,
    CCP1CON<5:4> = 3

    Step #4: Confgure CCP1CON

    The CCP module is confgured in PWM mode
    with the Least Signifcant bits of the duty cycle
    set, therefore, CCP1CON = ‘b001111000’


    I teraz moje pytania są następujące:
    1. Na jakiej podstawie wybieramy prescaler timera2?
    2. Skąd we wzorze wartość 0x3FF:
    CCPR1L:CCP1CON<5:4> = DutyCycle*0x3FF = 0x1FF

    Biorąc pod uwagę wzór podany w datasheecie 18F2550:
    (PWM Duty Cycle = (CCPRXL:CCPXCON<5:4>) x TOSC x (TMR2 Prescale Value))

    wychodzi na to, że 0x3FF to jest: Fosc/(TMR2 Prescale) co z powyższym przykładem się nie zgadza?

    0 2
  • Pomocny post
    #2 06 Lis 2009 22:34
    michh
    Poziom 11  

    Liczymy częstotliwość sygnału PWM:

    Fpwm = 1/PWM Period - częstotliwość PWM
    PWM Period = [(PR2) + 1] • 4 • TOSC • (TMR2 Prescale Value)

    PR2 - licznik TMR2 możesz wybrać wartość od 0 do 255
    TOSC - okres oscylatora 1/Xtal, Xtal - częstotliwość kwarcu
    TMR2 Prescale Value - preskaler licznika TMR2, wartości jaki możesz wybrać 1, 4, 16

    Musisz wybrać dwie wartości PR2 i TMR2 preskaler, resztę wartości znasz.

    Liczymy czas stanu wysokiego na wyjsciu:

    PWM Duty Cycle = (CCPRXL:CCPXCON<5:4>) • TOSC • (TMR2 Prescale Value)

    Część rzeczy się powtarza, podstawiasz wartość "TMR2 Prescale Value" wybraną wcześniej. CCPRXL - 8 starszych bitów dla wypełnienia, i daw młodsze w rejestrze CCPXCON, bity 5 i 4. Ponieważ PWM jest 10bitowy.

    Może jakiś przykład.
    Liczymy częstotliwość:

    TOSC = 0.25us
    Fpwm = 1kHz
    PWM Period = 1/1kHz = 1000us
    Wypełnienie = 50% czyli PWM Duty Cycle = 500us
    [(PR2) + 1] • (TMR2 Prescale Value) = PWM Period/(4 • TOSC) = 1000us/(4 • 0.25us ) = 1000

    Wybieramy np. TMR2 Prescale Value = 4, PR2 = 249

    Teraz liczymy wypełnienie:
    CCPRXL:CCPXCON<5:4> = PWM Duty Cycle/( TOSC • (TMR2 Prescale Value)) = 500us/(0.25us • 4) = 500

    500 w zapisie binarnym to 111110100, czyli CCPRXL = 1111101(osiem starszych bitów) a CCPXCON<5:4> = 00 (dwa młodsze bity)

    0
  • #3 10 Lis 2009 13:58
    pedrus
    Poziom 10  

    OK, dzięki wielkie... ;)

    To co mnie zbijało z tropu to to, że PWM Duty Cycle należy podać w jednostkach czasu. Jakoś nie wydawało mi się to oczywiste. Może dlatego, że mam doświadczenie jedynie z różnymi pochodnymi '51.

    0