見出し画像

machine.PWM 使い方

PWMはLEDの調光やモーターの回転数制御、ヒーター制御などに使います。変わったところでは外付け回路で簡易DACにしたり、ラジコンのRCサーボ制御にも使うようです。

私もPICでモーター制御などに使ってきましたが、ESP32での実績はシートヒーターの制御があります。ヒーターの場合はパルス周期は1Hz~10Hzもあれば十分で、必要以上に周波数を上げてもヒーターのレスポンスが付いてきませんからあまり意味がないと考えています。

それでは、手短に使い方を紹介してみます。

machine.PWM クラスをインポート

PWMのオブジェクト作成にmachine.Pinを使うので、一緒にインポートします。

from machine import Pin, PWM

PWMオブジェクトの作成と初期化

pwmとしてPin32、周波数1Hz、duty初期値1023のオブジェクトを作成しています。周波数は1Hz~1kHzの値を指定します。

pwm =  PWM(Pin(32), freq=1, duty=1023) 

duty出力と読み出し

先に作成したオブジェクトpwmにduty=0を出力する例と、現在のdutyを読み出す例です。dutyの値は0~1023の任意の値です。

pwm.duty(0)
a = pwm.duty()

PWM出力を解除

使ったことはありませんが、PWMに使うことを止めてIOに使い始めたい時などに使うようです。

pwm.deinit()

実際の使用例

sub1.pyに以下のようなクラスを作ります。

class heat:       # Heater PWM

  def __init__(self):
    self.pwm =  PWM(Pin(32), freq=1, duty=1023)   # Heater PWM 負論理

  def pwm_duty(self, d):  # Heater PWM duty 出力 ( d = duty 正論理 0~1023)
    self.pwm.duty(1023 - d)

この例ではFETのゲート電圧を確保する目的で負論理になっています。このため100%出力の場合はduty(0)とし、0%出力時にはduty(1023)になります。
pwm_duty()で正論理→負論理の変換を行っているため、mainは正論理で処理します。

mainから以下のように使います。

import sub1

heat = sub1.heat()

heat.pwm_duty(0)      # Heater PWM duty 出力 ( d = duty 正論理 0~1023)


今後ESP32のWiFiやBluetoothを活かして、フルカラーLEDの調光などで面白いものに挑戦したいと思います。


出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。