AVRのタイマー
AVRのタイマーはほぼ同等の8ビットのタイマ0 と16ビットのタイマ1があり。
(タイマー1にはインプットキャプチャがあり)
カウンタTCNTはタイマ0,1共にに リード、ライト可能、PWM波形生成などがあり、幅広い設定のできるタイマー機能を持っています。
その分、設定が複雑なので分類してみました。
タイマー分類
AVRのタイマーはデータシートでは
主に4つのモードがあります。
- 標準
- CTC
- 位相基準PWM
- 高速PWM
4つでは少しわかりにくいので、機能から大きく3つに分類しました
(標準、 CTC)、位相基準PWM、高速PWM
(以下データシート用語で カウンタ満タン=Top値)
* 設定については 下 タイマーレジスタ表 を参照
タイマー説明
【タイマー0モード設定】
TCCR0A TCCR0B で設定する
WGM02 | WGM01 | WGM00 | - | - |
0 | 0 | 0 | 標準モード | 【オーバーフローでタイマを使う】 カウンタ値Top =FF となり これを超えるとまた一回りして0から。 この0になるとき オーバーフローフラグ:TOV0=は1に。 |
0 | 1 | 0 | CTC | 【満タン値(Top値)を設定して使う】 カウンタTCNT0 と OC0A が一致(コンペアマッチ)で カウンタTCNT0は0クリアされる OCF0Aフラグで割り込み設定する |
0 | 0 | 1 | 位相基準PWM | 【PWMでタイマを使う】 WGM02 = 0 で カウンタTop (最大値)= FF(満タン) WGM02 = 1 で カウンタTop(最大値) = OC0A |
1 | 0 | 1 | 位相基準PWM | |
0 | 1 | 1 | 高速PWM | |
1 | 1 | 1 | 高速PWM |
【標準的タイマーとCTC】
- ・標準的タイマー
- 主に普通のカウンタとしてで動作させるようなモード
- ・CTC
- Top値=OCR0A 設定 (Top値=満タン値 をOCR0Aで設定して使う)
この2つのモードの違いは Top値=オーバーフロー(FF) か Top値=OCR0A の違いといえそう。
(CTCモードではオーバーフロー割り込みはできないようで、満タン(OCR0A) として使用するモード)
標準モードだと、
カウンタ満タン時(オーバーフロー)で
使用するには カウンタが 仮に満タン=10秒だとすると
仮に 周期 2秒間隔で使うには スタート=8にして動かすような使い方
周期で割り込み の場合はオーバーフロー割り込み
CTCモードは
満タン時が設定できるので
仮に 周期 2秒間隔で使うには
カウンタが スタート=0 満タン=2秒 (OCR0A=2秒に設定)
周期で割り込み の場合は Top値=OCR0A なので
満タン(=OCR0A)で マッチA割り込み
CTCモードで、そういうちょと使いやすい設定が可能な感じです
CTCモード チャート (データシートより)
また、OCn×でピン出力方式をトグル設定すると、波形出力も可能です。
割り込みは TIFRレジスタの
オーバーフロー TOV0
マッチA OCF0A などが要因発生でビットが1になり
割り込み関数実行後には 自動的に 0クリアされる
【高速PWM】
高速PWM
一般的なPWMモード 高速PWMはのこぎり波
高速PWM と 位相基準PWM の違いは
高速PWMはのこぎり波を扱うのに対し、位相基準PWMは三角波を扱うといえる。
また WGM02 (TCCR0Bレジスタ) にて
Top値=FF(カウンタ満タン) か Top値=OCR0A(満タン:OCR0A) で使用かを設定
高速PWMモード チャート (データシートより)
【位相基準PWM】
・位相基準PWM
位相基準PWMは、カウンタがいっぱいになると、減算して下り始める 三角波になる
単純に周期を高速PWMの2倍にすることが出来る
この2つ 高速PWM と 位相基準PWM の違いは
高速PWMはのこぎり波を扱うのに対し、位相基準PWMは三角波を扱うといえる。
また WGM02 (TCCR0Bレジスタ) にて
Top値=FF(カウンタ満タン) か Top値=OCR0A(満タン:OCR0A) で使用かを設定
位相基準PWMモード チャート (データシートより)
タイマー関連レジスタ
タイマー0の設定は TCCR0A TCCR0Bに混在している。
●TCCR0A タイマ0設定レジスタ
波形出力 コンペアマッチA |
波形出力 コンペアマッチB |
- | - | タイマモード設定 | |||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 |
コンペアマッチで 波形出力選択 |
コンペアマッチで 波形出力選択 |
標準 CTC 位相基準PWM 高速PWM |
●TCCR0B タイマ0設定レジスタ
OC0A,B強制変更 | - | - | Top設定 | クロック設定 | |||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 |
強制コンペアマッチ 非PWMモード時のみ有効 |
Top値 = 満タンか = OC0Aの選択 |
クロック分周選択 |
タイマー1の設定 | タイマー0の設定 | ||||||
オーバー プロー |
コンペア マッチA |
コンペア マッチB |
インプット キャプチャ |
コンペア マッチB |
オーバー プロー |
コンペア マッチA |
|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOIE1 | OCIE1A | OCIE1B | - | ICIE1 | OCIE0B | TOIE0 | OCIE0A |
タイマー1の設定 | タイマー0の設定 | ||||||
オーバー プロー |
コンペア マッチA |
コンペア マッチB |
インプット キャプチャ |
コンペア マッチB |
オーバー プロー |
コンペア マッチA |
|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOV1 | OCF1A | OCF1B | - | ICF1 | OCF0B | TOV0 | OCF0A |
設定方法 タイマー関連レジスタ
【タイマー0設定】
PWM 波形出力 コンペアマッチA (出力ピン OC0A) |
PWM 波形出力 コンペアマッチB (出力ピン OC0B) |
- | - | タイマモード設定 | タイマモード | |||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 | |
マッチA,B共、ビット設定方法は同じ | - | - | 0 | 0 | 標準 | |||
0 | 1 | コンペアマッチでトグル出力 |
- | - | 1 | 0 | CTC | |
1 | 0 | コンペアマッチでLow |--___| |
- | - | 0 | 1 | 位相基準PWM | |
1 | 1 | コンペアマッチでHigh |___--| |
- | - | 1 | 1 | 高速PWM | |
0 | 0 | 波形出力なし |
COM0A1 | COM0A0 | COM0B1 | COM0B0 |
ここに1が一つでも設定されると、その通常のIOポートの機能は無効にされ、タイマ動作用IOになる
出力ピン OC0A、 OC0B
* タイマからピン出力するには DDRレジスタでピンを出力設定にする必要あり
波形出力 コンペアマッチA |
波形出力 コンペアマッチB |
- | - | タイマモード設定 | |||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 |
コンペアマッチで 波形出力選択 |
コンペアマッチで 波形出力選択 |
標準, CTC 位相基準PWM 高速PWM |
OC0A,B強制変更 | - | - | Top設定 | クロック設定 | |||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 |
強制コンペアマッチ 非PWMモード時のみ有効 |
Top値=満タンか =OC0Aの選択 |
クロック分周選択 |
OC0A,B強制変更 強制コンペアマッチ 非PWMモード時のみ有効 |
- | - | Top設定 | クロック設定 | ||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 | |
- | - | 標準 CTCモードでは必ず 0 |
0 | 0 | 0 | タイマ停止 | ||
- | - | 0 | 0 | 1 | プリスケーラなし | |||
- | - | 位相基準PWM 高速PWM モードで WGM02 = 0 で カウンタTop (最大値)= FF(満タン) WGM02 = 1 で カウンタTop(最大値) = OC0A |
0 | 1 | 0 | 1/8 | ||
- | - | 0 | 1 | 1 | 1/64 | |||
- | - | 1 | 0 | 0 | 1/256 | |||
- | - | 1 | 0 | 1 | 1/1024 | |||
- | - | 1 | 1 | 1 | T0ピンからの外部クロック (立ち下がり |
|||
- | - | 1 | 1 | 1 | T0ピンからの外部クロック (立ち上がり |
タイマー停止、開始は 設定ビットの TCCR×B= の分周設定ビットを
すべて000 →停止
分周設定 →開始 とするようです。
割り込み
オーバーフロー、マッチA、マッチBで それぞれ独立した割り込みベクタ
割り込み設定レジスタ
割り込み処理をしたいとき対応ビットを設定する
タイマー1の設定 | タイマー0の設定 | ||||||
オーバー プロー |
コンペア マッチA |
コンペア マッチB |
- | インプット キャプチャ |
コンペア マッチB |
オーバー プロー |
コンペア マッチA |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOIE1 | OCIE1A | OCIE1B | - | ICIE1 | OCIE0B | TOIE0 | OCIE0A |
ICF1 : インプットキャプチャ割り込み許可 (インプットキャプチャは タイマー0にはない)
WGM13-10でTOP値に設定の場合 カウンタ値=TOPで このフラグが 1
●割り込みフラグのレジスタ
通常は手動で設定はしないレジスタ。
割り込み要因で1がセットされ、対応する割り込み処理ベクタを実行すると自動で0クリアされる
タイマー1の設定 | タイマー0の設定 | ||||||
オーバー プロー |
コンペア マッチA |
コンペア マッチB |
- | インプット キャプチャ |
コンペア マッチB |
オーバー プロー |
コンペア マッチA |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOV1 | OCF1A | OCF1B | - | ICF1 | OCF0B | TOV0 | OCF0A |
インプットキャプチャ関連レジスタ
- | - | クロック設定 | |||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1CNC1 | 1CES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
1CNC1 : インプットキャプチャノイズ消去許可
ここが1設定で、ノイズ消去器を有効に。
ノイズ消去は連続4回同じ入力の場合にその入力を得る。このため4回で1入力となり遅れがでる。
1CES1 : インプットキャプチャ エッジ選択
0:立ち下がり
1:立ち上がり
ここの設定に従ってインプットキャプチャがトリガされると、タイマカウンタ値が インプットキャプチャレジスタ(ICR1)へコピーされる
- twtter
- google+
- hatena