「MSP430G2553 - ADコンバータ」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

 
(同じ利用者による、間の2版が非表示)
36行目: 36行目:
<br>
<br>
MSP430G2553の省電力機能と組み合わせることで、バッテリー駆動のセンサアプリケーションに最適な低消費電力システムを構築することができる。<br>
MSP430G2553の省電力機能と組み合わせることで、バッテリー駆動のセンサアプリケーションに最適な低消費電力システムを構築することができる。<br>
<br><br>
== ADC10モジュールの各レジスタ ==
MSP430G2553のADC10モジュールには、制御レジスタ、データ格納レジスタ、DTC (Data Transfer Controller) 関連のレジスタ等、7つの主要なレジスタが存在する。<br>
<br>
[[ファイル:MSP430G2553 ADC10 Registers.png|フレームなし|中央]]
<br>
==== ADC10CTL0 / ADC10CTL1 (制御レジスタ) ====
これらの16ビットレジスタは、ADC10モジュールの心臓部とも言える存在である。<br>
ADC10CTL0レジスタは、リファレンス電圧の選択、サンプリング時間、内蔵リファレンスの制御、モジュールの有効化、割り込み制御を担当する。<br>
ADC10CTL1レジスタは、入力チャンネルの選択、クロックソースと分周比の設定、変換モードの選択を行う。<br>
<br>
例えば、SREF2、SREF1、SREF0という3ビットのフィールドは、リファレンス電圧源を選択する役割を持つ。<br>
<br>
==== ADC10MEM (変換結果格納レジスタ) ====
この16ビットレジスタはデータ格納専用のレジスタであり、実際には10ビットの変換結果を格納する。<br>
ADC10CTL1レジスタのADC10DFビットの設定により、変換結果を上位10ビット (ビット15~6) に格納、または、下位10ビット (ビット0~9) に格納するかを選択できる。<br>
<br>
上位10ビットモードは、変換結果を直接16ビット値として扱う場合に便利である。<br>
例えば、変換結果を0~1023の範囲から0~65472の範囲にスケーリングする場合に活用する。<br>
<br>
下位10ビットモードは、0~1023の範囲でそのまま扱う場合に適している。<br>
<br>
多くのアプリケーションでは、計算の簡便性から下位10ビットモードが使用することが多い。<br>
<br>
==== ADC10AE0 (アナログ入力有効化レジスタ) ====
ADC10AE0レジスタは8ビットのレジスタであり、各ビットが対応するアナログ入力チャンネル (A0~A7) の有効化を制御する。<br>
<u>このレジスタの設定を忘れた場合、ピンがデジタルI/Oモードのままになってしまい、アナログ信号を正常に読み取ることができない。</u><br>
<br>
例えば、チャンネルA0 (P1.0) と A1 (P1.1) をアナログ入力として使用する場合、<code>ADC10AE0 = BIT0 | BIT1;</code> というコードを記述する。<br>
<br>
実務では、このレジスタの設定は必須である。<br>
ADC10CTL0 / ADC10CTL1レジスタを正しく設定していても、ADC10AE0レジスタの設定を忘れた場合、変換結果が常に0 あるいは 不定値を示す原因となる。<br>
<br>
==== ADC10SA (DTC開始アドレスレジスタ) ====
ADC10SAレジスタは16ビットのアドレスレジスタで、DTC (Data Transfer Controller) 機能を使用する場合に重要である。<br>
<br>
DTCは、CPUの介入なしに変換結果を自動的にメモリに転送する便利な機能である。<br>
ADC10SAレジスタには、変換結果を格納するメモリ領域の開始アドレスを設定する。<br>
<br>
例えば、変換結果を配列 <code>unsigned int adc_results[10];</code> に格納する場合、<code>ADC10SA = (unsigned int)adc_results;</code> と指定する。<br>
DTCは、このアドレスから順番に変換結果を書き込む。<br>
この機能を使用することにより、複数チャンネルの連続変換や同じチャンネルの複数回サンプリングを、CPUの負荷をあまり掛けずに実行することができる。<br>
<br>
==== ADC10DTC0 / ADC10DTC1 (DTC制御レジスタ) ====
これら2つは8ビットレジスタであり、DTCの動作を詳細に制御する。<br>
<br>
ADC10DTC0は主にDTCのモード設定を行い、ADC10DTC1は転送回数を指定する。<br>
<br>
ADC10DTC0レジスタには2つの重要なビットがある。<br>
* ADC10CT
** ビット0
**: <u>連続転送モード</u> を制御する。
** ビット1
**: 指定した回数の転送が完了した後も、自動的に最初のアドレスから転送を再開する。
**: これは、センサデータを連続的に収集し続ける場合に便利である。
*: <br>
* ADC10TB
** ビット1
**: <u>2ブロック転送 (Ping-Pongモード)</u> を有効化する。
**: 2つのメモリブロックを交互に使用することにより、一方のブロックにデータを転送している間に、もう一方のブロックのデータをCPUが処理できるようになる。
**: これは、リアルタイム性が要求されるアプリケーションで有用である。
<br>
ADC10DTC1レジスタは、転送回数を8ビット値で指定する。<br>
1〜256回までの任意の転送回数を指定することができる。<br>
* 0x00
*: 256回の転送
* 0x01
*: 1回の転送
* 0x02
*: 2回の転送
* 0xFF
*: 255回の転送
<br><br>
<br><br>


