Strona 1 z 1

[KL25Z] PWM - miganie diodą

: niedziela 24 kwie 2016, 10:53
autor: Antystatyczny
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