PWM WiringPi

W raspberry sprzętowe PWM'y są tylko dwa. Pierwszy jest podłączony do wyjścia audio, a drugi można wykorzystać do swoich projektów. Z reguły do stworzenia własnego robota wykorzystuje się dwóch silników, dlatego dobrze mieć także 2 PWM. W tym celu możemy programowo stworzyć PWM. Na stronie https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/ można znaleźć bibliotekę wiringpi, która potrafi stworzyć taki PWM na każdym pinie.

W tym artykule pokaże jak dostać się do sprzętowego PWM który jest na GPIO1, czyli 18 pin. Programowy PWM otrzymać można dodając bibliotekę #include <softPwm.h>. Następnie wystarczy zamienić pinMode (1, PWM_OUTPUT) ; na softPwmCreate(1,0,100); gdzie 1 to numer pinu w bibliotece WiringPi, a 100 to podziałka dla PWM. Mając już zadeklarowny pin wystawiamy sygnał PWM poleceniem softPwmWrite(1,55); gdzie 1 to numer pinu, a 55 to wypełnienie PWM. W następnym artykule będę używał już tylko PWM programowego, więc jak nie załapaliście, to rozjaśni się wam w następnym artykule.

Ściągnijmy sobie przykładowy program ze strony drogona. Oczywiście przykładowe przykłady są także w katalogu wiringPi. Stwórzmy sobie plik pwm.c i wpiszmy tam kod:

/*
 * test2.c:
 *      Simple test program to test the wiringPi functions
 *      PWM test
 */

#include <wiringPi.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main (void)
{
 int pin ;
 int l ;

 printf ("Raspberry Pi wiringPi PWM test program\n") ;

 if (wiringPiSetup () == -1)
 exit (1) ;

 for (pin = 0 ; pin < 8 ; ++pin)
 {
 pinMode (pin, OUTPUT) ;
 digitalWrite (pin, LOW) ;
 }

 pinMode (1, PWM_OUTPUT) ;

 for (;;)
 {
 for (l = 0 ; l < 1024 ; ++l)
 {
 pwmWrite (1, l) ;
 delay (1) ;
 }

 for (l = 1023 ; l >= 0 ; --l)
 {
 pwmWrite (1, l) ;
 delay (1) ;
 }
 }

 return 0 ;
}

teraz skompilujmy to za pomocą polecenia:

cc -o myprog myprog.c -lwiringPi -lpthread

Aby uruchomić i odpalić program należy wykonać następujące czynności:

Oczywiście program wykonuje działanie, ale żeby to zaobserwować musimy podłączyć diodę do pinu 1. Czyli tak jak na obrazku: