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
ドキュメント