CircuitPython 10行プログラミング Step9 (8) PWM出力

 マイコン・ボードESP32-S3-DevKitC-1-N8、CircuitPython は8.0.0-beta.6です。

 PWM出力用のモジュールがpwmioです。周波数、デューティ比を変化させて実行してみます。

   参考;CircuitPython 10行プログラミング Step5 (5) Raspberry Pi PicoのPWM出力

   参考;pwmio – Support for PWM based protocols

接続

 GPIO4とGPIO5に、負荷として10kΩの抵抗をGNDに対して付けました。その端子をオシロスコープで観測します。

 ArduinoのPWMは1kHz弱です。800Hzと3倍の2.4kHzの周波数、50%のデューティ・サイクルを設定しました。


import pwmio
import time
from board import *

pwm4 = pwmio.PWMOut(IO4, frequency = 800)
pwm4.duty_cycle = pow(2,15)
pwm5 = pwmio.PWMOut(IO5, frequency = 2400)
pwm5.duty_cycle = pow(2,15)
time.sleep(100)

 実行例です。

 周波数を上げます。


import pwmio
import time
from board import *

pwm4 = pwmio.PWMOut(IO4, frequency = 80_000)
pwm4.duty_cycle = pow(2,15)
pwm5 = pwmio.PWMOut(IO5, frequency = 240_000)
pwm5.duty_cycle = pow(2,15)
time.sleep(100)

 実行例です。80/240kHzです。

 さらに上げました。800kHz/2.4MHzです。

 さらに上げました。8/24MHzです。波形が崩れているのは、PWMの方形波自体が崩れているのか、オシロスコープの周波数限界によって正しく波形が表示できていないのかは、はっきりわかりません。

 使用しているオシロスコープは、Pico Technology 5242B 16bit ;60MHz 1GS/s です。

デューティ・サイクルの変化

 上記の実験では、デューティ・サイクルを50%にしました。出力電圧は3.3Vなので、平均化すれば半分の1.75Vが出ていることになります。

 GPIO4とGPIO5には同じPWM信号を出力します。GPIO5にはコンデンサ0.22uFを取り付け、ローパス・フィルタにしました。


import pwmio
import time
from board import *

pwm4 = pwmio.PWMOut(IO4, frequency = 240_000)
pwm5 = pwmio.PWMOut(IO5, frequency = 240_000)
duty = 25000
pwm4.duty_cycle = duty
pwm5.duty_cycle = duty
time.sleep(10)

 実行例です。上の青色がGPIO4、下の赤色がGPIO5の信号です。

 GPIO5には、最初約1Vの電圧が出ています。

pwm4.duty_cycle = duty*2
pwm5.duty_cycle = duty*2

デューティを変更しました。約2.5Vの電圧が出ました。

 立ち上がり時の波形を見ます。PWMのデフォルトがHightレベルになっているので、いったん0Vに下げます。

pwm4.duty_cycle = 1
pwm5.duty_cycle = 1
time.sleep(0.01)
pwm4.duty_cycle = duty
pwm5.duty_cycle = duty
time.sleep(10)

 5msぐらいで約1Vに達しています。