WiringPi の SoftPWM機能

WiringPi の SoftPWM機能

Raspberry PI でPWM機能を使えるのは
GPIO18だけだけど
SoftPWM() を使うことで
ソフトウェアでON/OFF させることで
擬似的に他のGPIOポートでPWMを行える

ただし、あくまで擬似的なので
実際に出力されるパルス幅が安定しないし
CPUに負荷がかかるとパルス幅がずれる

LEDを光らせる程度ならわからないレベルのずれ

正確に制御するならGPIO18で制御することになる

試しに
まず

1
sudo shutdown -h now

で電源を切って配列を変える

+のほうをGPIO4に接続
そして抵抗を270Ωでつけて
LEDの+になるアノードにつなげる

そして
-になるカノードを
GPIOのGNDに接続

これで制御してみる

今回使う WiringPi のメソッドは
wiringPiSetupGpio()
wiringPi の初期化

softPwmCreate(GPIOポート番号, 初期値, 最大値)
初期値はPWMの初期値
LEDとかなら0にする
最大値はパルス幅の最大値で
定数にしておくとメンテしやすい

softPwmWrite(GPIOポート番号, 値)
値は0から設定した最大値になる
これも最大値を定数にするとメンテが楽

基本的には PWM のときのソースと変わらないので

1
cp pwm_led.c soft_pwm.c

でコピーして改造する

まず、ポートを変えるので

1
#define LED_PORT 18

1
#define LED_PORT 4

次に softPwmCreate() でポートや初期値
最大値を設定するので

1
2
//GPIO 18 を PWM
pinMode(LED_PORT, PWM_OUTPUT);

1
2
//softPWM設定
softPwmCreate(LED_PORT,0,RANGE);

さらに定数を宣言しておく

1
#define RANGE 100

次に、繰り返す幅も変えるので

1
for(pw=0;pw<1024;pw++){

1
for(pw=0;pw<RANGE;pw++){

にして

1
for(pw=1023;pw>=0;pw--){

1
for(pw=RANGE;pw>=0;pw--){

にする

値の変更がsoftPwm を使うので

1
pwmWrite(LED_PORT,pw);

1
softPwmWrite(LED_PORT,pw);

に変える

そして待ち時間も変更
現在は 0.3ms なので
3ms にする

1
delayMicroseconds(300);

1
delay(3);

に書き換える

ここまでできたら

1
cc -o softpwm soft_pwm.c -lwiringPi

でコンパイルして

1
sudo ./softpwm

とすると
GPIO4でも PWMが行えることが確認できる

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です