Sim's blog

電子工作はじめてみました

TIMER_AでPWMする

2008-08-25 23:44:56 | MSP430
ツインT発振器の続きです。トラ技9月号のマルチテスターキットで色々な波形を見ようとしています。

MSP430のTIMER_AはPWMができるようになっています。色々なduty比のパルスが見れます。
#include <msp430x20x3.h>

void main(void)
{
    int duty = 1000;

    WDTCTL = WDTPW + WDTHOLD;   // WDT停止
    P1DIR |= 4;                 // P1.2を出力にする
    P1SEL |= 4;                 // P1.2をTA1にする
    CCR0 = 2000 - 1;            // PWM周期(500Hz ... 2ms)
    CCTL1 = OUTMOD_7;           // CCR1 reset/set
    CCR1 = duty;                // CCR1 PWM duty cycle
    TACTL = TASSEL_2 + MC_1;    // SMCLK, up mode

    _BIS_SR(CPUOFF);            // LPM0に入る
}

ソースはTIが公開しているサンプルを参考にしました。

使っているのはF2013です。F2013は何も設定しないと1MHzで動作しています。up modeだと、CCR0に設定した値になると0に戻る動作をします。2000にしているので、2ミリ秒で1周期です。途中でCCR1になったところで出力が反転します。出力はP1.2なので4pinです。

duty = 1000 (1:1)

0.5ms/divで4divくらいなので1周期2ミリ秒で、計算どおりです。

デバッガでduty = 1000;の代入が終わったところまで動かしてから、dutyの値を書き換えてやるとデューティ比が変わります。定数を変えても再コンパイルや書き込みがいらないので、ちょこちょこっと試すのには便利です。

duty = 500 (1:3)


duty = 1500 (3:1)


実験の様子です。

右の方にいるICがMSP430 F2013で、右上にいるeZ430を使って、書き込み/デバッグしています。左上の方にいるのは前回のツインT発振器です。

TIの無料コンパイラCCEはeclipseベースなので結構重いですが、とても便利です。