HumansXドキュメントセンター 公式サイトへ ↗

3. PWM の応用 - 波形の観察

Hobot.GPIO ライブラリは、ハードウェア PWM コントローラーを備えたピンでのみ PWM に対応しています。RPi.GPIO ライブラリとは異なり、Hobot.GPIO ライブラリはソフトウェアによる PWM のエミュレーションを実装していません。

RDK X5 は 4 グループの PWM に対応しており、各グループ 2 チャネル、合計 8 チャネルの PWM 出力があります。下表をご参照ください。

PWM グループ PWM チャネル 40PIN ピン
PWM0 LSIO_PWM_OUT0 29
PWM0 LSIO_PWM_OUT1 31
PWM1 LSIO_PWM_OUT2 37
PWM1 LSIO_PWM_OUT3 24
PWM2 LSIO_PWM_OUT4 28
PWM2 LSIO_PWM_OUT5 27
PWM3 LSIO_PWM_OUT6 32
PWM3 LSIO_PWM_OUT7 33

RDK X5 ではデフォルトで PWM3 が有効になっています。srpi-config システム設定ツールで他の PWM グループを有効にすると、対応するピンが PWM 出力に切り替わります。設定は再起動後に有効になります。

3 Interface Options -> I3 Peripheral bus config を選択し、対応する pwm グループを選んで okay に切り替えます。

PWM チャネルの使い方の詳細は、/app/40pin_samples/simple_pwm.py をご参照ください。

テストコード

output_pin で指定した PWM チャネルを開き、初期デューティ比を 25% とします。0.25 秒ごとにデューティ比を 5% ずつ上げ、100% に達したら 0.25 秒ごとに 5% ずつ下げます。波形が正常に出力されている間、オシロスコープまたはロジックアナライザーで出力信号を測定し、波形を観察できます。

#!/usr/bin/env python3
import sys
import signal
import Hobot.GPIO as GPIO
import time

def signal_handler(signal, frame):
    sys.exit(0)

output_pin = 33

GPIO.setwarnings(False)

def main():
    # Pin Setup:
    # Board pin-numbering scheme
    GPIO.setmode(GPIO.BOARD)
    # 支持的频率范围: X3: 48KHz ~ 192MHz X5: 0.05HZ ~ 1MHZ
    p = GPIO.PWM(output_pin, 48000)
    # 初始占空比 25%, 先每0.25秒增加5%占空比,达到100%之后再每0.25秒减少5%占空比
    val = 25
    incr = 5
    p.ChangeDutyCycle(val)
    p.start(val)

    print("PWM running. Press CTRL+C to exit.")
    try:
        while True:
            time.sleep(0.25)
            if val >= 100:
                incr = -incr
            if val <= 0:
                incr = -incr
            val += incr
            p.ChangeDutyCycle(val)
    finally:
        p.stop()
        GPIO.cleanup()

if __name__ == '__main__':
    signal.signal(signal.SIGINT, signal_handler)
    main()

実行方法

simple_pwm.py プログラムを実行して、GPIO 読み書きプログラムを起動します。

sunrise@ubuntu:~$ cd /app/40pin_samples/
sunrise@ubuntu:/app/40pin_samples$ sudo python3 ./simple_pwm.py