2014/04/12

PWM制御でLED点滅

 今度はLED点滅にPWM(Pulse Width Modulation)を使ってみます。

ゴール


  • LEDの点滅周期は約2秒(点灯1秒、消灯1秒)
  • PWM制御で「ふわっと点灯」、「ふわっと消灯」を実現する

ふわっと点灯、ふわっと消灯


 「ふわっと」を実現するため、LEDの明るさを制御します。LED輝度制御方法として今回はPWMを使います。PWMは変調方式の一つで、パルス波のDuty比(点灯と消灯の比率)を変化させることにより変調を行う方式です。簡単に言うと、
  • LEDを超高速点滅させる
  • 点滅時のDuty比を変えることにより明るさを調節する
となります。
 「超高速点滅」とは、例えば1秒間に1,000回点滅のように点滅してることが人間に認識できないほど速くします。
 「Duty比を変えることにより明るさを調節」というのは、例えばDuty比=90%(点灯90%,消灯10%)とDuty比=10%(点灯10%,消灯10%)ではDuty比=90%のほうが明るく見えるということです。

AVRでのPWM制御について


 AVRはタイマ/カウンタをPWMモードにすることにより、PWM制御を行うことができます。8bitタイマと16bitタイマがありますが、Duty比の指定は8bit(=256段階)あれば十分なので8bitタイマであるTimer/Counter0を使います。タイマの動作モードはFast PWM Mode (WGM2:0=3)を使います。このモードはパルス波周期が256 timer clock固定で、Duty比はOCR0Aレジスタで指定できます。Timer clockを1MHzにすると、LEDの点滅回数は1秒間に3,900回ぐらいになります。タイマで作ったPWM信号はOC0A(PD6ピン)に出力されます。

LEDとPD6ピンの接続


 参考文献2を見るとマイコンのPB5端子の先にLEDが接続されています。PD6端子でLEDを制御するため、PD6端子とPB5端子を接続する必要があります。どちらの端子もマイコンボードのコネクタに接続されているので、コネクタ上で接続するのが簡単です。
図1 コネクタ上の接続(PB5端子とPD6端子)

 なお、PD6端子とPB5端子がショートしないようにプログラム上でPB5端子をInputに設定しておきます。

プログラム


 例によってdebian環境(avr-gcc+avr-libc)で作成しています。

リスト1 main.c

/*
 * LED点滅プログラム(PWM制御)
 *
 * For AE-ATmega borad
 *
 * Ver0.1 2013/04/12
 */

/*
 * AE-ATmega boardはPORTB bit5にLEDが接続されている。
 * このLEDをPWM制御で点灯させるため、タイマ出力であるPORTD Bit6を
 * LEDに接続する。(ショートしないようにPORTB bit5は入力モードに
 * しておく)
 */

#include <avr/io.h>
#include <util/delay.h>

int main() {
  unsigned char i = 0;

  DDRB = 0x00;          // PORTB bit5を入力モードにする
  DDRD = _BV(DD6);      // PORTD bit6を出力モードにする

  /* Set 8-bit Timer Register */
  TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(CS00);

  /* タイマ設定
   * clkI/O      : 1MHz (= 内蔵OSC 8MHz + CLKDIV8)
   * プリスケーラ: なし
   * モード      : Mode3 (高速PWM/0xFF)
   * OC0A端子    : 非反転モードで使用
   */

  while(1) {
    while(i<0xFF) {     // 2mSec間隔で輝度を上げていく
      OCR0A = ++i;
      _delay_ms(2);
    }
    _delay_ms(1000);    // 最高輝度で1秒保持

    while(i>0x00) {     // 2mSec間隔で輝度を下げていく
      OCR0A = --i;
      _delay_ms(2);
    }
    _delay_ms(1000);    // 最低輝度で1秒保持
  }
}

動画1 点滅の様子

参考文献


  1. Atmel ATmega48P/V 88P/V 168P/V datasheet
  2. ATmega168/328マイコンボード回路図

0 件のコメント:

コメントを投稿

【備忘録】時系列データの編集方法(R言語, tidyverse)

TimeSeries.knit 1 サンプルデータ作成 2 日付単位に集計する 2.1 月毎集計 2.2 四半期毎集計 ...