Skip to content

Samples_PWM

Ko-ichiro Sugiyama edited this page Mar 6, 2023 · 16 revisions

はじめに

PWM クラスのメソッドについては,Class_PWM を参照されたい.

PWM の基礎

電圧の HIGH と LOW を繰り返すことで, 実効的な電圧を変化させることができる.デューティー比が実効的な電圧比に対応する.

デューティー比は比率 (%) で与えるのではなく, 下図でいうところの「閾値」として与えるのが一般的である.本ライブラリでは max は 1024 (10 bit) であるので,デューティー比を 50% とする場合には 512 を与えれば良い.

なお, ESP32 のクロックは 80 MHz = 12.5 μs で動作するため, 分解能をそれよりも小さくすることはできない. 本ライブラリの場合に扱える最大波長は 1 / (12.5e-6 * 1024) = 78.124 Hz である (タイマの解像度を 10 bit としているため).

圧電ブザー

圧電ブザーを鳴らすプログラムの例.

1  pwm0 = PWM.new( 15 )
2
3  pwm0.freq(440)
4  pwm0.duty(512)
5  sleep 5
6
7 pwm0.deinit
  • 1 行目: インスタンスの作成. スピーカの接続されているピン (GPIO 15) を使う設定に.

    • クラスの定義は mrblib/models/pwm.rb

  • 3 行目: 周波数の設定.440Hz に.

  • 4 行目: デューティー比の設定. 512 / 1024 = 50%

    • デフォルト 10 bit = 1024.

  • 7 行目:音を止める

もし,うまく音が鳴らない場合は,1 行目の後に sleep を入れると解消される場合がある.

LED の明るさ変化

LED (GPIO 13) の明るさを 10 秒間隔で変化させる

1  # LED の明るさを 10 秒間隔で変化させる.
2
3  # 初期化
4  pwm = PWM.new(13)
5  pwm.frequency( 1000 )
6  num = 10
7
8  while true
9
10   for i in 0..num do
11
12     duty = ( 1023 / num ) * i
13
14     pwm.duty( duty )
15
16     sleep 10.0 / num
17   end
18
19   # 少し休む
20   sleep 0.2
21 end
Clone this wiki locally