74行目: 147行目:
| A10 || 内部温度センサ || MSP430G2553の内蔵温度センサ
| A10 || 内部温度センサ || MSP430G2553の内蔵温度センサ
|-
|-
| A11 || (VCC - VSS) / 2 || 電源電圧の半分の値
| A11 || <math>\dfrac{\mbox{VCC} - \mbox{VSS}}{2}</math> || 電源電圧の半分の値
|-
|-
| その他 || 内部信号 || デバイス固有の内部信号
| その他 || 内部信号 || デバイス固有の内部信号
669行目: 742行目:
     ADC10AE0 = BIT1;
     ADC10AE0 = BIT1;
   
   
     // P1.3 を VEREF+ / VEREF- として設定
     // 外部リファレンス電圧の使用について
     // (ハードウェアで P1.3 に外部リファレンス電圧を接続する必要がある)
    // SREF_7の設定により、ハードウェアが自動的にVEREF+とVEREF-ピンをリファレンス入力として使用する
    //
    // ハードウェア接続:
    // - 基準電圧源の正側をVEREF+ピン (P1.3) に接続
     // - 基準電圧源の負側をVEREF-ピン (P1.3) に接続
    //
    // 注意:P1SELやP1SEL2の設定は不要である
   
   
     while(1)
     while(1)

2025年12月27日 (土) 07:02時点における最新版

概要

MSP430G2553マイコンには、ADC10モジュールと呼ばれる10ビットのAD変換器が内蔵されている。
このADC10モジュールは、SAR (Successive Approximation Register: 逐次比較) 方式を採用しており、高速かつ低消費電力でアナログ信号をデジタル値に変換することができる。

ADC10モジュールの特徴を以下に示す。

  • 変換方式
    10ビット SAR (逐次比較)型ADC
  • 入力チャンネル数
    最大8チャンネル(A0~A7)の外部アナログ入力
  • 内部チャンネル
    内部温度センサ、VCC/2、VREFなどの内部信号も測定可能
  • 変換速度
    最大200ksps (ADC10SR=0の場合、ADC10CLK=6.3[MHz]時)
    最大50ksps (ADC10SR=1の場合、省電力モード)
  • リファレンス電圧
    内蔵リファレンス: 1.5[V]、2.5[V]
    外部リファレンス: VEREF+、VEREF-ピン使用
    VCC/VSS を基準電圧として使用可能
  • DTC機能
    Data Transfer Controller (DTC) により、CPU介入なしで変換結果をメモリに自動転送可能
  • 変換モード
    シングルチャンネル単一変換
    シングルチャンネル連続変換
    シーケンスチャンネル単一変換
    シーケンスチャンネル連続変換
  • トリガーソース
    ソフトウェアトリガー
    Timer_A からのトリガー
  • 割り込み機能
    変換完了時に割り込み発生可能
  • 省電力モード
    ADC10SR ビットにより、変換速度を落として消費電力を削減可能


ADC10モジュールは、センサ信号の読み取り、バッテリー電圧の監視、アナログ信号処理など、幅広い用途に使用される。
SAR方式のため、デルタシグマ型と比較して変換速度が速く、一般的なセンサ信号の読み取りに適している。

MSP430G2553の省電力機能と組み合わせることで、バッテリー駆動のセンサアプリケーションに最適な低消費電力システムを構築することができる。


ADC10モジュールの各レジスタ

MSP430G2553のADC10モジュールには、制御レジスタ、データ格納レジスタ、DTC (Data Transfer Controller) 関連のレジスタ等、7つの主要なレジスタが存在する。


ADC10CTL0 / ADC10CTL1 (制御レジスタ)

これらの16ビットレジスタは、ADC10モジュールの心臓部とも言える存在である。
ADC10CTL0レジスタは、リファレンス電圧の選択、サンプリング時間、内蔵リファレンスの制御、モジュールの有効化、割り込み制御を担当する。
ADC10CTL1レジスタは、入力チャンネルの選択、クロックソースと分周比の設定、変換モードの選択を行う。

例えば、SREF2、SREF1、SREF0という3ビットのフィールドは、リファレンス電圧源を選択する役割を持つ。

ADC10MEM (変換結果格納レジスタ)

