« 周波数つながりで、赤外線受光モジュールのBPF周波数 | トップページ | 「東成おもちゃ病院」、8月6日はお休みします。 »

2022年7月25日 (月)

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が注目点です。

Cc01_20220724152301
Cc00

「▼出力開始処理」のタイミングでPWM周期とデューティを
変えています。
まず、その次の割り込み処理までの時間が異なっています。
そしてLED駆動パルスが出るタイミング(OCR1Aあるいは
OCR1Bが反映される)も違いが見えます。

「BPF周波数チェック」のスケッチでは、タイマー1
割り込み内でTOP値を変えていますので、TCNT1は
「0000」からちょっとしか進んでおらず、新設定する
ICR1がTCNT1より小さくなることはありません。

しかし、「注意せよ!」は変わりありませんので。
  ※タイミングの連続性がズレてよいのなら
   新ICR1設定前にTCNT1をクリアしてし
   まうとかかなぁ。

※サンプルスケッチ (.txtにしています)

  ・ダウンロード - ir_frq_scan3.txt


※関連
  ・2022年7月26日:割り込みと絡むクリチカルな制御 変数にはVolatileを!


|

« 周波数つながりで、赤外線受光モジュールのBPF周波数 | トップページ | 「東成おもちゃ病院」、8月6日はお休みします。 »

Arduino」カテゴリの記事

重箱の隅」カテゴリの記事

AVRマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 周波数つながりで、赤外線受光モジュールのBPF周波数 | トップページ | 「東成おもちゃ病院」、8月6日はお休みします。 »