2018年10月24日水曜日

MSP430マイコン 備忘録2 (MSP430F2619)

 M2の小西です。
今回もMSPマイコンについて備忘録2を記します。

<プログラム内容>
可変抵抗を動かしてアナログ指令値を変えることで、PWM変調にてLEDの明るさを更新させます。また、分周したクロックも別のLEDに出力することで可視化します。

ピン配置と役割は以下の通り。
P4.1 -> Red LED........; PWM変調調光
P4.2 -> Blue LED.......; 1Hz クロックで点滅
P4.3 -> Green LED.....; 2kHz クロックで点滅
P6.0 -> 可変抵抗入力..; AD変換入力

メインクロックとは別でクロックが2つもあるのは、メインクロックから別のクロックを作ってみるテストです。


まずはフローチャート
Timer-Bのコンペアマッチに反応してG_LEDを反転させCLK1が生成される。CLK1に従ってインクリメントするTB_CM変数がTpwm2にコンペアマッチすると、B_LEDが反転し、CLK2が生成される。

次に、回路図。
3つのLEDはタイマーBの出力に割り当てられているポート4にそれぞれ接続。可変抵抗の中間電位をA0に入力してアナログ指令値を得る

また、実験風景。
各LEDの役割は示した通り。下記の動画では、左上の可変抵抗をグリグリ回して赤LEDの明るさを変化させる


可変抵抗を回すことで赤LEDの明るさが変化しています。青LEDは約1Hzで、緑LEDは視認できませんが2kHzで点滅しているのが確認できます。



サンプルコード
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


前回の備忘録1でも触れた内容については触れず、新しく出てきたところだけ触れていきます。

<51行> 
50.   // Setup ADC //   The ADC12OSC is generated internally and is in the 5-MHz range
51.   ADC12CTL0  = SHT0_2 + SHT1_2 + REFON + ADC12ON;
 AD変換器に関する初期設定1
 ( U. G. P.575   23.3.1 ADC12CTL0,  ADC12 Control Register 0 )
        ・SHT0x,1x : ADC12の0チャネル-7チャネル, 8チャネル-15チャネルに関する
          Sample Hold Timeを指定する。ADC用クロックを何周期使ってアナログ入力値を
          安定させるかを決めます。

//      0000:4       ADC12CLK cycles     0001:8    ADC12CLK cycles
//      0010:16     ADC12CLK cycles     0011:32   ADC12CLK cycles
//      0100:64     ADC12CLK cycles     0101:96   ADC12CLK cycles
//      0110:128   ADC12CLK cycles     0111:192  ADC12CLK cycles
//      1000:256   ADC12CLK cycles     1001:384  ADC12CLK cycles
//      1010:512   ADC12CLK cycles     1011:768  ADC12CLK cycles
//      1100:1024 ADC12CLK cycles     1101:1024 ADC12CLK cycles
//      1110:1024 ADC12CLK cycles     1111:1024 ADC12CLK cycles


        ・MSC : マルチサンプリング変換フラグ。AD変換は16チャネル用意されているが、あるタイミングで
       全てのチャネルの変換を開始する場合に立てる。 
      
        ・REFON : 変換に使用する基準電圧をマイコン内部で生成するか決定する。使わないならエコのためOFF
        ・REF2_5V : 内蔵基準電圧の値を決める
   //   0 : 1.5V
   //   1 : 2.5V

        ・ADC12ON : 1を立てるとADC12が起動する
        ・ENC : Enable Convertion 1を立てるとAD変換が使用可能になる
        ・ADC12SC : 初期設定完了後に、1を立てたときからAD変換が開始される



<52行> 
52.   ADC12CTL1  = SHP + ADC12SSEL_0;
 ( U. G. P.577   23.3.2 ADC12CTL1,  ADC12 Control Register 1 )
 AD変換器に関する初期設定2
        ・SHSx : Sample and Hold を開始するソースを選択する, Timerを選択するとCMがフラグとなる
   //   00 : ADC12SC bit           01 : Timer_A.OUT1
   //   10 : Timer_B.OUT0        11 : Timer_B.OUT1

        ・SHP : Sample and Hold のモード選択
   //   0 : SAMPCON signal is sourced from the sample-input signal.
   //   1 : SAMPCON signal is sourced from the sampling timer.

        ・ADC12SSELx : AD変換のクロックソースを選択
   //   00 : ADC12OSC     01 : ACLK
   //   10 : MCLK             11 : SMCLK