この16ビットレジスタはデータ格納専用のレジスタであり、実際には10ビットの変換結果を格納する。
ADC10CTL1レジスタのADC10DFビットの設定により、変換結果を上位10ビット (ビット15~6) に格納、または、下位10ビット (ビット0~9) に格納するかを選択できる。

上位10ビットモードは、変換結果を直接16ビット値として扱う場合に便利である。
例えば、変換結果を0~1023の範囲から0~65472の範囲にスケーリングする場合に活用する。

下位10ビットモードは、0~1023の範囲でそのまま扱う場合に適している。

多くのアプリケーションでは、計算の簡便性から下位10ビットモードが使用することが多い。

ADC10AE0 (アナログ入力有効化レジスタ)

ADC10AE0レジスタは8ビットのレジスタであり、各ビットが対応するアナログ入力チャンネル (A0~A7) の有効化を制御する。
このレジスタの設定を忘れた場合、ピンがデジタルI/Oモードのままになってしまい、アナログ信号を正常に読み取ることができない。

例えば、チャンネルA0 (P1.0) と A1 (P1.1) をアナログ入力として使用する場合、ADC10AE0 = BIT0 | BIT1; というコードを記述する。

実務では、このレジスタの設定は必須である。
ADC10CTL0 / ADC10CTL1レジスタを正しく設定していても、ADC10AE0レジスタの設定を忘れた場合、変換結果が常に0 あるいは 不定値を示す原因となる。

ADC10SA (DTC開始アドレスレジスタ)

ADC10SAレジスタは16ビットのアドレスレジスタで、DTC (Data Transfer Controller) 機能を使用する場合に重要である。

DTCは、CPUの介入なしに変換結果を自動的にメモリに転送する便利な機能である。
ADC10SAレジスタには、変換結果を格納するメモリ領域の開始アドレスを設定する。

例えば、変換結果を配列 unsigned int adc_results[10]; に格納する場合、ADC10SA = (unsigned int)adc_results; と指定する。
DTCは、このアドレスから順番に変換結果を書き込む。
この機能を使用することにより、複数チャンネルの連続変換や同じチャンネルの複数回サンプリングを、CPUの負荷をあまり掛けずに実行することができる。

ADC10DTC0 / ADC10DTC1 (DTC制御レジスタ)

これら2つは8ビットレジスタであり、DTCの動作を詳細に制御する。

ADC10DTC0は主にDTCのモード設定を行い、ADC10DTC1は転送回数を指定する。

ADC10DTC0レジスタには2つの重要なビットがある。

  • ADC10CT
    • ビット0
      連続転送モード を制御する。
    • ビット1
      指定した回数の転送が完了した後も、自動的に最初のアドレスから転送を再開する。
      これは、センサデータを連続的に収集し続ける場合に便利である。

  • ADC10TB
    • ビット1
      2ブロック転送 (Ping-Pongモード) を有効化する。
      2つのメモリブロックを交互に使用することにより、一方のブロックにデータを転送している間に、もう一方のブロックのデータをCPUが処理できるようになる。
      これは、リアルタイム性が要求されるアプリケーションで有用である。


ADC10DTC1レジスタは、転送回数を8ビット値で指定する。
1〜256回までの任意の転送回数を指定することができる。

  • 0x00
    256回の転送
  • 0x01
    1回の転送
  • 0x02
    2回の転送
  • 0xFF
    255回の転送



ADC10の詳細機能

入力チャンネル

MSP430G2553のADC10モジュールは、以下の入力チャンネルを備えている。

外部アナログ入力チャンネル (A0~A7)
チャンネル ポート 備考
A0 P1.0 ADC10AE0 ビット0で有効化
A1 P1.1 ADC10AE0 ビット1で有効化
A2 P1.2 ADC10AE0 ビット2で有効化
A3 P1.3 ADC10AE0 ビット3で有効化
A4 P1.4 ADC10AE0 ビット4で有効化
A5 P1.5 ADC10AE0 ビット5で有効化
A6 P1.6 ADC10AE0 ビット6で有効化
A7 P1.7 ADC10AE0 ビット7で有効化


内部チャンネル
チャンネル 機能 説明
A10 内部温度センサ MSP430G2553の内蔵温度センサ
A11 VCCVSS2 電源電圧の半分の値
その他 内部信号 デバイス固有の内部信号


チャンネル選択は、ADC10CTL1レジスタのINCHxビット (ビット15~12) で行う。
外部入力を使用する場合は、対応するポートピンをアナログ機能に設定する必要がある。(ADC10AE0レジスタを使用)

リファレンス電圧

ADC10の変換結果は、選択したリファレンス電圧に対する入力電圧の比率で決定される。

