MSP430 LaunchPad で PWM
今回はPWMを使ってみます。
PWMはサーボモーターを制御したり、LEDをフワっと点灯させたり(コンデンサとかでもできるけど)するのに使います。
ブザー+PWMで単音のメロディを作ったりしても楽しいです。
前回Timer割り込みでLEDを制御したプログラムを利用したいと思います。
赤色LED(P1.6)をPWM制御に変えてみましょう。
++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include/* MSP430G2553用のヘッダファイル */ #include /* uint8_t とか定義してあるヘッダファイル */ void main(void) { WDTCTL = WDTPW +WDTHOLD; /* ウォッチドッグタイマーを止める*/ /*----- クロックキャリブレーション -----*/ if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); } /* 1Mhz */ BCSCTL1 = CALBC1_1MHZ; /* Set range */ DCOCTL = CALDCO_1MHZ; /* Set DCO step + modulation */ /*--------------------------------------------*/ P1DIR |= BIT6 + BIT0; /* P1.0とP1.6を出力に設定 */ P1OUT &= ~(BIT6 + BIT0); /* 最初は両方のLEDを消灯 */ P1SEL |= BIT6; /* P1.6 のPWM機能を選択します */ CCR0 = 1000; /* PWMの周期を決めます。 period/2 */ CCR1 = 0; /* 適当にdutyを決めます。とりあえず0*/ CCTL1 = OUTMOD_6; /* CCR1 toggle/set */ CCR2 = 1000; TACTL = TASSEL_2 + MC_3 + TAIE; /* SMCLK, up-down mode */ CCTL2 = CCIE; /* タイマー割り込みスタート */ __bis_SR_register(LPM0_bits + GIE); /* LPM0モード, 割り込み許可 */ } /*! ************************************************** * @brief タイマー割り込みの処理 ******************************************************/ #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A(void) { switch( TA0IV ) { static int16_t pwm_val; static uint8_t pwm_dire; case 2: break; // CCR1 not used //------------------------------------// // 2msec interrupt //------------------------------------// case 4: if ( pwm_dire == 0 ) { pwm_val -= 10; } else { pwm_val += 10; } if (pwm_val <= 0 ) { pwm_dire = 1; pwm_val = 0; } else if ( pwm_val >= 1000 ) { pwm_dire = 0; pwm_val = 1000; } CCR1 = pwm_val; break; // CCR2 case 10: break; // overflow } }
+++++++++++++++++++++++++++++++++++++++++++++++++
どうです?LEDがフワフワなりましたか?