目次
概要
Intel MAX10 FPGAにはADC(アナログ・デジタル・コンバータ)が内蔵されていて、外部電圧と内部温度を読み取ることができます。
前回の記事では、MAX10 FPGAの評価ボードを使ってFPGA内部の温度を読み取りました。
今回はその続きで、温度センサICをMAX10評価ボードに接続して、室温の読み取りにチャレンジ!
今回はADC Toolkitを使って信号の様子を見てみましょう。(ちなみに前回は、システムコンソール(System Console)のTcl Consoleを使いました。)
ハードウェア
FPGA
MAX10の評価ボード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。各ピンの用途は↓のとおりです。
- VDD - 電源(2.3 V~5.5 V)を入力する
- VOUT - 温度に応じた電圧が出力される
- GND - GNDに接続する
温度に応じた電圧が出力されるアナログ出力です。FPGAやマイコンでデータを使うために、ADCを使って電圧値をデジタルコードに変換する必要があります。
なお、デジタル出力のICやモジュールもあります。SPIやI2Cでアクセスして、デジタル化されたデータを直接取得できます。(ADCが不要になる)
温度センサーIC MCP9700-E/TO (8個入): センサ一般 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作温度センサーIC MCP9700-E/TO (8個入)秋月電子通商 電子部品通信販売
接続
ピン配置
温度ICのピンの機能と接続先はこうなっています。
- VDD - 電源入力 (3.3 V電源に接続)
- VOUT - 温度に応じた電圧を出力 (FPAGのADC用ピンに接続)
- GND - GNDに接続
評価ボードのArduinoコネクタにピンソケットが実装されているので、これを使って温度ICを接続します。
ボードのユーザガイドを見て使えそうなピンを探しました。
温度IC ピン番号 | 用途 | 方向 | 評価ボード ピン番号 | ピン説明 |
---|---|---|---|---|
1 | VDD (電源) | ← | J2 #4 | 3.3 V |
2 | VOUT (温度出力) | → | J4 #1 | |
3 | GND | - | J2 #7 | GND |
ピン配置の関係で、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コア。
- ADCチャンネル
- シーケンサのスロット
- リファレンス電源
- Debug Path
Debug Pathを有効にするとADC Toolkitが使えるようになります。
既存のデザインを開く
Platform Designer(旧Qsys)を起動して、内部温度読み取り用のNiosデザインを開きましょう。
内部温度読み取りのデザインファイルは上記のGitHubに公開しています。
MAX 10 FPGAのADCで内部温度をモニター| てつふくブログ
Intel(Altera)のMAX10 FPGAに内蔵されているADCを使って内部温度検知をやってみた。Platform Designerでモジュールを構成、Quartusでコンパイルの流れを説明(回路図とVHDL使用)。最後に作成したデザインのレジスタをシステムコンソールでリードして温度データを確認します。
Platform Designerでファイルを読み込めたら、ADC IPコアを選択します。ADCコアの設定画面が現れます。
ADCチャンネル
Channelsタブ内で、CH1タブを開きます。Use Channel 1のチェックボックスをONにします。
デザインを流用している場合は、TSDタブでUse on-chip TSDにチェックが入っていると思います。そのままでも特に問題はありませんが、気持ち悪い方はチェックを外しておきましょう。
シーケンサのスロット
Sequencerタブの、Slot 1に割り当てるチャンネルに「CH 1」を選択。
Number of slot usedは「1」。
リファレンス電源
Reference Voltage Sourceは「Internal」を選択し、電圧を「3.3V」にします。
Debug Path
Debug Pathの選択を「Enable」にします。これを忘れるとADC Toolkitが使えません。
Generate HDL
設定変更が終わったら、「Generate HDL」をして変更が反映されたHDLを生成します。詳しい手順は以前の記事を参照してください。
なお、ADCピンのロケーション制約は不要です。Platform DesignerでADCのチャンネルを設定すると自動的に該当するピンがADCに接続されます。
HDL生成後、
- デザインのコンパイル
- プログラムの書き込み
- System Consoleの起動
まで進めます。
ADC Toolkit
ADC Toolkitの起動
ADCモジュールのDebug Pathを有効にしたデザインでSystem Consoleを開くと、ADC Toolkitを起動するボタンが現れます。
ボタンをクリックしてToolkitを起動しましょう。
Frequency Selectionタブ
「ADCチャンネル」と「周波数」を設定します。
- ADC Channel:1
- Desired Frequency:1000 (Hz)
選択(入力)後、「Calculate」をクリック。
Scopeタブ
このタブでは、ADC読み取った電圧値を確認できます。[Run]ボタンを押すと取得が始まり、画面上の波形と統計値(最大値・最小値など)が連続して更新されます。
取り込み中に[Stop]ボタンを押すと停止します。
Raw Dataタブでは、取得した生の値が表示されます。
前述のように、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段階。
- ADC出力コードを電圧に変換
(回路上で分圧等をしていれば、逆算して本来の電圧値を求める) - 電圧値を温度に変換
コードから電圧値へ
前述のとおり、ADコンバータで読み取った電圧は0.3691 V。
FPGAへの入力前に1/2に分圧されているので、2倍して分圧前の値にすると0.7382 V。
電圧値から温度へ
- 500 mVとの差を求めて
- 求めた差が何°Cに相当するかを計算し
- 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
コメントを残す