リファレンス電圧の選択 (ADC10CTL0レジスタのSREFxビット)
SREF2 SREF1 SREF0 正側リファレンス 負側リファレンス 説明
0 0 0 VCC VSS 電源電圧を基準として使用 (最も一般的)
0 0 1 VREF+ VSS 内蔵リファレンス(1.5[V] or 2.5[V]) と VSS
0 1 0 VEREF+ VSS 外部リファレンス(VEREF+)とVSS
0 1 1 VEREF+ VEREF- 外部差動リファレンス (高精度測定用)
1 0 0 VCC VREF- VCCと内蔵リファレンス負側
1 0 1 VCC VEREF- VCCと外部リファレンス負側
その他 - - - - 未定義の組み合わせ


内蔵リファレンス電圧
項目 設定ビット 説明
電圧選択 REF2_5V (ADC10CTL0 ビット5) 0:1.5[V]
1:2.5[V]
リファレンス有効化 REFON (ADC10CTL0 ビット4) 1:内蔵リファレンス有効化
安定化時間 - 約30[us] (REFONビット設定後)


外部リファレンス電圧
ピン ポート 機能 説明
VEREF+ P1.3 正側外部リファレンス 外部の精密基準電圧源を接続
VEREF- P1.3 負側外部リファレンス 差動測定時の負側基準電圧
VREF+ P1.4 内蔵リファレンス出力
またはバッファ入力
内蔵リファレンスを外部に出力
または
外部リファレンスをバッファリング


Data Transfer Controller (DTC)

DTCは、ADC変換完了後に変換結果を自動的にメモリに転送する機能である。
CPU介入なしで複数回の連続変換とデータ転送を実行できるため、CPUの負荷を軽減し、消費電力を削減できる。

DTCの設定
レジスタ 機能 説明
ADC10SA 転送先アドレス設定 データ転送先のメモリアドレスを16ビットで指定
ADC10DTC0 DTC有効化と転送制御 DTC機能の有効化、連続転送モード設定
ADC10DTC1 転送回数設定 自動転送を行う回数を8ビットで指定(1~256回)


変換タイミングとクロック

ADC10の変換には、ADC10CLKと呼ばれる専用のクロックを使用する。

  • 変換時間
    1回の変換には、13クロックサイクル必要
     変 換 時 間 =13 ADC10CLK 周 波 数  [秒]


ADC10CLK のソース選択 (ADC10CTL1レジスタのADC10SSELxビット)
ADC10SSELx クロックソース 説明
00 ADC10OSC 内蔵オシレータ (約5[MHz]、電源電圧依存)
01 ACLK 補助クロック (通常32.768[kHz]、低速動作用)
10 MCLK メインシステムクロック (高速動作用)
11 SMCLK サブシステムマスタークロック (推奨設定)


クロック分周 (ADC10CTL1レジスタのADC10DIVxビット)
ADC10DIVx 分周比 例 : 入力 1[MHz]時の出力
000 /1 1 [MHz]
001 /2 500 [kHz]
010 /3 333 [kHz]
011 /4 250 [kHz]
100 /5 200 [kHz]
101 /6 167 [kHz]
110 /7 143 [kHz]
111 /8 125 [kHz]


サンプル&ホールド

ADC10は、内蔵のサンプル&ホールド回路を備えている。
サンプル期間は、ADC10CTL0レジスタのADC10SHTxビット (ビット11~10) で設定する。

入力インピーダンスが高い信号源の場合は、より長いサンプル時間が必要となる。

ADC10SHTx サンプル時間 クロック数 例: ADC10CLK=1MHzの場合
00 4 × ADC10CLK 4サイクル 4 μs
01 8 × ADC10CLK 8サイクル 8 μs
10 16 × ADC10CLK 16サイクル 16 μs (推奨設定)
11 64 × ADC10CLK 64サイクル 64 μs (高インピーダンス信号源用)



主要レジスタ

ADC10CTL0 (ADC10 Control Register 0)

ADC10の基本的な動作モードとリファレンス設定を制御するレジスタ。

主要ビット
ビット フィールド名 機能 設定値
15~13 SREF2, SREF1, SREF0 リファレンス電圧選択 上記のリファレンス電圧選択表を参照
11~10 ADC10SHTx サンプル&ホールド時間選択 00:4クロック
01:8
10:16
11:64
9 ADC10SR サンプリングレート選択 0:高速 (最大200[ksps])
1:低速・省電力 (最大50[ksps])
8 REFOUT リファレンス電圧出力有効化 1:VREF+ピンから内蔵リファレンス出力
7 REFBURST リファレンスバッファバーストモード 1:変換中のみリファレンス有効化 (省電力)
6 MSC 複数サンプル変換 1:連続変換モード有効化
5 REF2_5V リファレンス電圧選択 0:1.5[V]
1:2.5[V]
4 REFON 内蔵リファレンス有効化 1:内蔵リファレンス有効
3 ADC10ON ADC10モジュール有効化 1:ADC10モジュール起動
2 ADC10IE 割り込み有効化 1:変換完了時に割り込み発生
1 ADC10IFG 割り込みフラグ 1:変換完了 (読み取り/クリア可能)
0 ENC 変換有効化 1:変換開始可能状態


