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に達しています。