はじめに
ラズパイでLチカに成功したのでどんどんいこう
でも早速「デューティ比」っていう言葉が現れて
何がうれしいのかわからないのでちょっと調べる
デューティ比とは?
の言葉を引用すると
ON時間をT_on,OFF時間をT_offと定義します.周期(T)は,T_onとT_offを足し合わせた時間です.
周期Tの逆数(1/T)は繰り返し周波数(f)です.
そして,周期(T)のうON時間が占める割り合いを「デューティ比」と呼びます.図9(b)に示す式で表されます.
なるほど。そういうもんなんですね。
だから、LEDをチカチカさせたいならディーティ比を変えたらいいよってことはわかった。
だからなんなのか。というところがピンと来てない。
デューティ比がわかると実効電圧を調整させることができる
チカチカさせ具合を表すだけで用語になるわけないのでもうちょっと掘り下げよう。
によると、「デューティー比を変えることで入力電圧を変えずに電圧を上げ下げさせることができる」そうだ。
急に専門的な感じになったぞ!
「実効電圧」という言葉がある。これは、見かけ上の電圧のことで、
実行電圧は電圧の最大値とデューティー比の積で表すことができるそうだ。
だから、最大2Vの電圧を持つを持つ電源で、1Vの電圧を与えたい場合は、デューティ比50%でパルスを与えたら、機器に対して1Vの電圧を与えることができるそうだ。
これを「PWM制御」って呼ぶそうです。
PWM制御を使ってLチカさせてみよう
従来のsleepを使って点滅させる方式のコードがこちら。
0.05秒ごとで点滅させた場合、
周期=T_on:0.05+T_off:0.05=0.1秒
周波数=1/0.1=10Hz
デューティ比は、T_on、T_offともに同じ時間なので50%
って計算になる。
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)
duty=0.01
while True:
led.value(1)
utime.sleep(0.05)
led.value(0)
utime.sleep(0.05)
一方、PWM制御を使って行う場合、T_on,T_offを計算しなくても
pwm.freq(10)って書けば、10Hzって設定できる。
更にデューティ比を調整するにはpwm.duty_u16()で行う。
()の中は16ビット(0~65535)の整数値を引数として入れてデューティ比を設定。
引数が0のときは0%,65535のときが100%となる。
なので、、、デューティ比50%とするには
pwm.duty_u16(int(65535*50/100))としてやる。
以上を踏まえたコードがこちら。
from machine import Pin,PWM
pwm = PWM(Pin(25))
pwm.freq(10)
duty = 50 #0~100
pwm.duty_u16(int(65535*duty/100))
画像で紹介できないのが残念だけども、実際にやってみたら全く同じ具合のLチカになった。
あと、
10Hzだと人間的にはチカチカ点滅して見えるけど、100Hzだと人間的にはわからなくなる
そうです。実際にやってみたらそうだった。なるほどねぇ~。
デューティ比を変えてみよう
話を戻すとデューティ比を変えると、実行電圧が変えることができる。
なので、デューティ比を100%にすると電圧100%で、50%にすると電圧50%になる。
これをLEDに当てはめると、デューティ比100%の方よりもデューティ比50%の方が暗くなる、という話。
激しく伝わりにくいけど、実際に試したコードがこちら。
今回はLチカさせずに100Hzで試してみたところ、確かに明るさが変わった
### duty比=90%
from machine import Pin,PWM
pwm = PWM(Pin(25))
pwm.freq(100)
duty = 90 #0~100
pwm.duty_u16(int(65535*duty/100))
### duty比=10%
from machine import Pin,PWM
pwm = PWM(Pin(25))
pwm.freq(100)
duty = 10 #0~100
pwm.duty_u16(int(65535*duty/100))
ちなみに。。。これをsleep使って再現しようとしたコードがこちら
### duty比=90%
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)
duty=0.01
while True:
led.value(1)
utime.sleep(0.009)
led.value(0)
utime.sleep(0.001)
### duty比=10%
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)
duty=0.01
while True:
led.value(1)
utime.sleep(0.001)
led.value(0)
utime.sleep(0.009)
結果は全く同じになった。すごいー。
なるほど、これがデューティ比。PWM制御。