人気ブログランキング | 話題のタグを見る

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で PWM (11) (9/12)

以前PWMを8/21にarduinoIDE8/25にBASCOM-AVRの記事として2箇所で書いた。
その意味をよく理解していなかった。
デューティ比(ローマ字でdhuと入力するのも知らなかった:MS IME)というのは、矩形波に対して、1周期のうち、HIになっている部分の比率。
デューティ比=100%はHI=100%の矩形波。
デューティ比=50%はHI=50%,LOW=50%。
デューティ比=25%はHI=25%。
 Japanino ArduinoISPで ATtiny13 で PWM (11) (9/12)_a0034780_23434342.jpg
PWMを実現する方法を考えると、タイマーが0からカウントアップしていき、ある値を超すとピンをHIにする。その後タイマーがオーバーフローすると、ピンをLOWに戻す。このピンをHIにするタイミングを指定するわけで、その間はLOW期間だ。PWMで指定する時間というのは”LOW”の期間なのだ。
 Japanino ArduinoISPで ATtiny13 で PWM (11) (9/12)_a0034780_00331235.jpg
つまり、デューティ比25%のPWMを指定する時、LOW期間75%を指定する。
PWM0Aを0~255に変化させると、LOWの期間が0~255に変わるのだからHIは逆に255~0になる。デューティ比は100~0%に変わる。
以前のソースを示す。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.0 = Output
Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down

Dim I As Byte
Do
For I = 0 To 255
Incr Pwm0a ' = Pwm0a + 1
Waitms 10
Next I
Loop
End
このままだと、オシロスコープでもHIの期間が段々減っているのか逆なのかよくわからない(後述するが、Waitms 10を変えたり、Prescale=1↔64もやったりした)。
なので、Incr Pwm0a→Pwm0a = 191(192-1)に変える。
(191+1)/(255+1)=3/4で、LOWの期間が3/4だから1/4だけHIの矩形波になる。
 Japanino ArduinoISPで ATtiny13 で PWM (11) (9/12)_a0034780_22155094.jpg
オシロスコープの図で左隅が原点0msであり、最初の矩形がHIになる所は図には無いが2.09ms、HIが終わる所が2.96ms、次のHIになる所は5.58ms。
つまりHIの期間は2.96-2.09≒1ms、矩形波全体は5.58-2.09≒4ms。HIが1/4の期間になっている。PWM0Aを255にした時LEDが真っ暗になったからん?と思ったことから気が付いた。254にすると、オシロスコープに一瞬パルスが出てあれ逆かと思いそれでタイマーのカウントアップとPWM0Aとの比較を考えて思い至った。
254をLEDの明るさで判断するのは微妙で難しい。オシロスコープならちょっとの違いも明らかにしてくれる。
ほんと、普段から意識してないと忘れそうだ。違う分野を覚えておくのはすぐ見れる自分メモでも持っておく必要がありそうだ。

本来Waitms 10やPrescale=1↔64は関係ない。なぜならPWMというのはプログラムでWait(=LOWか?←わかってないからこんな考えになる)したからどうなるものでもなく、ハードがソフトとは別に裏で自動的にやってることなのだ。Prescaleもものすごくハード(周期)が遅くなれば目に見えてくるかもしれないが、64ぐらいではLEDの明るさに影響したり、ソフトオシロごときで測れる範囲には入ってこないのだ。
by k1segawa | 2016-09-12 22:21 | arduino, AVR | Comments(0)

by k1segawa