ADC10CTL1 (ADC10 Control Register 1)

ADC10の入力チャンネル、変換モード、クロック設定を制御するレジスタ。

主要ビット
ビット フィールド名 機能 設定値
15~12 INCHx 入力チャンネル選択 0000:A0
0001:A1
...
0111:A7
1010:A10 (温度)
1011:A11 (VCC2)
11~10 SHSx サンプル&ホールドソース選択 00:ADC10SC
01:Timer_A.OUT1
10:Timer_A.OUT0
11:Timer_A.OUT2
9 ADC10DF データフォーマット 0:バイナリ形式
1:2の補数形式
8 ISSH 入力信号を反転 1:入力信号の極性反転
7~5 ADC10DIVx クロック分周設定 000:/1
001:/2
...
111:/8
4~3 ADC10SSELx クロックソース選択 00:ADC10OSC
01:ACLK
10:MCLK
11:SMCLK
2~1 CONSEQx 変換シーケンスモード選択 00:単一チャンネル単一変換
01:シーケンス変換
10:リピート単一チャンネル
11:リピートシーケンス
0 ADC10BUSY 変換動作中フラグ 1:変換実行中 (読み取り専用)


ADC10MEM (ADC10 Memory Register)

変換結果を格納するレジスタ。
10ビットの変換結果が格納される。
(16ビットレジスタの上位10ビット または 下位10ビット)

ADC10AE0 (ADC10 Analog Enable Register 0)

アナログ入力ピンを有効化するレジスタ。
各ビットが対応するアナログチャンネル (A0~A7) のピンをアナログ機能に設定する。

 // 使用例
 ADC10AE0 = BIT0 | BIT1; // A0とA1を有効化


ADC10AE0レジスタ
ビット チャンネル ポート 機能
0 A0 P1.0 1:P1.0をアナログ入力A0として有効化
1 A1 P1.1 1:P1.1をアナログ入力A1として有効化
2 A2 P1.2 1:P1.2をアナログ入力A2として有効化
3 A3 P1.3 1:P1.3をアナログ入力A3として有効化
4 A4 P1.4 1:P1.4をアナログ入力A4として有効化
5 A5 P1.5 1:P1.5をアナログ入力A5として有効化
6 A6 P1.6 1:P1.6をアナログ入力A6として有効化
7 A7 P1.7 1:P1.7をアナログ入力A7として有効化


ADC10SA (ADC10 Data Transfer Start Address)

DTCモードで使用する、データ転送先のメモリアドレスを指定するレジスタ。

ADC10DTC0, ADC10DTC1 (ADC10 Data Transfer Control)

DTCの動作を制御するレジスタ。

レジスタ アドレス ビット幅 機能 詳細説明
ADC10DTC0 048h 8ビット DTC有効化と
転送制御
ADC10CT (ビット0):連続転送有効化
ADC10TB (ビット1):ブロック転送選択
その他のビット:転送モード制御
ADC10DTC1 049h 8ビット 転送回数設定 1~256回の転送回数を指定
(0x00:256回、0x01:1回、0xFF:255回)


ADC10DTC0レジスタの内容と設定
ビット 名称 機能 説明
0 ADC10CT 連続転送モード 0:1ブロックのみ転送
1:連続転送モード
1 ADC10TB 2ブロック転送 0:1ブロック
1:2ブロック転送 (Ping-Pongバッファ)
2-7 - 予約 将来の使用のため予約 (常に0に設定)



サンプルコード

例1 : 単一チャンネル (A0) の単一変換

以下の例では、A0チャンネル (P1.0ピン) のアナログ電圧を1回だけ読み取りしている。
VCCとVSSをリファレンス電圧として使用しているため、0~VCC の範囲の電圧を 0~1023 のデジタル値に変換する。

  1. ADC10を初期化し、A0チャンネルを選択する。
  2. ソフトウェアトリガーで変換を開始し、変換完了まで待機する。
  3. ADC10MEMレジスタから変換結果を読み取る。


 #include <msp430.h>
 
 volatile unsigned int adc_result;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;   // ウォッチドッグタイマを停止
 
    // ADC10 の設定
    // ADC10SHT_2: サンプル&ホールド時間 = 16 × ADC10CLK
    // ADC10ON: ADC10モジュールを有効化
    ADC10CTL0 = ADC10SHT_2 | ADC10ON;
 
    // INCH_0: 入力チャンネル A0 を選択
    ADC10CTL1 = INCH_0;
 
    // A0 (P1.0) をアナログ入力として有効化
    ADC10AE0 = BIT0;
 
    while(1)
    {
       ADC10CTL0 |= ENC | ADC10SC;     // 変換を有効化してスタート
       while (ADC10CTL1 & ADC10BUSY);  // 変換完了まで待機
       adc_result = ADC10MEM;          // 変換結果を読み取り
 
       __delay_cycles(100000);         // 待機時間
    }
 }


