「ATmega328でのタイマとPWMの使用方法」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
346行目: 346行目:
|}
|}
</center>
</center>
<br><br>
== PWMを使用するときの設定 ==
* タイマ0(8bit)
*:レジスタ : TCCR0AとTCCR0B
*:HIGH時間を指定する : OCR0A(PD6),OCR0B(PD5)
* タイマ1(16bit)
*: レジスタ : TCCR1AとTCCR1B
*: HIGH時間を指定する : OCR1A(PB1),OCR1B(PB2)
*: TOP値を指定する : ICR1
* タイマ2(8bit)
*: レジスタ : TCCR2AとTCCR2B
*: HIGH時間を指定する : OCR2A(PB3)とOCR2B(PD3)
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:AVR]]
[[カテゴリ:AVR]]

2019年12月14日 (土) 22:13時点における版

概要

タイマには、8bitタイマと16bitタイマがあり、16bitの方がより多くのパターンを表すことができる。
また、ATmega48、88、168、328にはPWMを使えるピンが6つある。


タイマとPWM

PWMを使用するには、まずタイマについて理解しなければならない。
タイマには、8bitタイマと16bitタイマがあります。

8bitタイマは、0 - 255のパターンを表すことができる。
16bitタイマは、0 - 65535のパターンを表すことができる。

例 :
ATmega328の動作周波数が1[MHz]のとき、1/1,000,000 = 0.000001[s]が表せる最小の時間なので、
8bitタイマでは、最大0.000001 * 256 = 0.256[ms]までの時間を表すことができる。
16bitタイマでは、最大0.000001 * 65536 = 65.536[ms]までの時間を表すことができる。

タイマとPWMの関係を下図に示す。(タイマは実線(青)とし、PWM出力は実線(赤)とする)

タイマ(カウンタ)は、0からTOP値までカウントしていく。(青線)
TOP値を超えるとオーバーフロー割り込みが発生し、TOP値を超えたことを知らせる。
その後、タイマ(カウンタ)の値は0に戻り、カウントが再開される。
また、指定した値に到達したことを知らせる割り込み"比較一致割り込み(コンペアマッチ)"等の割り込みもある。
比較一致のときに、波形をHIGH、LOW、反転させることでPWM制御ができる。(赤線)


キーワード

  • タイマモードの種類
    • 標準モード (普通のタイマ、カウンタを使う)
    • CTCモード (カウンタの上限を自由に設定)
    • 高速PWM (タイマが、ノコギリ波)
    • 位相基準PWM (タイマが、三角波)


  • タイマ、PWMが出力できるピン
    • OCR0A(PD6)とOCR0B(PD5)
    • OCR1A(PB1)とOCR1B(PB2)
    • OCR2A(PB3)とOCR2B(PD3)


  • タイマとPWMを使うための設定(これらは、タイマ設定レジスタである)
    • 1のための設定: TCCR0AとTCCR0B
    • 2のための設定: TCCR1AとTCCR1B
    • 3のための設定: TCCR2AとTCCR2B



タイマモード

タイマのモードには、標準、CTC、位相基準PWM、高速PWMがある。
PWMを使用する時は、タイマモードを位相基準PWM、高速PWMに設定することで使用できる。

タイマとPWMの関係を再度、下図に示す。(タイマは実線(青)とし、PWM出力は実線(赤)とする)
下図は、タイマ0(8bitタイマ)の図だが、他のタイマも似たものとなる。

下記にタイマとPWMを使用するための説明を行う。

  • 標準モードは、カウンタとして動作させたい時に使用する。(普通のタイマ)
  • コンペアマッチ(指定値とタイマの値が一致)するための指定値はOCRnAまたはOCRnB(nは数字、後述)で設定する。
その値を超えたらTOPの値になるまでPWM信号は0を出力し、その後、タイマは0に戻る。
しかし、TOPの値をTOP = OCRnAまたはTOP = OCRnBとすることで、TOPの値まで行かなくてもタイマを0に戻すことができる。
これを、CTCモードという。
  • 高速PWMモードは、PWMを使うときに使用する。
動作原理は、上図の通りである。(タイマはノコギリ波で表される)
  • 位相基準PWMモードは、高速PWMモードとは違い、タイマは三角波で表される。



PWM出力ができるピン

ATmega48、88、168、328にはPWMを使えるピンが6つある。
OCR0A(PD6)とOCR0B(PD5)、OCR1A(PB1)とOCR1B(PB2)、OCR2A(PB3)とOCR2B(PD3)
上記6つのピンに対するタイマやPWMの設定は、それぞれTCCR0AとTCCR0B、TCCR1AとTCCR1B、TCCR2AとTCCR2Bで設定する。

TCCRnAは、タイマレジスタの7 - 6bitで使い方を指定し、
TCCRnBは、タイマレジスタの5 - 4bitで使い方を指定する。

ピンの役割

8bitタイマ(タイマ0) 16bitタイマ(タイマ1) 8bitタイマ(タイマ2)
ピン設定 TCCR0A
TCCR0B
TCCR1A
TCCR1B
TCCR2A
TCCR2B
ピン出力 OCR0A
OCR0B
OCR1A
OCR1B
OCR2A
OCR2B
ピン名 PD6(OCR0A)
PD5(OCR0B)
PB1(OCR1A)
PB2(OCR1A)
PB3(OCR2A)
PD3(OCR2A)



タイマ設定レジスタ

8bitタイマであるタイマ0(OCR0A(PD6)とOCR0B(PD5))を使用する場合は、TCCR0AとTCCR0BでタイマとPWMの設定を行う。
TCCR0Aで、PWMのコンペアマッチとタイマのモード設定を行い、TCCR0BでタイマのTOP値と、クロック分周の設定を行う。
詳細は、以下のタイマ0のレジスタ設定に示す。

