Mufinek napisał(a):
Jednakże nie wiem w jaki sposób na wyjściach PB0 i PB1 uzyskuję sygnał około 300Hz. Jeżeli chodzi o sygnał PWM to także nie do końca "kumam" jak to działa.
Masz 2 zmienne globalne PWM_1 i PWM_2 - są to zmienne od których zależy wypełnienie PWM odpowiednio PWM_1 dla pinu PB0, PWM_2 dla pinu PB1.
Dodatkowo w obsłudze przerwania masz zmienną pwm_clock która działa jak licznik. Co każde wywołanie przerwania zmienna jest zwiększana o 1 a następnie porównywana z dwiema zmiennymi PWM_1 i PWM_2.
Dla skrócenia wywodu rozpatrzmy tylko jeden kanał PWM:
Jeżeli pwm_clock jest większa lub równa PWM_1 to na pinie PB0 ustawiany jest stan wysoki, jeżeli mniejsza to jest ustawiany stan 0. Czyli jak zmienna PWM_1 będzie równa 0 to będziesz miał pełne wypełnienie dodatnie, jeśli natomiast PWM_1 będzia miało wartość 255 to będzie minimalne wypełnienie.
Licznik pwm_clock w ciągu sekundy przelatuje z przepełnieniem 300 razy , stąd mówimy że PWM pracuje z częstotliwością 300Hz, z kolei same zmienne pwm_clock, PWM_1 i PWM_2 mogą przyjmować wartości od 0 do 255 w systemie binarnym możliwe do zapisania za pomocą 8 bitów, stąd mówimy że PWM ma rozdzielczość 8-bitową co oznacza że możemy ustawić 256 różnych wartości wypełnienia.
kicajek napisał(a):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powyższe warunki to taka odmiana if/else - jak warunek w pierwszym nawiasie spełniony wykonywany jest kod zaraz po znaku zapytanie do dwukropka, jeżeli jest niespołniony to wykonuje się kod od dwukropka do średnika.
Analogicznie druga linia jest dla drugiego kanału PWM.