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 出力が利用可能のようです。
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になっている