16bitタイマであるタイマ1(OCR1A(PB1)とOCR1B(PB2))を使用する場合は、TCCR1AとTCCR1BでタイマとPWMの設定を行う。
詳細は、以下のタイマ1のレジスタ設定に示す。

8bitタイマであるタイマ2(OCR2A(PB3)とOCR2B(PD3))を使用する場合は、タイマ0とほぼ同じなので割愛する。



タイマ0のレジスタ設定

タイマ0の設定レジスタであるTCCR0Aの設定を下表に示す。

TCCR0A タイマ0設定レジスタ
PWM出力方法(コンペアマッチA)
出力ピン : OCR0A
PWM出力方法(コンペアマッチB)
出力ピン : OCR0B
設定なし 設定なし タイマのモード設定(一部)
ビット名 7 6 5 4 3 2 1 0
レジスタ名 COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
波形出力なし 0 0 0 0 - - 0 0 標準
コンペアマッチで出力が反転 0 1 0 1 - - 1 0 CTC
コンペアマッチでLow出力 1 0 1 0 - - 0 1 位相基準PWM
コンペアマッチでHigh出力 1 1 1 1 - - 1 1 高速PWM


TCCR0B タイマ0設定レジスタ
OC0RAおよびOCR0Bの強制変更 設定なし 設定なし タイマモード設定(一部) クロック分周の設定
ビット名 7 6 5 4 3 2 1 0
レジスタ名 FOC0A FOC0B - - WGM02 CS02 CS01 CS00
役割 強制コンペアマッチ
(非PWMモードのみ)
- - 下で説明する クロック分周の選択


WGMの役割 タイマモード設定
WGM02 WGM01 QGM00 動作モード TOP
0 0 0 標準 0xFF
1 0 0 予約 -
0 1 0 位相基準PWM 0xFF
1 0 1 位相基準PWM OCRnA(nは0または1)
0 1 0 CTC OCRnA(nは0または1)
1 1 0 予約 -
0 1 1 高速PWM 0xFF
1 1 1 高速PWM OCRnA(nは0または1)


クロック分周の設定
設定 CS02 CS01 CS00
ビット名(TCCR0B) 2 1 0
タイマ停止 0 0 0
分周なし 0 0 1
分周 1 / 8 0 1 0
分周 1 / 64 0 1 1
分周 1 / 256 1 0 0
分周 1 / 1024 1 0 1
外部クロック
T0を立ち下がりエッジで
1 1 0
外部クロック
T0を立ち上がりエッジで
1 1 1



タイマ1のレジスタ設定

タイマ1の設定レジスタであるTCCR1Aの設定を下表に示す。

TCCR1A タイマ1設定レジスタ
PWM出力方法
(コンペアマッチA)
出力ピン : OCR1A
PWM出力方法
(コンペアマッチB)
出力ピン : OCR1B
設定なし 設定なし タイマのモード設定(一部)
ビット名 7 6 5 4 3 2 1 0
レジスタ名 COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11 WGM10
波形出力なし 0 0 0 0 - - タイマのモード設定
(下に記載)
コンペアマッチで出力が反転 0 1 0 1 - -
コンペアマッチでLow出力 1 0 1 0 - -
コンペアマッチでHigh出力 1 1 1 1 - -


TCCR1B タイマ0設定レジスタ
インプットキャプチャ 設定なし タイマモード設定(一部) クロック分周の設定
ビット名 7 6 5 4 3 2 1 0
レジスタ名 1CNC1 1CES1 - WGM13 WGM12 CS12 CS11 CS10
役割 ノイズ除去器を有効にする
(4回同じ入力で1入力される)
エッジ設定
0 : 立ち下がり
1 : 立ち上がり
- タイマモード設定
(下で説明する)
クロック分周の選択


WGMの役割 タイマモード設定
WGM13 WGM12 WGM11 QGM10 動作モード TOP
0 0 0 0 標準 0xFFFF
0 0 0 1 8bit位相標準PWM 0x00FF
0 0 1 0 9bit位相標準PWM 0x1FFF
0 0 1 1 10bit位相標準PWM 0x03FF
1 0 0 0 位相・周波数基準PWM ICR1
1 0 0 1 位相・周波数基準PWM OCR1A
1 0 1 0 位相基準PWM ICR1
1 0 1 1 位相基準PWM OCR1A
0 1 0 0 CTC OCR1A
1 1 0 0 CTC ICR1
1 1 0 1 予約 -
0 1 0 1 8bit高速PWM 0x00FF
0 1 1 0 9bit高速PWM 0x01FF
0 1 1 1 10bit高速PWM 0x03FF
1 1 1 0 高速PWM ICR1
1 1 1 1 高速PWM OCR1A


クロック分周の設定
設定 CS12 CS11 CS10
ビット名(TCCR1B) 2 1 0
タイマ停止 0 0 0
分周なし 0 0 1
分周 1 / 8 0 1 0
分周 1 / 64 0 1 1
分周 1 / 256 1 0 0
分周 1 / 1024 1 0 1
外部クロック
T0を立ち下がりエッジで
1 1 0
外部クロック
T0を立ち上がりエッジで
1 1 1



PWMを使用するときの設定

  • タイマ0(8bit)
    レジスタ : TCCR0AとTCCR0B
    HIGH時間を指定する : OCR0A(PD6),OCR0B(PD5)
  • タイマ1(16bit)
    レジスタ : TCCR1AとTCCR1B
    HIGH時間を指定する : OCR1A(PB1),OCR1B(PB2)
    TOP値を指定する : ICR1
  • タイマ2(8bit)
    レジスタ : TCCR2AとTCCR2B
    HIGH時間を指定する : OCR2A(PB3)とOCR2B(PD3)