稼働中

Raspberry Pi Pico(s_28)class ‘ PWM ‘の使い方

machine.PWM <class ‘PWM’>

Raspberry Pi Pico のMycroPythonにはmachineモジュールにPWM出力で使用するclass ‘PWM’があります。
Raspberry Pi PicoにはPWMチャンネル ×16(A/Bチャンネル ×8、Bは入力対応)があります。
PWMチャンネルと GPIO 端子は下表のようになっています。すべてのGPIO 端子でPWM 出力が利用可能のようです。
PWMマップ

GPIO番号をPWMについて書き出してみます。
channel=0をA、PWM channel=1をB、PWM sliceを番号と見れば上の表と同じになっています。


from machine import Pin, PWM
for i in range(30):
    pwm_n='pwm'+str(i)
    pwm_n =PWM(Pin(i))
    print('pwm'+str(i), pwm_n)


>>> %Run -c $EDITOR_CONTENT
pwm0 <PWM slice=0 channel=0>
pwm1 <PWM slice=0 channel=1>
pwm2 <PWM slice=1 channel=0>
pwm3 <PWM slice=1 channel=1>
pwm4 <PWM slice=2 channel=0>
pwm5 <PWM slice=2 channel=1>
pwm6 <PWM slice=3 channel=0>
pwm7 <PWM slice=3 channel=1>
pwm8 <PWM slice=4 channel=0>
pwm9 <PWM slice=4 channel=1>
pwm10 <PWM slice=5 channel=0>
pwm11 <PWM slice=5 channel=1>
pwm12 <PWM slice=6 channel=0>
pwm13 <PWM slice=6 channel=1>
pwm14 <PWM slice=7 channel=0>
pwm15 <PWM slice=7 channel=1>
pwm16 <PWM slice=0 channel=0>
pwm17 <PWM slice=0 channel=1>
pwm18 <PWM slice=1 channel=0>
pwm19 <PWM slice=1 channel=1>
pwm20 <PWM slice=2 channel=0>
pwm21 <PWM slice=2 channel=1>
pwm22 <PWM slice=3 channel=0>
pwm23 <PWM slice=3 channel=1>
pwm24 <PWM slice=4 channel=0>
pwm25 <PWM slice=4 channel=1>
pwm26 <PWM slice=5 channel=0>
pwm27 <PWM slice=5 channel=1>
pwm28 <PWM slice=6 channel=0>
pwm29 <PWM slice=6 channel=1>

Raspberry Pi PicoのMicorPytonにはclass ‘PWM’があります。
deinit、freq、duty_u16、duty_nsのメソッドがあります。
(01)deinit()
PWM 出力を無効にします。
(02-1)freq()
PWM の周波数を返します。
(02-2)freq(value)
PWM の周波数を設定します。7Hz から 125Mhzの範囲です。
(03-1)duty_u16()
PWM 出力のパルス幅を返します。0〜65535になります。
(03-2)duty_u16(num)
PWM 出力のパルス幅を設定します。0〜65535 で与えます。
(04-1)duty_ns()
PWM 出力のパルス幅を返します。ナノ秒単位の値で返します。
(04-2)duty_ns(num)
PWM 出力のパルス幅を設定します。ナノ秒単位の値で与えます。

使用例
※Thonnyのshellで実行しています。


>>> from machine import Pin, PWM

Raspberry Pi Picoのクロック周波数を調べます。125MHzのようです。
この分周比との兼ね合いで設定した値と異なる場合があるようです。


>>> machine.freq()
125000000           # 125MHz

Pin21(GP21)でPWM主力を使って見ます。
pwm21=PWM(Pin(21))
で初期化します。


>>> pwm21=PWM(Pin(21))
>>> pwm21
<PWM slice=2 channel=1>
>>> 

PWM周波数を10khzにします。


>>> pwm21.freq(10_000)

確認します。


>>> pwm21.freq()
10000

dutyを50%にします。10kHzなので周期は100_000nsec(100usec)なので


>>> ty=int(100000/2)        #100000nsecの50%
>>> pwm21.duty_ns(ty)
確認します。
>>> pwm21.duty_ns()
50000                       # 50usecになっています。

パルス幅を16bitで分解して指定する方法もあるようです。
2**16/2=65536
65536/2=32768


>>> pwm21.duty_u16(32768)
確認します。
>>> pwm21.duty_u16()
32767                       # ちょっと違う
>>> pwm21.duty_ns()
50000                       # 50usecになっている

ちなみに
Pin22でパルス幅を測定してみます。


>>> dpin=Pin(22, Pin.IN)
>>> machine.time_pulse_us(dpin, 1, 1000000); machine.time_pulse_us(dpin, 1, 1000000)
4           # 1回目は不定になる
50          # 50usecになっている