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 ....











Pierwszy test.

Program pwm1.c i skrypt do jego kompilacji cpwm1

Wygenerujemy sygnały o okresie 10 ms i wypełnieniu 10%, 20% ... 90%, każdy z nich będzie trwał 3 sekundy. Sygnał możemy obserwować programem markspace, albo podłączyć diodę LED pomiędzy piny 1 (według wiringPI, czyli 12 fizyczny pin łączówki GPIO) i masę, na przykład 6 fizyczny pin łączówki GPIO.

Dioda po każdych 3 sekundach będzie świeciła jaśniej.

Na początek programujemy kanał PWM0.

Pin 1 (według wiringPi, fizycznie będzie to pin 12) ustawiamy w tryb pwm:

       pinMode(1, PWM_OUTPUT);
Programujemy tryb mark:space generatora pwm:
       pwmSetMode(PWM_MODE_MS);
Ustawiamy dzielnik zegara 1920, jeden takt będzie trwał 0,1 ms:
       pwmSetClock(1920);
Programujemy okres sygnału, 100 * 0,1 = 10ms:
       pwmSetRange(100);
Uruchamiamy generator na pinie 1, 10% wypełnienia, czyli jedynka przez 1 ms. Dla kontroli wyświetlamy informację o czasie trwania jedynki logicznej. Pamiętamy, że jeden takt naszego zegara to 0,1 ms, więc potrzebujemy 10 taktów, żeby uzyskać 10 ms:
       printf("1 ms\r");fflush(0);
       pwmWrite(1,10);
       sleep(3);
Po 3 sekundach zmieniamy wypełnienie na 20%, impuls 2 ms:
       printf("2 ms\r");fflush(0);
       pwmWrite(1,20);
       sleep(3); 
I tak kolejno co 1 ms aż do 9 ms.

Warto zwrócić uwagę, że po skończeniu pracy naszego programu sygnał pwm nie zniknie, na pinie 1 pozostanie, 10 milisekund, z wypełnieniem 90%, takim, jak go ostatnio zaprogramowaliśmy.