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











Teraz program sterujący trzema urządzeniami pwm. Jak to zrobić mając tylko dwa kanały pwm?

Da się, choć sterowanie nie będzie całkowicie niezależne. Dwa urządzenia muszą działać naprzemiennie, nigdy oba w tym samym czasie, na przykład sygnalizator normalnej pracy i sygnalizator awarii. Inny przypadek to dwa urządzenia które wymagają sterowania takim samym sygnałem, na przykład sygnalizator wewnątrz budynku i sygnalizator na zewnątrz.

W prosty sposób można rozbudować ten przykład do czterech urządzeń, pamiętając o wspomnianych wyżej ograniczeniach.

Program, jak poprzednio, pwm2.c i skrypt do jego kompilacji cpwm2

Programujemy pwm, sygnał będziemy pobierać z pinów 1, 23 i 24 (numeracja wiringPi, nie BCM).

Na pinach 23 i 24 będzie taki sam sygnał, to jeden kanał, PWM1:

       pinMode(1, PWM_OUTPUT);
       pinMode(23, PWM_OUTPUT);
       pinMode(24, PWM_OUTPUT);
       pwmSetMode(PWM_MODE_MS);
       pwmSetClock(1920);
       pwmSetRange(200);
Teraz generujemy na pinach 1, 23 i 24 sygnały, z dwu różnych kanałów:
       printf("Aktywne piny 1, 23 i 24\n");fflush(0);
       for(i=0;i<2;i++)
         {
          pwmWrite(1,5);
          pwmWrite(23,15);
          sleep(1);
          pwmWrite(1,25);
          pwmWrite(23,20);
          sleep(1);
         }
Wyłączamy pwm na pinie 24, aktywne będą tylko urządzenia podpięte do pinów 1 i 23:
       printf("Aktywne piny 1 i 23\n");fflush(0);
       for(i=0;i<2;i++)
         {
       pinMode(24, OUTPUT);
          pwmWrite(1,5);
          pwmWrite(23,15);
          sleep(1);
          pwmWrite(1,25);
          pwmWrite(23,20);
          sleep(1);
         }
Włączamy pwm na pinie 24. Niestety musimy ponownie zaprogramować generator:
       printf("Aktywne piny 1, 23 i 24\n");fflush(0);
       pinMode(24, PWM_OUTPUT);
       pwmSetMode(PWM_MODE_MS);
       pwmSetClock(1920);
       pwmSetRange(200);

       for(i=0;i<2;i++)
         {
          pwmWrite(1,5);
          pwmWrite(23,15);
          sleep(1);
          pwmWrite(1,25);
          pwmWrite(23,20);
          sleep(1);
         }
Urządzenia podpięte do alternatywnych pinów tego samego kanału mogą działać naprzemiennie, z różnymi sygnałami, równocześnie, sterowane tym samym sygnałem, albo być selektywnie włączane lub wyłączane, wystarczy przeprogramowanie trybu pracy pinu.