📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 文字列「</source>」を「</syntaxhighlight>」に置換 |
|||
| (同じ利用者による、間の8版が非表示) | |||
| 81行目: | 81行目: | ||
| ピン出力 || OCR0A<br>OCR0B || OCR1A<br>OCR1B || OCR2A<br>OCR2B | | ピン出力 || OCR0A<br>OCR0B || OCR1A<br>OCR1B || OCR2A<br>OCR2B | ||
|- | |- | ||
| ピン名 || PD6(OCR0A)<br>PD5(OCR0B) || PB1(OCR1A)<br>PB2( | | ピン名 || PD6(OCR0A)<br>PD5(OCR0B) || PB1(OCR1A)<br>PB2(OCR1B) || PB3(OCR2A)<br>PD3(OCR2B) | ||
|} | |} | ||
</center> | </center> | ||
| 105行目: | 105行目: | ||
|- | |- | ||
| | | | ||
! colspan="2" | PWM出力方法(コンペアマッチA)<br>出力ピン : OCR0A | ! colspan="2" | PWM出力方法(コンペアマッチA)<br>出力ピン : OCR0A(PD6) | ||
! colspan="2" | PWM出力方法(コンペアマッチB)<br>出力ピン : OCR0B | ! colspan="2" | PWM出力方法(コンペアマッチB)<br>出力ピン : OCR0B(PD5) | ||
! 設定なし | ! 設定なし | ||
! 設定なし | ! 設定なし | ||
| 159行目: | 159行目: | ||
! colspan="5" | WGMの役割 タイマモード設定 | ! colspan="5" | WGMの役割 タイマモード設定 | ||
|- | |- | ||
! WGM02 !! WGM01 !! | ! WGM02 !! WGM01 !! WGM00 !! 動作モード !! TOP | ||
|- | |- | ||
| 0 || 0 || 0 || 標準 || 0xFF | | 0 || 0 || 0 || 標準 || 0xFF | ||
| 165行目: | 165行目: | ||
| 1 || 0 || 0 || 予約 || - | | 1 || 0 || 0 || 予約 || - | ||
|- | |- | ||
| 0 || | | 0 || 0 || 1 || 位相基準PWM || 0xFF | ||
|- | |- | ||
| 1 || 0 || 1 || 位相基準PWM || | | 1 || 0 || 1 || 位相基準PWM || OCR0A | ||
|- | |- | ||
| 0 || 1 || 0 || CTC || | | 0 || 1 || 0 || CTC || OCR0A | ||
|- | |- | ||
| 1 || 1 || 0 || 予約 || - | | 1 || 1 || 0 || 予約 || - | ||
| 175行目: | 175行目: | ||
| 0 || 1 || 1 || 高速PWM || 0xFF | | 0 || 1 || 1 || 高速PWM || 0xFF | ||
|- | |- | ||
| 1 || 1 || 1 || 高速PWM || | | 1 || 1 || 1 || 高速PWM || OCR0A | ||
|} | |} | ||
</center> | </center> | ||
| 222行目: | 222行目: | ||
|- | |- | ||
| | | | ||
! colspan="2" | PWM出力方法<br>(コンペアマッチA)<br>出力ピン : OCR1A | ! colspan="2" | PWM出力方法<br>(コンペアマッチA)<br>出力ピン : OCR1A(PB1) | ||
! colspan="2" | PWM出力方法<br>(コンペアマッチB)<br>出力ピン : OCR1B | ! colspan="2" | PWM出力方法<br>(コンペアマッチB)<br>出力ピン : OCR1B(PB2) | ||
! 設定なし | ! 設定なし | ||
! 設定なし | ! 設定なし | ||
| 251行目: | 251行目: | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
! colspan="9" | TCCR1B | ! colspan="9" | TCCR1B タイマ1設定レジスタ | ||
|- | |- | ||
| | | | ||
| 278行目: | 278行目: | ||
! colspan="6" | WGMの役割 タイマモード設定 | ! colspan="6" | WGMの役割 タイマモード設定 | ||
|- | |- | ||
! WGM13 !! WGM12 !! WGM11 !! | ! WGM13 !! WGM12 !! WGM11 !! WGM10 !! 動作モード !! TOP | ||
|- | |- | ||
| 0 || 0 || 0 || 0 || 標準 || 0xFFFF | | 0 || 0 || 0 || 0 || 標準 || 0xFFFF | ||
| 345行目: | 345行目: | ||
|- | |- | ||
! 外部クロック<br>T0を立ち上がりエッジで | ! 外部クロック<br>T0を立ち上がりエッジで | ||
| 1 || 1 || 1 | |||
|} | |||
</center> | |||
<br><br> | |||
== タイマ2のレジスタ設定 == | |||
タイマ2の設定レジスタであるTCCR2Aの設定を下表に示す。<br> | |||
<center> | |||
{| class="wikitable" | |||
! colspan="10" | TCCR2A タイマ2設定レジスタ | |||
|- | |||
| | |||
! colspan="2" | PWM出力方法(コンペアマッチA)<br>出力ピン : OCR2A | |||
! colspan="2" | PWM出力方法(コンペアマッチB)<br>出力ピン : OCR2B | |||
! 設定なし | |||
! 設定なし | |||
! colspan="3" | タイマのモード設定(一部) | |||
|- | |||
! ビット名 | |||
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 || | |||
|- | |||
! レジスタ名 | |||
| COM2A1 || COM2A0 || COM2B1 || COM2B0 || - || - || WGM21 || WGM20 || | |||
|- | |||
! 波形出力なし | |||
| 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 | |||
|} | |||
</center> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
! colspan="9" | TCCR2B タイマ2設定レジスタ | |||
|- | |||
| | |||
! colspan="2" | OCR2AおよびOCR2Bの強制変更 | |||
! 設定なし | |||
! 設定なし | |||
! タイマモード設定(一部) | |||
! colspan="3" | クロック分周の設定 | |||
|- | |||
! ビット名 | |||
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 | |||
|- | |||
! レジスタ名 | |||
| FOC2A || FOC2B || - || - || WGM22 || CS22 || CS21 || CS20 | |||
|- | |||
! 役割 | |||
| colspan="2" | 強制コンペアマッチ<br>(非PWMモードのみ) | |||
| - || - || 下で説明する | |||
| colspan="3" | クロック分周の選択 | |||
|} | |||
</center> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
! colspan="5" | WGMの役割 タイマモード設定 | |||
|- | |||
! WGM22 !! WGM21 !! WGM20 !! 動作モード !! TOP | |||
|- | |||
| 0 || 0 || 0 || 標準 || 0xFF | |||
|- | |||
| 1 || 0 || 0 || 予約 || - | |||
|- | |||
| 0 || 0 || 1 || 8bit位相基準PWM || 0xFF | |||
|- | |||
| 1 || 0 || 1 || 位相基準PWM || OCR2A | |||
|- | |||
| 0 || 1 || 0 || CTC || OCR2A | |||
|- | |||
| 1 || 1 || 0 || 予約 || - | |||
|- | |||
| 0 || 1 || 1 || 8bit高速PWM || 0xFF | |||
|- | |||
| 1 || 1 || 1 || 高速PWM || OCR2A | |||
|} | |||
</center> | |||
<br> | |||
<center> | |||
{| class="wikitable" | |||
! colspan="4" | クロック分周の設定 | |||
|- | |||
! 設定 !! CS22 !! CS21 !! CS20 | |||
|- | |||
! ビット名(TCCR2B) | |||
| 2 || 1 || 0 | |||
|- | |||
! タイマ停止 | |||
| 0 || 0 || 0 | |||
|- | |||
! 分周なし | |||
| 0 || 0 || 1 | |||
|- | |||
! 分周 1 / 8 | |||
| 0 || 1 || 0 | |||
|- | |||
! 分周 1 / 32 | |||
| 0 || 1 || 1 | |||
|- | |||
! 分周 1 / 64 | |||
| 1 || 0 || 0 | |||
|- | |||
! 分周 1 / 128 | |||
| 1 || 0 || 1 | |||
|- | |||
! 分周 1 / 256 | |||
| 1 || 1 || 0 | |||
|- | |||
! 分周 1 / 1024 | |||
| 1 || 1 || 1 | | 1 || 1 || 1 | ||
|} | |} | ||
| 370行目: | 487行目: | ||
なお、PORTB = 0b00000001とすることで、PB0のプルアップが有効になるので、プルアップ抵抗を付ける必要はない。<br> | なお、PORTB = 0b00000001とすることで、PB0のプルアップが有効になるので、プルアップ抵抗を付ける必要はない。<br> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c++"> | ||
// タイマ0 : 8bit : 0 - 255 | // タイマ0 : 8bit : 0 - 255 | ||
// タイマ1 : 16bit : 0 - 65535 | // タイマ1 : 16bit : 0 - 65535 | ||
| 436行目: | 553行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== PWMの設定 ===== | ===== PWMの設定 ===== | ||
| 454行目: | 571行目: | ||
スイッチがオンの状態で、PWM出力波形のHIGH時間を32.5[ms]にする。<br> | スイッチがオンの状態で、PWM出力波形のHIGH時間を32.5[ms]にする。<br> | ||
スイッチがオフの状態で、HIGH時間を0[ms]にする。<br> | スイッチがオフの状態で、HIGH時間を0[ms]にする。<br> | ||
<br> | |||
===== 作成した回路 ===== | |||
ここでは、スイッチを押下するとPWM制御により、LEDが点滅する回路を以下に記載する。<br> | |||
[[ファイル:ATmega328 Timer PWM 2.jpg|フレームなし|中央]] | |||
<br><br> | <br><br> | ||
== | == サンプルコード2 == | ||
タイマ割り込みでデューティ比を変化せるプログラムを以下に記述する。<br> | |||
[[ | PWMの周期を2048[us]、12.5[ms]ごとに割り込みを発生させて、デューティ比を0.78と0.04に切り替える。<br> | ||
<syntaxhighlight lang="c++"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <avr/interrupt.h> | |||
unsigned char i; | |||
// タイマ2 コンペアマッチA割り込み | |||
ISR(TIMER2_COMPA_vect) | |||
{ | |||
if(i == 255) | |||
{ | |||
i = 0; | |||
} | |||
else | |||
{ | |||
i++; | |||
} | |||
if(i % 2 == 0) | |||
{ | |||
OCR0A = 10; | |||
} | |||
else | |||
{ | |||
OCR0A = 200; | |||
} | |||
} | |||
int main() | |||
{ | |||
// タイマ0 | |||
TCCR0A = 0b10100011; // 1010 = OCR0A出力とOCR1A出力, 011 = 高速PWM(TOP値 = 0xFF) | |||
TCCR0B = 0b00000010; // 010 = 分周比 : 8(PWM周期 = 1 / (1,000,000[Hz] / 8分周) * 256 = 2048[us]) | |||
// タイマ2(割り込み用 : コンペアマッチAで割り込み開始) | |||
TCCR2A = 0b00000010; // 0000 = ピン出力なし, 010 = CTC(TOP値 = OCR2A) | |||
TCCR2B = 0b00000101; // 101 = 分周比 : 128 | |||
OCR2A = 97; // 12.5[ms]ごとに割り込み(1 / (1,000,000[Hz] / 128分周) * 98) | |||
TIMSK2 = 0b0000010; // コンペアマッチAの割り込みを有効 | |||
// 方向レジスタの設定 | |||
DDRB = 0xFF; // PORTB2を出力 | |||
DDRD = 0xFF; // PORTD5を出力 | |||
// 割り込み許可 | |||
sei(); | |||
while(1) | |||
{ | |||
; | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:AVR]] | [[カテゴリ:AVR]] | ||