<54行> 
54.   ADC12MCTL0 = SREF_0 + INCH_0;    // VRef = AVcc, channel = A0
 ( U. G. P.578   23.3.4 ADC12MCTL0,  ADC12 Conversion Memory Control resisters )
 AD変換器に関する初期設定3
        ・EOS : End of sequency    1を立てると、複数チャネルを同時に変換するモードにて最後のチャネルであることを示す

        ・SREFx : AD変換に使用する基準電圧を+側・-側ともに選択
        // 000 VR+ = AVCC     and VR- = AVSS
        // 001 VR+ = VREF+   and VR- = AVSS
        // 010 VR+ = VeREF+ and VR- = AVSS
        // 011 VR+ = VeREF+ and VR- = AVSS
        // 100 VR+ = AVCC     and VR- = VREF-/ VeREF- 
        // 101 VR+ = VREF+   and VR- = VREF-/ VeREF- 
        // 110 VR+ = VeREF+ and VR- = VREF-/ VeREF- 
        // 111 VR+ = VeREF+ and VR- = VREF-/ VeREF

        ・INCHx : AD変換するチャネルを選択 ( 1010のTDは内部温度を測れる内蔵温度センサ )
        //  0000 A0,       0001 A1,            0010 A2,          0011 A3,              0100 A4,
        //  0101 A5,       0110 A6,            0111 A7,          1000 VeREF+,      1001 VREF- /VeREF-
        //  1010 Temperature diode,         1011 (AVCC - AVSS) / 2
        //  1100 GND,     1101 GND,         1110 GND,        1111 GND


<68行> 
67.   // setup Timer_B //
68.   TBCTL = TBSSEL_2 + ID_0 + MC_1 + TBIE;
 タイマーBに関する初期設定1
 ( U. G. P.391   13.3.1 Timer_B Control Register TBCTL )

        ・TBSSEL : タイマーBのクロックソースを選択
        //   00 TBCLK :外部入力のタイマー用クロック(P1.0 TBCLK)
        //   01 ACLK  :補助クロック(外部32768HZ発振子) /(div)
        //   10 SMCLK :サブシステムクロック(DCOから) /(div)
        //   11 INCLK :外部入力クロック(P2.1 TAINCLK)


<74-75行> 
74.   TBCCR0 = Tpwm;

75.   TBCCR1 = Tpwm*0.3;
        ・TBCCRx : 各チャネルごとにコンペアマッチする値を指定する(タイマーの周期やデューティを指定)


<76-77行> 
76.   TBCCTL0 = CCIE;

77.   TBCCTL1 = OUTMOD_7;     //
        ・TBCCTLx : 各チャネルごとにタイマーの設定をする 

<89-100行> 
93.   #pragma vector = TIMERB0_VECTOR     // Datasheet; Interrupt Vector Addresses P.16
94.    __interrupt void TIMER_B0(void)     // Timer interrupt 発生時に割り込む関数の定義
95.    {

99.    }        ・タイマーBによる割り込み動作を記述する


<117行> 
117.  ADC12CTL0 |= ADC12SC;           // ADC12 enable, start conversion
        ・SCフラグを立ててADC12の変換開始する。変換が終了すると自動的にSC=0となるから、
    もう一度変換をかけたいときはもう一度SC=1とすればいい。


<122行> 
122.   if(INTERRUPT_FLAG == 1){    }
        ・タイマーBの割り込み時にINTERRUPT_FLAGが立つので、そのつど if ルートに入る


<123行> 
123.   AD0 = ADC12MEM0;
       ・A0の変換結果はADC12MEM0に格納されるので、int型変数AD0に読みだす。

以上。
-------------------------------------------------------

これで、ボタンスイッチ入力・PWM出力・AD変換・割り込み[タイマー、AD変換]までできるようになりました。
次回はポートからの割り込みとLCDへの出力あたりを書けたらなと思います。

0 件のコメント:

コメントを投稿