<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=ATmega328_-_PWM%E5%88%B6%E5%BE%A1</id>
	<title>ATmega328 - PWM制御 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=ATmega328_-_PWM%E5%88%B6%E5%BE%A1"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=ATmega328_-_PWM%E5%88%B6%E5%BE%A1&amp;action=history"/>
	<updated>2026-06-17T06:01:11Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=ATmega328_-_PWM%E5%88%B6%E5%BE%A1&amp;diff=9980&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == PWM (Pulse Width Modulation) 制御は、電力を制御するための手法の1つである。&lt;br&gt; PWMは、一定の周期でパルスの幅を変化させることにより、平均電力を制御する。&lt;br&gt; &lt;br&gt; ATmegaマイコンには、ハードウェアタイマ / カウンタを使用して、PWM信号を生成する機能が搭載されている。&lt;br&gt; &lt;br&gt; PWM制御の主な特徴を、以下に示す。&lt;br&gt; * デューティサイクル *…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=ATmega328_-_PWM%E5%88%B6%E5%BE%A1&amp;diff=9980&amp;oldid=prev"/>
		<updated>2024-05-26T06:10:10Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == PWM (Pulse Width Modulation) 制御は、電力を制御するための手法の1つである。&amp;lt;br&amp;gt; PWMは、一定の周期でパルスの幅を変化させることにより、平均電力を制御する。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; ATmegaマイコンには、ハードウェアタイマ / カウンタを使用して、PWM信号を生成する機能が搭載されている。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; PWM制御の主な特徴を、以下に示す。&amp;lt;br&amp;gt; * デューティサイクル *…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
