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

📢 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 ==
ここでは、スイッチを押下するとPWM制御により、LEDが点滅する回路を以下に記載する。<br>
タイマ割り込みでデューティ比を変化せるプログラムを以下に記述する。<br>
[[ファイル:ATmega328 Timer PWM 2.jpg|フレームなし|中央]]
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]]