📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
編集の要約なし |
|||
| 571行目: | 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> | ||
<source 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) | |||
{ | |||
; | |||
} | |||
} | |||
</source> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:AVR]] | [[カテゴリ:AVR]] | ||