MSP430G2553 - ADコンバータ
概要
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モジュールは、以下の入力チャンネルを備えている。
| チャンネル | ポート | 備考 |
|---|---|---|
| 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 | (VCC - VSS) / 2 | 電源電圧の半分の値 |
| その他 | 内部信号 | デバイス固有の内部信号 |
チャンネル選択は、ADC10CTL1レジスタのINCHxビット (ビット15~12) で行う。
外部入力を使用する場合は、対応するポートピンをアナログ機能に設定する必要がある。(ADC10AE0レジスタを使用)
リファレンス電圧
ADC10の変換結果は、選択したリファレンス電圧に対する入力電圧の比率で決定される。
| 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の負荷を軽減し、消費電力を削減できる。
| レジスタ | 機能 | 説明 |
|---|---|---|
| ADC10SA | 転送先アドレス設定 | データ転送先のメモリアドレスを16ビットで指定 |
| ADC10DTC0 | DTC有効化と転送制御 | DTC機能の有効化、連続転送モード設定 |
| ADC10DTC1 | 転送回数設定 | 自動転送を行う回数を8ビットで指定(1~256回) |
変換タイミングとクロック
ADC10の変換には、ADC10CLKと呼ばれる専用のクロックを使用する。
- 変換時間
- 1回の変換には、13クロックサイクル必要
- [秒]
| ADC10SSELx | クロックソース | 説明 |
|---|---|---|
| 00 | ADC10OSC | 内蔵オシレータ (約5[MHz]、電源電圧依存) |
| 01 | ACLK | 補助クロック (通常32.768[kHz]、低速動作用) |
| 10 | MCLK | メインシステムクロック (高速動作用) |
| 11 | SMCLK | サブシステムマスタークロック (推奨設定) |
| 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 |
| 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を有効化
| ビット | チャンネル | ポート | 機能 |
|---|---|---|---|
| 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回) |
| ビット | 名称 | 機能 | 説明 |
|---|---|---|---|
| 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 のデジタル値に変換する。
- ADC10を初期化し、A0チャンネルを選択する。
- ソフトウェアトリガーで変換を開始し、変換完了まで待機する。
- 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が他の処理を実行できる。
- ADC10を初期化し、シーケンスモードを設定する。
- 割り込みを有効化し、変換を開始する。
- 割り込みハンドラで変換結果を読み取り、次のチャンネルに切り替える。
#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介入なしで連続的にデータを収集できるため、非常に効率的である。
- ADC10を初期化して、シーケンスモードとDTCを設定する。
- 変換を開始すると、DTCが自動的に4チャンネルを順番に変換し、結果をメモリに転送する。
- 全チャンネルの変換完了後、割り込みが発生する。
#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.5V)を有効化して、安定化まで待機する。
- 内部温度センサチャンネル (A10) を選択して変換を実行する。
- 変換結果から温度を計算する。(データシートの変換式を使用)
#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変換を自動的にトリガーする方法を示している。
この方法により、正確なタイミングでのサンプリングが可能となる。
- Timer_Aをアップモードで設定し、周期的に割り込みを発生させる。
- ADC10のトリガーソースとしてTimer_Aを選択する。
- 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変換を示している。
外部の精密な基準電圧源を使用することで、より高精度な測定が可能となる。
- 外部リファレンス電圧をVEREF+ピン(P1.3)とVEREF-ピン(P1.3)に接続する。
- SREF2=0、SREF1=1、SREF0=1 に設定して、VEREF+ と VEREF- を選択する。
- 入力信号は、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]章を参照すること。
サンプルコード
- MSP430G2x53, MSP430G2x33, MSP430G2x13, MSP430G2x03 Code Examples
- TI Resource Explorer内で多数のADC10使用例が公開されている。