例2 : 複数チャンネル (A0~A2) の連続読み取り (割り込み使用)

以下の例では、A0、A1、A2の3チャンネルを順番に読み取りしている。
割り込みを使用することにより、変換中にCPUが他の処理を実行できる。

  1. ADC10を初期化し、シーケンスモードを設定する。
  2. 割り込みを有効化し、変換を開始する。
  3. 割り込みハンドラで変換結果を読み取り、次のチャンネルに切り替える。


 #include <msp430.h>
 
 volatile unsigned int adc_results[3];  // A0, A1, A2 の結果を格納
 volatile unsigned char channel = 0;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;           // ウォッチドッグタイマを停止
 
    // ADC10 の設定
    // ADC10SHT_2: サンプル&ホールド時間 = 16 × ADC10CLK
    // ADC10ON: ADC10モジュールを有効化
    // ADC10IE: ADC10割り込みを有効化
    ADC10CTL0 = ADC10SHT_2 | ADC10ON | ADC10IE;
 
    // INCH_0: 入力チャンネル A0 から開始
    // CONSEQ_0: 単一チャンネル単一変換モード
    ADC10CTL1 = INCH_0 | CONSEQ_0;
 
    // A0, A1, A2 をアナログ入力として有効化
    ADC10AE0 = BIT0 | BIT1 | BIT2;
 
    __enable_interrupt();               // グローバル割り込みを有効化
 
    while(1)
    {
       ADC10CTL0 |= ENC | ADC10SC;     // 変換開始
       __bis_SR_register(CPUOFF + GIE);// LPM0 に移行(割り込み待ち)
 
       __delay_cycles(100000);         // 待機時間
    }
 }
 
 // ADC10 割り込みサービスルーチン
 #pragma vector=ADC10_VECTOR
 __interrupt void ADC10_ISR(void)
 {
    adc_results[channel] = ADC10MEM;    // 変換結果を保存
 
    channel++;                          // 次のチャンネルへ
    if (channel > 2)
    {
       channel = 0;                     // チャンネルを A0 にリセット
    }
 
    // 次のチャンネルを選択
    ADC10CTL0 &= ~ENC;                  // 変換を無効化(設定変更のため)
    ADC10CTL1 &= ~(INCH_15);            // チャンネルビットをクリア
    ADC10CTL1 |= channel;               // 新しいチャンネルを設定
 
    __bic_SR_register_on_exit(CPUOFF);  // LPM0 から復帰
 }


例3 : DTC を使用した連続変換(複数チャンネル自動スキャン)

以下の例では、DTCを使用してA0~A3の4チャンネルを自動的にスキャンし、結果をメモリ配列に格納する。
CPU介入なしで連続的にデータを収集できるため、非常に効率的である。

  1. ADC10を初期化して、シーケンスモードとDTCを設定する。
  2. 変換を開始すると、DTCが自動的に4チャンネルを順番に変換し、結果をメモリに転送する。
  3. 全チャンネルの変換完了後、割り込みが発生する。


 #include <msp430.h>
 
 volatile unsigned int adc_results[4];  // A0~A3 の結果を格納する配列
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;           // ウォッチドッグタイマを停止
 
    // ADC10 の設定
    // ADC10SHT_2: サンプル&ホールド時間 = 16 × ADC10CLK
    // ADC10ON: ADC10モジュールを有効化
    // ADC10IE: ADC10割り込みを有効化
    ADC10CTL0 = ADC10SHT_2 | ADC10ON | ADC10IE;
 
    // INCH_3: 入力チャンネル A0~A3 をスキャン
    // CONSEQ_1: シーケンス変換モード (A0 -> A1 -> A2 -> A3の順)
    ADC10CTL1 = INCH_3 | CONSEQ_1;
 
    // A0, A1, A2, A3 をアナログ入力として有効化
    ADC10AE0 = BIT0 | BIT1 | BIT2 | BIT3;
 
    // DTC の設定
    ADC10DTC0 = ADC10CT;                // DTC を有効化(連続転送モード)
    ADC10DTC1 = 4;                      // 転送回数 = 4 (4チャンネル)
    ADC10SA = (unsigned int)adc_results;// 転送先アドレスを設定
 
    __enable_interrupt();               // グローバル割り込みを有効化
 
    while(1)
    {
       ADC10CTL0 |= ENC | ADC10SC;       // 変換開始
       __bis_SR_register(CPUOFF + GIE);  // LPM0 に移行(割り込み待ち)
 
       // ここで adc_results[0]~[3] に A0~A3 の変換結果が格納されている
 
       __delay_cycles(100000);           // 待機時間
    }
 }
 
 // ADC10 割り込みサービスルーチン
 #pragma vector=ADC10_VECTOR
 __interrupt void ADC10_ISR(void)
 {
    // 4チャンネル全ての変換が完了したときに割り込みが発生
    __bic_SR_register_on_exit(CPUOFF);  // LPM0 から復帰
 }


