PWM

pwm関数は、論理obniz IOにPWM(パルス幅変調)信号を出力します。ピンを論理obniz IOの番号で指定するため、ESP32系の製品はもちろん、obniz Boardでも同じコードが動作します。

同時に出力できるPWMのチャンネル数には上限があります。pwm.start()を呼ぶたびにチャンネルを1つ確保し、pwm.stop()で解放します。

OS7.1.0以降


pwm.start(io)

指定したIOでPWM出力を開始します。

ピンはPWM用に確保され、出力へ切り替わります。初期値は周波数1,000Hz、デューティ比0%です。

引数

引数 説明
io number 論理obniz IOの番号です。

返り値

数値のステータスコードを返します。

意味
0 開始に成功しました。すでにPWMが動作している場合も0です。
1 指定したIOの番号が不正です。
2 空きのPWMチャンネルがありません。

pwm.freq(io, hz)

PWM信号の周波数をヘルツで設定します。

周波数を変更すると、現在のデューティ比を自動で再適用します。

引数

引数 説明
io number PWMを開始済みの論理obniz IOの番号です。
hz number 周波数(ヘルツ)です。

返り値

数値のステータスコードを返します。

意味
0 設定に成功しました。
1 指定したピンでPWMが開始されていません。
2 指定した周波数が範囲外です(0、または80MHzを超える値)。

pwm.duty(io, percent)

PWM信号のデューティ比をパーセントで設定します。0未満や100を超える値は、その範囲に丸めます。

引数

引数 説明
io number PWMを開始済みの論理obniz IOの番号です。
percent number 0から100までのデューティ比です。

返り値

数値のステータスコードを返します。

意味
0 設定に成功しました。
1 指定したピンでPWMが開始されていません。

pwm.stop(io)

指定したピンのPWM出力を停止し、PWMチャンネルとIOピンの両方を解放します。

引数

引数 説明
io number 論理obniz IOの番号です。

Example: LEDをゆっくり点滅させる

以下の例では、IO1につないだLEDのデューティ比を50ミリ秒ごとに変え、明るさをなめらかに上下させます。

local io_num = 1
local duty = 0
local step = 5
local tick = 0

os.log(" - Lua PowerOn");

-- 1kHz、デューティ比0%でPWMを開始
pwm.stop(io_num);
pwm.start(io_num);
pwm.freq(io_num, 1000);
pwm.duty(io_num, duty);

function on_offline_loop()
  loop()
end

function on_online_loop()
  loop()
end

function loop()
  -- 50msごとにデューティ比を変えてLEDの明るさを上下させる
  if tick + 50 < os.getTick() then
    tick = os.getTick()
    duty = duty + step
    if duty >= 100 then
      duty = 100
      step = -step
    elseif duty <= 0 then
      duty = 0
      step = -step
    end
    pwm.duty(io_num, duty)
  end
end