Seeeduino XIAO (ATSAMD21G18) のADCライブラリ

ADCライブラリを作ってみたのはいいが内部温度センサーを読み取りしようとしたら正しく読めない。データシートのADCの章を何度見直してもわからない。で、なんとなくデータシート全体を”ADC”で検索したところ、SYSCTRL->VREF.bit.TSENという温度センサー用に追加されたと思われる制御ビットがあることをたまたま発見。それを設定してみたら正しく読み取れるようになったのだが...簡単だと思っていたのにしょうもないところで時間を費やしてしまった。

【概要】

プリスケーラ(ps)を指定してライブラリを開始する。

ライブラリを終了する。

ADCの補正値を設定する。

サンプリング時間(増分クロック数)を設定する。←何のためにあるのかわからん。

リファレンス電圧を設定する。

分解能を設定する。8/10/12-bitと、average mode (12-bit, N samples) 及び oversampling mode (13/14/15/16-bit)が設定できる。

分解能(ビット数)を取得する。

アナログ入力を設定する。マイナス入力(neg)がADCONVERTER_MUXNEG_GND or ADCONVERTER_MUXNEG_IOGNDであれば単極入力、それ以外は差動入力に設定する。この呼出し後、diffMode(bool enable)で差動入力モードを変更可能。

ゲインを取得する。

差動入力モードを設定する。

差動入力モードを取得する。

ウインドウを設定する。

イベント入力を設定する。

イベント出力を設定する。

割り込みコールバック関数を設定する。

デバッグ設定を行う。

変換を開始する。

変換を停止する。

変換中の結果を捨てる。

動作状態を取得する。

割り込みフラグを取得する。ビットの組み合わせを返すことに注意。

ADC変換結果を取得する。

ADC変換結果を符号付整数に変換する。

ADC変換結果を電圧(uV)に変換する。外部リファレンス指定ではvrefにその電圧(uV)を指定する。

データ(value)をゲインで割る。

ADC変換結果を温度(内部温度センサー用)に変換する。

【サンプル・スケッチ】

ATSAMD21G18の内部温度センサーを読み取るプログラム

【修正履歴】
2020-06-15
voltage()の戻り値をゲイン補正した値に変更。

2020-06-13
integer()/voltage()/divideGain()を追加。

2020-06-12
リファレンス変更後の初回変換結果は使用できないとデータシートに記載されていたのでその対応とbegin()/correction()/result()/intflag()の仕様変更、及び、stop()/running()/resolution()/diffMode()を追加。
あと、result(true)を間違った使い方をしても永久ループらないよう改良。それと、AREFピンの設定を忘れてたので追加。

【ライブラリ】

【参照ライブラリ】
Seeeduino XIAO (ATSAMD21G18) のGPIO速度 (IOBUS.h)
Seeeduino XIAO (ATSAMD21G18) のGCLKライブラリ (gclock.h/gclock.cpp)
Seeeduino XIAO (ATSAMD21G18) のEVSYSライブラリ (eventsys.h/eventsys.cpp)