例4 : 内部温度センサの読み取り

以下の例では、MSP430G2553の内部温度センサを読み取る方法を示している。

内部温度センサは、INCHx=1010b (チャンネル10) で選択できる。
内蔵リファレンス電圧(1.5V)を使用して、正確な温度測定を行う。

  1. 内蔵リファレンス(1.5V)を有効化して、安定化まで待機する。
  2. 内部温度センサチャンネル (A10) を選択して変換を実行する。
  3. 変換結果から温度を計算する。(データシートの変換式を使用)


 #include <msp430.h>
 
 volatile long temperature;           // 温度(℃ × 10)
 volatile unsigned int adc_result;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;           // ウォッチドッグタイマを停止
 
    // ADC10 の設定
    // ADC10SHT_3 : サンプル&ホールド時間 = 64 × ADC10CLK (温度センサは長めに)
    // REFON : 内蔵リファレンスを有効化
    // ADC10ON : ADC10モジュールを有効化
    // ADC10IE : ADC10割り込みを有効化
    // REF2_5V ビットを設定しないので、1.5[V]リファレンス
    ADC10CTL0 = ADC10SHT_3 | REFON | ADC10ON | ADC10IE;
 
    // INCH_10: 内部温度センサを選択
    // ADC10DIV_3: クロック分周 /4
    ADC10CTL1 = INCH_10 | ADC10DIV_3;
 
    __delay_cycles(1000);               // リファレンス安定化待ち(約30[us])
 
    __enable_interrupt();               // グローバル割り込みを有効化
 
    while(1)
    {
       ADC10CTL0 |= ENC | ADC10SC;       // 変換開始
       __bis_SR_register(CPUOFF + GIE);  // LPM0 に移行 (割り込み待ち)
 
       // 温度計算式 (データシートより)
       // 温度[℃] = (ADC値 - CAL_ADC_15VREF_FACTOR) × (85 - 30) / 
       //            (CAL_ADC_15T85 - CAL_ADC_15T30) + 30
       // 簡易的な線形近似の例:
       temperature = (long)adc_result;
       // 実際の温度計算には、キャリブレーション値を使用することを推奨
 
       __delay_cycles(100000);           // 待機時間
    }
 }
 
 // ADC10 割り込みサービスルーチン
 #pragma vector=ADC10_VECTOR
 __interrupt void ADC10_ISR(void)
 {
    adc_result = ADC10MEM;              // 変換結果を読み取り
    __bic_SR_register_on_exit(CPUOFF);  // LPM0 から復帰
 }


例5 : Timer_A によるトリガー (定期的なAD変換)

以下の例では、Timer_Aのアップモードを使用して、一定間隔でAD変換を自動的にトリガーする方法を示している。
この方法により、正確なタイミングでのサンプリングが可能となる。

  1. Timer_Aをアップモードで設定し、周期的に割り込みを発生させる。
  2. ADC10のトリガーソースとしてTimer_Aを選択する。
  3. Timer_Aの出力によって自動的にAD変換が開始される。


 #include <msp430.h>
 
 volatile unsigned int adc_result;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;           // ウォッチドッグタイマを停止
 
    // Timer_A の設定 (1秒周期でトリガー)
    TA0CCR0 = 32768 - 1;                // CCR0 = 32768 (ACLK = 32768[Hz] の場合、1秒周期)
    TA0CCTL1 = OUTMOD_3;                // OUT1: Set/Reset モード
    TA0CCR1 = 16384;                    // CCR1 = 16384 (50[%] デューティ)
    TA0CTL = TASSEL_1 | MC_1 | TACLR;   // ACLK, アップモード, タイマクリア
 
    // ADC10 の設定
    // ADC10SHT_2: サンプル&ホールド時間 = 16 × ADC10CLK
    // ADC10ON: ADC10モジュールを有効化
    // ADC10IE: ADC10割り込みを有効化
    ADC10CTL0 = ADC10SHT_2 | ADC10ON | ADC10IE;
 
    // INCH_0: 入力チャンネル A0
    // SHS_1: サンプル&ホールドソース = TA0.1
    // CONSEQ_0: 単一チャンネル単一変換モード
    ADC10CTL1 = INCH_0 | SHS_1 | CONSEQ_0;
 
    // A0 (P1.0) をアナログ入力として有効化
    ADC10AE0 = BIT0;
 
    ADC10CTL0 |= ENC;                   // 変換を有効化(Timer_A からトリガーされるのを待つ)
 
    __enable_interrupt();               // グローバル割り込みを有効化
 
    while(1)
    {
       __bis_SR_register(CPUOFF + GIE);// LPM0 に移行
 
       // adc_result に変換結果が格納されている
        
       // ここで必要な処理を実行
       // ...略
    }
 }
 
 // ADC10 割り込みサービスルーチン
 #pragma vector=ADC10_VECTOR
 __interrupt void ADC10_ISR(void)
 {
    adc_result = ADC10MEM;              // 変換結果を読み取り
    __bic_SR_register_on_exit(CPUOFF);  // LPM0 から復帰
 }


