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」カテゴリの記事
- DDS IC「AD9833」をArduino UNO R3で制御:箱入れ #2(2025.07.03)
- DDS IC「AD9833」をArduino UNO R3で制御:箱に入れる(2025.06.30)
- UNO R4はanalogWrite(n,128)でデュティー50%の方形波が出るぞ(2025.06.03)
- DDS IC「AD9833」の出力にバッファアンプを(2025.05.27)
- DDS IC「AD9833」をArduino UNO R3で制御(2025.05.25)
「重箱の隅」カテゴリの記事
- 1/1023監視団 活動中!(2025.03.10)
- DIPのLMC6482えらい高くなった(2025.03.07)
- 因縁のボリューム記号 トランジスタ技術2025年3月号(2025.02.17)
- ボリューム記号のボヤキ、トラ技2025年3月号の別冊付録に再掲載(2025.02.10)
- NECは3段タイプの発振回路をすすめてる(2025.01.31)
「AVRマイコン」カテゴリの記事
- その後のMPLAB@Snap(2025.07.16)
- あかんやん「Microchip Studio」(2025.06.13)
- Microchip StudioでMPLAB@Snapが動かない(2025.06.12)
- AVRマイコンAT90S1200を使ったデジタル時計(2024.06.02)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
コメント