第2のチュートリアルではタイマーについて紹介し、タイマー使用による割込み機能について解説した。本チュートリアルではPWM 設定のタイマーを使用し同様の動作を行う。

 PWMについて

PWMはPulse Width Modulation(パルス幅変調)の略語である。割込み機能が不要となるようにタイマーを設定してみよう。タイマー自体は動作し一旦設定され、プロセッサはスリープモードを維持する。

PWMタイマー機能

TimerAMSP430のタイマーには次の特徴がある:様々な方法で設定可能な複数の多様なレジスターがある。タイマーの出力状態を表す出力ピンもある。例を挙げてみよう。

左図では、タイマーは0からTA0CCR0まで数えるように設定されている。その下のグラフは出力モードにより出力ピンが出す波形を表す。

ここでは出力モード7(プログラムコードでOUTMOD_7で表現)を使用する。

その場合、TACCR1がTACCR0に近づくとピンのON状態が長く、OFF状態が短くなる。

逆にTACCR1が0に近づくとピンのON状態が短く、OFF状態が長くなる。

 

プログラム

チュートリアルC-03と同様(F5659Utils.h)のユーティリティーを使用し、プログラムは以下の通りとなる。

--------------------

#include <msp430F5659.h>
#include "F5659Utils.h"

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;            //    Stop WDT
    SetCoreVoltage(VCORE19);             //    Set the core to 1.9V
    SetFLL(24);                          //    Set SMCLK to 24 MHz
    P1DIR |= 0x04;                       //    P1.2 output
    P1SEL |= 0x04;                       //    P1.2 as timer output
    TA0CCR0 = 32768-1;                   //    PWM Period
    TA0CCTL1 = OUTMOD_7;                 //    CCR1 reset/set
    TA0CCR1 = 16384;                     //    CCR1 PWM duty cycle
    TA0CTL = TASSEL_1 + MC_1 + TACLR;    //    SMCLK, up mode, clear TAR
    __bis_SR_register(LPM0_bits);        //    Enter LPM0(sleep)
}

--------------------

結果は以下の通り:

AccurateClock

 

 

 

 

 

 

 

 

 

この方法には以下の利点がある:

  • プログラムがより簡単になる
  • 割込み機能が不要
  • プロセッサ設定後PWM用の負荷率が0になるので、他のタスクに使用可能となる
  • 実行中にパルス幅の変更が可能である

最後の利点については、次章でAD変換を紹介し入力電圧によるLED輝度の変更プログラムを解説する。