[KL25Z] PWM - miganie diodą

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla ARM Freescale.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

[KL25Z] PWM - miganie diodą

Postautor: Antystatyczny » niedziela 24 kwie 2016, 10:53

Witam serdecznie

Dziś prezentuję prosty przykład regulacji jasności świecenia diody przy pomocy timera skonfigurowanego do pracy w trybie PWM. Konkretnie jest to tryb PWM, w którym licznik zlicza cały czas w górę. Dioda LED na freedomce sterowana jest od strony masy, więc "set on compare" wyłacza diodę, a "clear on reload" ją zaświeca. Sposób sterowania wyjściem kanału można ustawić dowolnie, a ten tryb wybrałem, by podczas wpisywania nowej wartości pwm nie było widać przypadkowych rozbłysków. Można by spróbować wpisywać nową wartość pwm w przerwaniu wywoływanym przepełnieniem, ale w dokumentacji możemy przeczytać, iż nie jest to najlepsza praktyka (Kinetis L Peripheral Module Quick Reference str.129).
Użycie przerwania powoduje utratę jednego okresu tzn. w momencie wpisania nowej wartości PWM w przerwaniu, jeden okres zostanie wygenerowany jeszcze ze starą wartością. No dobra, a teraz kod. Jak zwykle komentarze są wewnątrz, ale w razie czego proszę pytać.

Tak wygląda funkcja main() (płynne rozjaśnianie i przyciemnianie niebieskiej diody):

Kod: Zaznacz cały

int main(void)
{
   /* 1ms tick */
   SysTick_Config(SystemCoreClock/1000);
   gpioInit();
   TPM0Config();

    while (true)
    {
       /* load new pwm value */
       TPM0->CONTROLS[1].CnV = 65535u - gammaB[(pwm)];

       if(dir == pwmUp)
       {
          if(pwm <  PWM_MAX )
          {
             pwm++ ;
          }
          else
          {
             dir = 0;
          }
       }
       /* pwmDown */
       else
       {
          if(pwm > PWM_MIN )
          {
             pwm--;
          }
          else
          {
             dir = 1;
          }
       }
       delay_ms(1);
    }
}


A tutaj kompletny projekt:

KL25Z_pwmled_gnu90.zip



Pozdrawiam
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Wróć do „Programowanie ARM Freescale w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość