温度センサICとMAX10 FPGA ADCで温度読み取り

アイキャッチ

概要

Intel MAX10 FPGAにはADC(アナログ・デジタル・コンバータ)が内蔵されていて、外部電圧と内部温度を読み取ることができます。

前回の記事では、MAX10 FPGAの評価ボードを使ってFPGA内部の温度を読み取りました。

今回はその続きで、温度センサICをMAX10評価ボードに接続して、室温の読み取りにチャレンジ!

今回はADC Toolkitを使って信号の様子を見てみましょう。(ちなみに前回は、システムコンソール(System Console)のTcl Consoleを使いました。)

ハードウェア

FPGA

MAX10の評価ボードEK-10M08E144ES/Pを使います。

評価ボード EK-10M08E144ES/P

温度センサ

今回使う温度センサICはアナログ出力のものです。独断と偏見で選んだ(値段で選んだ)の MCP9700-E/TO を使います。

  • 温度測定範囲 :-40°C~+70°C
  • 電源電圧: 2.3 V~5.5 V
  • 温度と出力電圧の関係: 10 mV/°C
  • オフセット: 500 mV

このMCP9700は足が3本あるIC。各ピンの用途は↓のとおりです。

  1. VDD - 電源(2.3 V~5.5 V)を入力する
  2. VOUT - 温度に応じた電圧が出力される
  3. GND - GNDに接続する

温度に応じた電圧が出力されるアナログ出力です。FPGAやマイコンでデータを使うために、ADCを使って電圧値をデジタルコードに変換する必要があります。

なお、デジタル出力のICやモジュールもあります。SPIやI2Cでアクセスして、デジタル化されたデータを直接取得できます。(ADCが不要になる)

温度センサーIC MCP9700-E/TO (8個入): センサ一般 秋月電子通商-電子部品・ネット通販

電子部品,通販,販売,半導体,IC,マイコン,電子工作温度センサーIC MCP9700-E/TO (8個入)秋月電子通商 電子部品通信販売

接続

ピン配置

温度ICのピンの機能と接続先はこうなっています。

  1. VDD - 電源入力 (3.3 V電源に接続)
  2. VOUT - 温度に応じた電圧を出力 (FPAGのADC用ピンに接続)
  3. GND - GNDに接続

評価ボードのArduinoコネクタにピンソケットが実装されているので、これを使って温度ICを接続します。

ボードのユーザガイドを見て使えそうなピンを探しました。

温度IC
ピン番号
用途方向評価ボード
ピン番号
ピン説明
1VDD (電源)J2 #43.3 V
2VOUT (温度出力)J4 #1
3GNDJ2 #7GND
コネクタ付近の回路図

ピン配置の関係で、ICの足を曲げても届かなさそうだったので「はんだ付け」で延長しました。(ブレッドボードがあればよかったんだけど…)

温度IC 接続状態

入力回路

ArduinoコネクタからFPGAのピンまでの回路を確認しておきましょう。

アナログ入力回路

回路図によると、バッファとしてボルテージフォロワが入っています。

入力電圧を1/2に分圧する抵抗もあります。そのため、実際に入力した電圧の1/2がADCから読み出されることになります。

Platform Designer 設定変更

使用するファイル

以前の記事で作成したデザインを流用します。(前回はADCを使って、内部温度を読みました。)

前回のプロジェクトファイルはGitHubで公開しています。開発環境はQuartus Prime 20.1 Lite Edition。

https://github.com/tetsufuku81/max10_10m08_adc/tree/dev_adc_internal_temperature

変更箇所

具体的な変更点は4つです。対象はModular ADC IPコア。

  1. ADCチャンネル
  2. シーケンサのスロット
  3. リファレンス電源
  4. Debug Path

Debug Pathを有効にするとADC Toolkitが使えるようになります。

既存のデザインを開く

Platform Designer(旧Qsys)を起動して、内部温度読み取り用のNiosデザインを開きましょう。

Platform Designerでファイルを開くメニュー

内部温度読み取りのデザインファイルは上記のGitHubに公開しています。

MAX 10 FPGAのADCで内部温度をモニター| てつふくブログ

Intel(Altera)のMAX10 FPGAに内蔵されているADCを使って内部温度検知をやってみた。Platform Designerでモジュールを構成、Quartusでコンパイルの流れを説明(回路図とVHDL使用)。最後に作成したデザインのレジスタをシステムコンソールでリードして温度データを確認します。

Platform Designerでファイルを読み込めたら、ADC IPコアを選択します。ADCコアの設定画面が現れます。

Platform Designer

ADCチャンネル

Channelsタブ内で、CH1タブを開きます。Use Channel 1のチェックボックスをONにします。

デザインを流用している場合は、TSDタブでUse on-chip TSDにチェックが入っていると思います。そのままでも特に問題はありませんが、気持ち悪い方はチェックを外しておきましょう。

ADCコア設定(チャンネル)

シーケンサのスロット

Sequencerタブの、Slot 1に割り当てるチャンネルに「CH 1」を選択。
Number of slot usedは「1」。

ADCコア設定(シーケンサ)

リファレンス電源

Reference Voltage Sourceは「Internal」を選択し、電圧を「3.3V」にします。

ADCコア設定(リファレンス電圧、デバッグパス)

Debug Path

Debug Pathの選択を「Enable」にします。これを忘れるとADC Toolkitが使えません。

Generate HDL

設定変更が終わったら、「Generate HDL」をして変更が反映されたHDLを生成します。詳しい手順は以前の記事を参照してください。

なお、ADCピンのロケーション制約は不要です。Platform DesignerでADCのチャンネルを設定すると自動的に該当するピンがADCに接続されます。

HDL生成後、

  1. デザインのコンパイル
  2. プログラムの書き込み
  3. System Consoleの起動

まで進めます。

ADC Toolkit

ADC Toolkitの起動

ADCモジュールのDebug Pathを有効にしたデザインでSystem Consoleを開くと、ADC Toolkitを起動するボタンが現れます。

ボタンをクリックしてToolkitを起動しましょう。

ADC Took 起動ボタン

Frequency Selectionタブ

ADC Toolkit 周波数選択

「ADCチャンネル」と「周波数」を設定します。

  • ADC Channel:1
  • Desired Frequency:1000 (Hz)

選択(入力)後、「Calculate」をクリック。

Scopeタブ

このタブでは、ADC読み取った電圧値を確認できます。[Run]ボタンを押すと取得が始まり、画面上の波形と統計値(最大値・最小値など)が連続して更新されます。

取り込み中に[Stop]ボタンを押すと停止します。

ADC Toolkit 取得値確認

Raw Dataタブでは、取得した生の値が表示されます。

ADC Toolkit 生データ

前述のように、ADCに入力される時点で電圧が1/2になっています。実際に入力されているのはADC出力電圧を2倍の電圧です。

その他のタブ

Signal Qualityタブでは信号品質を、Linearityタブでは直線性(リニアリティ)をチェックできますが、今回は使わないので省略。

(補足) コードと電圧値の関係

考え方の概要

MAX10のADCからは12ビットのコードが出力されます。16進数で表すと0x000~0xFFF(10進数なら0~4095)。つまり、ADCに0 Vが入力されたときの出力が0x000、3.3 V(リファレンス電圧)が入力されたときの出力が0xFFFで、この間は比例関係になります。

出力コードが1変化したとき、入力値は805.86 uV変化しているということになります。 (3.3/4095 = 805.86u)

計算例

先ほどの図の値で計算してみましょう。Sample #0のコード 458 を電圧に変えます。\[458 * 805.86{\rm (uV)} = 0.36908 {\rm (V)}\]四捨五入して0.3691。ADC Toolkitに表示されている電圧値と一致。

ユーザーガイドの『MAX 10 ADC 変換』のセクションに詳しい説明があります。

一般的なADCでも同様に、ビット数とリファレンス電圧の関係から、入出力の関係を計算することができます。

電圧値と温度の変換

最後に、読み取った電圧値を温度に変換しましょう。

考え方

ADCのMCP9700のデータシートには次のように書かれています。

  • 周囲温度0°Cでの出力電圧 (Output Voltage, TA=0°C):500 mV
  • 温度係数 (Temperatures Coefficient):10 mV/°C

つまり、出力電圧が500 mVなら周囲温度は0°C。温度が±1°C変化すると出力電圧が±0.01 V変化します。

ADC出力から温度を計算

Sample #0のコード 458 を例に考えてみます。手順は2段階。

  1. ADC出力コードを電圧に変換
    (回路上で分圧等をしていれば、逆算して本来の電圧値を求める)
  2. 電圧値を温度に変換

コードから電圧値へ

前述のとおり、ADコンバータで読み取った電圧は0.3691 V。
FPGAへの入力前に1/2に分圧されているので、2倍して分圧前の値にすると0.7382 V。

電圧値から温度へ

  1. 500 mVとの差を求めて
  2. 求めた差が何°Cに相当するかを計算し
  3. 0°Cにその値を足す

この順序で計算すると温度が出ます。実際の数値で計算すると

\[(0.7382-0.5)/10 {\rm (mV)} = 23.82^\circ{\rm C}\]

23.83°C。
別の温度計がないからなんとも言えないですが、室内なので妥当な値だと思います。

  • デバイス自体の発熱
  • キャリブレーション

など、考慮すべきがあるので、これで完璧とは言えないですが。

まとめ

温度センサICと、MAX 10 FPGAに内蔵されているADC(ACコンバータ)を使って、FPGA外部の温度を測定することができました。

データの流れ

温度を電圧値に変換することで、電子回路やソフトウェアで温度を伝えたり処理したりすることができるようになります。

デジタルコード以降の計算をソフトウェアやFPGAロジックで処理するようにプログラミングするとデータの収集や、温度に応じた処理ができるようになります。

今回使用した温度センサはこれ。

温度センサーIC MCP9700-E/TO (8個入): センサ一般 秋月電子通商-電子部品・ネット通販

電子部品,通販,販売,半導体,IC,マイコン,電子工作温度センサーIC MCP9700-E/TO (8個入)秋月電子通商 電子部品通信販売

ファイルの保存場所

今回使用したファイルをGitHubに置いています。

https://github.com/tetsufuku81/max10_10m08_adc/tree/dev_adc_hw

スポンサーリンク