WiringPi の SoftPWM機能

WiringPi の SoftPWM機能

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

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

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

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

試しに
まず

sudo shutdown -h now

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

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

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

これで制御してみる

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

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

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

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

cp pwm_led.c soft_pwm.c

でコピーして改造する

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

#define LED_PORT 18

#define LED_PORT 4

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

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

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

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

#define RANGE 100

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

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

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

にして

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

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

にする

値の変更がsoftPwm を使うので

pwmWrite(LED_PORT,pw);

softPwmWrite(LED_PORT,pw);

に変える

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

 delayMicroseconds(300);

 delay(3);

に書き換える

ここまでできたら

cc -o softpwm soft_pwm.c -lwiringPi

でコンパイルして

sudo ./softpwm 

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

コメントを残す

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