Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32] ARM Cortex - szybkozmienny sygnal PWM

hardtmuth 13 Jan 2010 18:28 3761 6
Computer Controls
  • #1
    hardtmuth
    Level 20  
    W jaki sposob najprosciej i najmniejszym nakladem kodu szybko aktualizowac okres trwania sygnalu PWM?

    inicjalizacja tak wyglada:

    Code:

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    /* Time base configuration */
       TIM_TimeBaseStructure.TIM_Period = 999;
       TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    /* PWM1 Mode configuration: Channel1 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = PWM1_Val;// potem zamien na strukture
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

       TIM_OC1Init(TIM4, &TIM_OCInitStructure);

       TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel2 */
       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
       TIM_OCInitStructure.TIM_Pulse = PWM2_Val; // potem zamien na strukture
       TIM_OC2Init(TIM4, &TIM_OCInitStructure);
       TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

       TIM_ARRPreloadConfig(TIM4, ENABLE);
    /* TIM4 enable counter */
       TIM_Cmd(TIM4, ENABLE);
    }


    Czy mam co kazda zmiane wartosci od nowa generowac te struktury i wykonywac dziesiatki polecen. Czy wystarczy wpis wartosci do ktoregos z rejestrow i sygnal pwm zmieni swoja wartosc?

    EDIT: Oczywiscie mialo byc wsp wypelnienia, a nie okres...
  • Computer Controls
  • #2
    lucas_mcs
    Level 22  
    W wypadku korzystania z biblioteki stma trzeba każdorazowo pisać strukturę i ją inicjować (koniecznie).

    Jeśli chcesz robić pewne rzeczy efektywniej to warto zajrzeć do wnętrza biblioteki lub wczytać się w dokumentację i korzystać z odpowiednich rejestrów.

    Biblioteka generalie skupia się na czytelności kodu a struktury są zrobione z założenia ze "inicjuje się tylko raz"

    Nie pamiętam dokładnie ale niektóre działy (dokumentacja biblioteki) miały opisane funkcje modyfikujące parametry, jednak nie powiem ci czy to dotyczy timerów.

    Dokładniej mogę napisać jutro
  • Computer Controls
  • #3
    hardtmuth
    Level 20  
    Rozwiazanie znalezione.

    Po wstepnych testach wyglada, ze PWM chodzi prawidlowo.

    Wystarczy wpisac wartosc do rejestru TIMx->CCRx z wartoscia wsp wypelnienia.

    Gdzie TIMx to odpowiedni timer.
    CCRx - to odpowiedni wykorzystywanych kanal.

    Temat do zamkniecia.
  • #4
    Kabuto15
    Level 19  
    Jeśli się mogę jeszcze wtrącić, to okres PWM a wypełnienie to dwie różne rzeczy. Ma to znaczenie np. przy zadawaniu sygnałów referencyjnych.
    Zmieniając rejestr CCRx wprowadzasz jedynie wartość do porównania dla PWMa, a jego okres jest taki jak w zainicjalizowanej strukturze.
    Jedynym sposobem zmiany okresu jest reinicjalizacja danego timera.
  • #6
    hardtmuth
    Level 20  
    Wiem, ze zmieniam wsp wypelnienia i na tym mi zalezalo. Czestotliwosc pracy na tym etapie nie ma dla mnie duzego znaczenia.

    Biblioteka odmozdza, ale tez czesto upraszcza wiele spraw;)
  • #7
    kedzi1
    Level 18  
    Jeżeli mogę wtrącić swoje trzy grosze i coś jeszcze zasugerować to jeżeli PWM ma się zmieniać szybko i nie obciążać procesora to można zadanie uaktualniania wartości wypełnienia powierzyć DMA.