18/09/04 09:26:23.56 sYZx3o2Z.net
>>168
Arduinoの高速PWMはカウンタが0になるとHIGH、カウンタがOCR0nと一致でLOWが出るようになってるわけ。
その仕組みで>>166のように25~230をOCR0nに設定するならだいたい10%~90%のduty比の信号が出力される。
比較割り込みはOCR0nと一致時に割り込むわけだから、ループ中にPWMのduty比が変更されるとそこだけ割込み周期がおかしくなる。
たとえばさっき230までに設定されてて次に25が設定されたとすると、(高速PWMモードのOCR0nは二重緩衝されるのでBOTTOM(=カウンタ0)で更新される)
230になるとそこで割込みが発生、255の次で0に戻った時に25に更新され、次の割り込みは25で起きるからこの時だけ51タイマカウントしか間が空かない。
逆に、25だったのが230に更新されると、25(割込み)→255→0→230(割込み)になるから461タイマカウント経過しないと割込みが発生しないことになる。
1行目の通りPWMのポジティブエッジは必ずカウンタが0に戻った所にあるから、それをキャプチャすればかならず256タイマカウントで割込みが起きる。
それなら、溢れ割込みと同じタイミングと言えるし、かつPWMのduty比を変更したところで周期のブレを受けない。(PWMを止めたら割り込み発生しなくなるが)
なのでPWMを使ってるのに比較割り込みを使うと「動けばいい」にすら到達しない。ちゃんと動かない。
コレを見ろ。
URLリンク(i.imgur.com)
スケッチ。
URLリンク(paste.ofcode.org)