例6 : 外部リファレンス電圧の使用

以下の例では、外部リファレンス電圧(VEREF+、VEREF-)を使用したAD変換を示している。
外部の精密な基準電圧源を使用することで、より高精度な測定が可能となる。

  1. 外部リファレンス電圧をVEREF+ピン(P1.3)とVEREF-ピン(P1.3)に接続する。
  2. SREF2=0、SREF1=1、SREF0=1 に設定して、VEREF+ と VEREF- を選択する。
  3. 入力信号は、VEREF- ~ VEREF+ の範囲で 0~1023 に変換される。


 #include <msp430.h>
 
 volatile unsigned int adc_result;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;           // ウォッチドッグタイマを停止
 
    // ADC10 の設定
    // SREF_7: SREF2=0, SREF1=1, SREF0=1 → VEREF+ と VEREF- を使用
    // ADC10SHT_2: サンプル&ホールド時間 = 16 × ADC10CLK
    // ADC10ON: ADC10モジュールを有効化
    ADC10CTL0 = SREF_7 | ADC10SHT_2 | ADC10ON;
 
    // INCH_1: 入力チャンネル A1 (P1.1)
    ADC10CTL1 = INCH_1;
 
    // A1 (P1.1) をアナログ入力として有効化
    ADC10AE0 = BIT1;
 
    // 外部リファレンス電圧の使用について
    // SREF_7の設定により、ハードウェアが自動的にVEREF+とVEREF-ピンをリファレンス入力として使用する
    // 
    // ハードウェア接続:
    // - 基準電圧源の正側をVEREF+ピン (P1.3) に接続
    // - 基準電圧源の負側をVEREF-ピン (P1.3) に接続
    // 
    // 注意:P1SELやP1SEL2の設定は不要である
 
    while(1)
    {
       ADC10CTL0 |= ENC | ADC10SC;     // 変換を有効化してスタート
       while (ADC10CTL1 & ADC10BUSY);  // 変換完了まで待機
       adc_result = ADC10MEM;          // 変換結果を読み取り
 
       __delay_cycles(100000);         // 待機時間
    }
 }



使用上の注意事項

アナログ入力ピンの設定

アナログ入力として使用するピンは、必ずADC10AE0レジスタで有効化する必要がある。
また、該当するポートのP1SEL / P1SEL2レジスタも適切に設定すること。

入力インピーダンスと信号源インピーダンス

ADC10の入力インピーダンスは有限であるため、信号源のインピーダンスが高い場合は、サンプル時間を長く設定する必要がある。
データシートの推奨値を参照して、適切なADC10SHTx値を選択すること。

リファレンス電圧の安定化

内蔵リファレンスを使用する場合、REFONビットを設定した後、リファレンス電圧が安定するまで待機時間が必要である。
データシートによれば、約30[us]程度の待機時間が推奨される。

変換速度と精度のトレードオフ

ADC10SRビットを1に設定すると、消費電力を削減できるが、変換速度が低下する。
要求に応じて、速度と消費電力のバランスを調整すること。

ノイズ対策

高精度なAD変換を行う場合は、以下に示すノイズ対策を考慮する必要がある。

  • アナログ電源 (AVCC) と デジタル電源 (DVCC) を適切に分離する。
  • アナログ入力ラインにローパスフィルタを挿入する。
  • AD変換中は、できるだけ他のペリフェラルの動作を停止する。
  • グランドプレーンを適切に配置する。
  • 変換中は低電力モードに移行してデジタル回路のノイズを低減する。


キャリブレーション

内部温度センサを使用する場合や高精度な測定が必要な場合は、デバイス固有のキャリブレーション値を使用することを推奨する。
MSP430G2553には、工場出荷時にフラッシュメモリの特定アドレスにキャリブレーション値が格納されている。


関連情報

データシート

  • MSP430G2x53, MSP430G2x13 Mixed Signal Microcontrollers (SLAS735)
    ADC10の詳細については、データシートの[ADC10]セクションを参照すること。


ファミリユーザガイド

  • MSP430x2xx Family User's Guide (SLAU144)
    ADC10の動作原理、レジスタ詳細、プログラミング例については、ファミリユーザーガイドの[ADC10]章を参照すること。


サンプルコード