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:
Pozdrawiam