Skocz do zawartości

[C][Atmega32] Zwiekszanie częstotliwości PWM


Pomocna odpowiedź

Napisano

Witam!

Mam pytanie, czy dysponuje ktoś może kawałkiem kodu w C, który pozwoli na zwiększenie wypełnienia PWM od np 15 % do 100 % w przeciągu np. sekundy bądź dwóch. Przeszukałem kawałek internetu ale nie znalazłem.

Można to zrobić bardzo prosto np. korzystając z trybu poprawnej fazy i korekcji częstotliwości wpisując do rejestru ICRx wartość obliczoną ze wzoru:

f=fclk/(N*(1+ICRx)) gdzie f to częstotliwość PWM, fclk - częstotliwość taktowania,N- preskaler możemy prawie dowolnie zmieniać częstotliwość praktycznie w każdej chwili. Wadą PWM w ATmega jest to, że rozdzielczość PWM jest zależna od wartości rejestru ICRx i można ją obliczyć ze wzoru: R=log(ICRx+1)/log(2) dlatego przy zmianie częstotliwości aby uzyskać te same wypełnienie PWM należy odpowiednio przeskalować wartość w rejestrze OCRxx.

  • Lubię! 1
A co za problem napisać pętlę, w której jakaś zmienna jest zwiększana, a jej wartość przepisywana do odpowiedniego rejestru?

Nie ma prostrzego sposobu.

Ja nazwę tylko rzecz po imieniu. To co chcesz zrobić, jest to filtr sygnałów wejściowych i pod taką nazwą powinieneś szukać. Ja proponuję tak zrobić w przerwaniu:

#define stała wartosc_zadana/1000 //czyli po tysiącu przerwan będzie wartosc max
if(wyjscie_pwm<wartosc_zadana)
wyjscie_pwm += stała;

Jeżeli nie chcesz przerwania to użyj delaya przed ifem i sprawa rozwiązana.

Jest to filtr który powoduje narastanie liniowe.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...