Atmega328P タイマー/カウンタ1の高速PWM動作
Arduino-UNOで使われているAtmega328P、この高速PWM動作
の解説が「なんのこっちゃ?」になっていませんか?
8,9,10bit固定値での高速PWMだとTOP値が,255,511,1023
と固定されるので理解しやすいかと思いますが、
ICR1あるいはOCR1AレジスタでTOP値を決めたい時に
(PWM周期を動かしたい)、データシートには
ややこしい注意が記してあります。
かいつまんで、要点を。
・OCR1Aは2重緩衝されます。
・ICR1は2重緩衝されません。
まず、この「2重緩衝」ってなに? でしょうか。
・ICR1がTOP値を定義するのに使われるとき、ICR1を
更新する手順はOCR1Aの更新と異なります。
・TOPを定義するのにICR1を使うことは決まった
TOP値を使う時に上手くいきます。
この解説、PWM周期を可変したいときにICR1を使うと
「上手くいかないかも」
ということと理解できます。
その理由。
・ICR1が小さな値に変更される場合、書かれた
新しいICR1値がTCNT1の現在値よりも小さくな
る危険を意味します。
・その後の結果はカウンタが(その回の)TOP値での
比較一致を失うことです。
つまり、ICR1でPWM波を作っているとき、PWM周期を短く
しようとしたときが「危ない」ぞっということなのです。
もしTNCT1より小さくしてしまったら、次の一致のため
にTCNT1が一周する(FFFF→0000を通過)のを待たなけれ
ばなりません。
PWMパルスの抜けが生じてしまいます。
※16MHzクロックだと1/65536で244Hz。
4m秒ほどの抜け(だんまり)が出てしまう
わけです。
このICR1に対して、OCR1Aを使った時は、
・この特徴は何時でも書かれることをOCR1Aの
I/O位置に許します。
・OCR1A I/O位置が書かれる時に書かれた値は
OCR1A緩衝部に置かれます。
・OCR1A(比較)レジスタはその後にTCNT1がTOPと一致
した次のタイマ/カウンタ クロック周期にOCR1A緩衝部の
値で更新されます。
・基準PWM周波数が(TOP値を変更することによって)
動的に変更される場合、OCR1Aが2重緩衝機能のため、
TOPとしてOCR1Aを使うことは明らかに良い選択です。
となって、OCR1Aを使うと、次サイクルのTOP値一致で
PWM周期が更新されるのです。
ですので、ICR1の時のように「一周抜け」の心配はあり
ません。
※でも、出力できるPWMは一つだけに
なってしまいます。
その違いを
・周波数つながりで、赤外線受光モジュールのBPF周波数
のスケッチをちょっと変更して確かめてみました。
ICR1をTOP値にするか、OCR1AをTOPにするかを#defineで
決めます。
OCR1AをTOP値にするとPWMのデューティ設定はOCR1Bで、
つまりOC1B端子が出力になるので、出力のポートが変わります。
見ているのは、発生周波数が54kHz→22kHzに変わる
タイミングです。
※トリガー用のテストパルスを出しています。
こんな具合にLED駆動出力(8波)が変わります。
★1と★2が注目点です。
「▼出力開始処理」のタイミングでPWM周期とデューティを
変えています。
まず、その次の割り込み処理までの時間が異なっています。
そしてLED駆動パルスが出るタイミング(OCR1Aあるいは
OCR1Bが反映される)も違いが見えます。
「BPF周波数チェック」のスケッチでは、タイマー1
割り込み内でTOP値を変えていますので、TCNT1は
「0000」からちょっとしか進んでおらず、新設定する
ICR1がTCNT1より小さくなることはありません。
しかし、「注意せよ!」は変わりありませんので。
※タイミングの連続性がズレてよいのなら
新ICR1設定前にTCNT1をクリアしてし
まうとかかなぁ。
※サンプルスケッチ (.txtにしています)
| 固定リンク
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
「重箱の隅」カテゴリの記事
- ステッピングモータ駆動回路を24Vだけで(2024.10.29)
- おっと。map関数の計算桁に注意(2024.10.06)
- リターンパスの無いオペアンプ入力回路(2024.05.31)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
「AVRマイコン」カテゴリの記事
- AVRマイコンAT90S1200を使ったデジタル時計(2024.06.02)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
- 数値をBCD出力(表示)するルーチン #2(2024.04.28)
- ATmega4809のシリアルポート(2023.01.18)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
コメント