PWM (Pulse Width Modulation) 制御は、電力を制御するための手法の1つである。&amp;lt;br&amp;gt;&lt;br /&gt;
PWMは、一定の周期でパルスの幅を変化させることにより、平均電力を制御する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ATmegaマイコンには、ハードウェアタイマ / カウンタを使用して、PWM信号を生成する機能が搭載されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
PWM制御の主な特徴を、以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
* デューティサイクル&lt;br /&gt;
*: PWM信号のデューティサイクルは、パルスの幅と周期の比率である。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
*: デューティサイクルが大きいほど、平均電力が高くなる。&lt;br /&gt;
*: 例えば、50％のデューティサイクルは、パルスがオンとオフの時間が等しいことを意味する。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 周波数&lt;br /&gt;
*: PWM信号の周波数は、1周期あたりのパルス数のことである。&lt;br /&gt;
*: 周波数が高いほど、平均電力の変化がスムーズになる。&lt;br /&gt;
*: ただし、周波数が高すぎると、接続されたデバイスが応答できない場合がある。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 分解能&lt;br /&gt;
*: PWMの分解能は、デューティサイクルの調整精度を表す。&lt;br /&gt;
*: 分解能が高いほど、より細かい電力制御が可能になる。&lt;br /&gt;
*: ATmegaマイコンのPWM分解能は、通常8ビットまたは16ビットである。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ATmegaマイコンでPWMを生成するには、以下の手順を実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
# タイマ / カウンタをPWMモードに設定する。&amp;lt;br&amp;gt;これには、WGM (Waveform Generation Mode) ビットを適切に設定する必要がある。&lt;br /&gt;
# PWM周波数を設定する。&amp;lt;br&amp;gt;これは、プリスケーラとTOP値 (カウンタの最大値) を調整することで行う。&lt;br /&gt;
# デューティサイクルを設定する。&amp;lt;br&amp;gt;これは、OCR (Output Compare Register) の値を変更することで行う。&lt;br /&gt;
# PWM出力ピンを有効にする。&amp;lt;br&amp;gt;これには、DDRとPORTレジスタを適切に設定する必要がある。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ATmegaマイコンには複数のタイマ / カウンタがあり、それぞれ独立してPWM信号を生成できる。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、複数のデバイスを同時に制御することが可能となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、PWM信号は、LEDの明るさ制御、モータの速度制御、音声の生成等に幅広く使用されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEDの調光制御 ==&lt;br /&gt;
==== タイマ未使用の場合 ====&lt;br /&gt;
以下の例では、PB1ピンに接続されたLEDをPWM制御して、徐々に明るく、および、消灯している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define LED_PIN PB1&lt;br /&gt;
 &lt;br /&gt;
 void init()&lt;br /&gt;
 {&lt;br /&gt;
    // PB1ピンを出力に設定して、Timer/Counter1をPWMモードに設定&lt;br /&gt;
    // PWM周波数は約976[Hz]に設定&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; LED_PIN);                 // PB1を出力に設定&lt;br /&gt;
    TCCR1A = (1 &amp;lt;&amp;lt; COM1A1) | (1 &amp;lt;&amp;lt; WGM10);  // 非反転PWMモード&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; WGM12) | (1 &amp;lt;&amp;lt; CS11);    // PWM周波数を約976Hzに設定&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void main()&lt;br /&gt;
 {&lt;br /&gt;
    init();&lt;br /&gt;
    while (1) {&lt;br /&gt;
       // LEDを徐々に明るくするため、OCR1Aレジスタの値を0から255まで徐々に増加させる&lt;br /&gt;
       // 各ステップ間に10[mS]の遅延を入れる&lt;br /&gt;
       for (int i = 0; i &amp;lt; 255; i++) {&lt;br /&gt;
          OCR1A = i;&lt;br /&gt;
          _delay_ms(10);&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       // LEDが最大輝度に達した後、&lt;br /&gt;
       // OCR1Aレジスタの値を255から0まで徐々に減少させることにより、LEDを徐々に消灯させる&lt;br /&gt;
       // 同様に、各ステップ間に10[mS]の遅延を入れる&lt;br /&gt;
       for (int i = 255; i &amp;gt; 0; i--) {&lt;br /&gt;
          OCR1A = i;&lt;br /&gt;
          _delay_ms(10);&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== タイマを使用する場合 ====&lt;br /&gt;
以下の例では、Timer/Counter1の比較一致割り込みを使用して、PB1ピンに接続されたLEDをPWM制御して、徐々に明るく、および、消灯している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
タイマ割り込みを使用して、割り込みハンドラでLEDのPWM値を更新することにより、メインループとは独立してLEDを調光制御する。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、他の処理を実行しながらLEDのフェードインおよびフェードアウト効果を実現することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define LED_PIN PB1&lt;br /&gt;
 &lt;br /&gt;
 volatile uint8_t pwmValue      = 0;&lt;br /&gt;
 volatile uint8_t fadeDirection = 1;&lt;br /&gt;
 &lt;br /&gt;
 // Timer/Counter1の比較一致A割り込みハンドラ&lt;br /&gt;
 // この割り込みは、Timer/Counter1の値がOCR1Aレジスタの値と一致したときに発生する&lt;br /&gt;
 // pwmValueの値を更新して、fadeDirectionに応じてLEDの明るさを増減する&lt;br /&gt;
 ISR(TIMER1_COMPA_vect)&lt;br /&gt;
 {&lt;br /&gt;
    OCR1A = pwmValue;&lt;br /&gt;
 &lt;br /&gt;
    if (fadeDirection == 1) {&lt;br /&gt;
       pwmValue++;&lt;br /&gt;
       if (pwmValue == 255) {&lt;br /&gt;
          fadeDirection = 0;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
       pwmValue--;&lt;br /&gt;
       if (pwmValue == 0) {&lt;br /&gt;
          fadeDirection = 1;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // PB1ピンを出力に設定して、Timer/Counter1をPWMモードに設定する&lt;br /&gt;
 // また、OCR1Aレジスタの初期値を0に設定して、Timer/Counter1の比較一致A割り込みを有効にする&lt;br /&gt;
 void init()&lt;br /&gt;
 {&lt;br /&gt;
    DDRB   |= (1 &amp;lt;&amp;lt; LED_PIN);                // PB1を出力に設定&lt;br /&gt;
    TCCR1A  = (1 &amp;lt;&amp;lt; COM1A1) | (1 &amp;lt;&amp;lt; WGM10);  // 非反転PWMモード&lt;br /&gt;
    TCCR1B  = (1 &amp;lt;&amp;lt; WGM12) | (1 &amp;lt;&amp;lt; CS11);    // PWM周波数を約976[Hz]に設定&lt;br /&gt;
    OCR1A   = 0;                             // 初期PWM値を0に設定&lt;br /&gt;
    TIMSK1  = (1 &amp;lt;&amp;lt; OCIE1A);                 // Timer/Counter1の比較一致A割り込みを有効化&lt;br /&gt;
 &lt;br /&gt;
    sei();  // 全体の割り込みを有効化&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void main()&lt;br /&gt;
 {&lt;br /&gt;
    init();&lt;br /&gt;
 &lt;br /&gt;
    while (1) {&lt;br /&gt;
       // メインループ処理&lt;br /&gt;
       // ...略&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:AVR]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>