Bogusław Kempny

PWM, modulacja szerokości impulsów

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 ....











No to jak to się robi. Potrzebujemy na przykład taki sygnał. Jedynka logiczna przez 2 milisekundy, co 10 milisekund:

Użyjemy, podobnie jak w innych przykładach biblioteki wiringPi. Na początek programowanie generatora PWM.

Funkcja

pwmSetMode (int mode) ;

programuje go w trybie mark:space lub balanced, jako parametr mode użyjemy odpowiednio PWM_MODE_MS lub PWM_MODE_BAL.

Tryb mark:space to tradycyjny sposób, sygnał/brak_sygnału. Balanced próbowałem zrozumieć czytając dokumentację Broadcom, ale się poddałem. Chyba nie jako jedyny. Jeśli kiedyś znajdę czas, douczę się o co w tym trybie balanced chodzi, wtedy napiszę.

Na razie użyjemy trybu mark:space.

Teraz sygnał zegara. Broadcom pisze, że kanały PWM taktowane są zegarem 100MHz. W Raspberry, jak wynika z moich pomiarów jest to 19,2MHz. Też jeszcze nie wiem, dlaczego. Częstotliwość tę zmienić możemy funkcją

pwmSetClock (int divisor) ;

Parametr divisor to wartość, przez jaką zostanie podzielona bazowa częstotliwość zegara.

Jeśli użyjemy wartości 192 otrzymamy zegar 100kHz, jeśli 1920, to 10kHz itd.

10kHz to impuls co 0,1ms, jeśli tego dzielnika użyjemy, z taką dokładnością będziemy mogli programować nasz generator.