FPGAの内蔵温度センサーから値を得る:MAX 10 FPGAで学ぶFPGA開発入門(13)(6/6 ページ)
アルテラのFPGA「MAX 10」には温度センサーが内蔵されており、自身の温度を測定可能だ。メガファンクション「ALTPLL」を使い、内蔵センサーからの値を得るまでを試みる。
ソースコードの変更点だが、まずヘッダファイルとして“altera_modular_adc.h”と“altera_modular_adc_sequencer_regs.h”を追加している。これはADCへの対応である。また前回同様「terasic_includes.h 」「 I2C.h 」「 I2C.c 」の3つのファイルはDemonstrations \ humidity_temperature_lcd \ software \ humidity_temperature_lcd \ terasic_lib からプロジェクトにドラッグ&ドロップでコピーし、terasic_includes.h先頭の“sys/alt_alarm.h”と“sys/alt_timestamp.h”の2つのインクルードはコメントアウトしておく(「オンボードされた温湿度センサーからFPGAで値を得る」のList4参照)。
LED制御とI2C周りは前回そのままである。変更は「 main() 」の中で、FLAG(キーの状態)が0ならOff、1ならTSDの温度取得、2ならI2C経由でHM1000の温度取得という形に書き換えている。
ここでTSDの温度取得方法についてちょっと説明しておく。大昔の、MAX 10開発ボードで動く温度センサーのサンプルプログラム(MAX 10 FPGAで学ぶFPGA開発入門(6):FPGA上でソフトコアCPUを動かす手引きのList1)を見ると、「 celsius_lookup() 」なる関数が定義され、ここで巨大なテーブルを引いているのが分かるはずだ。
実はこの定義は、もともとTSDがそういう仕様になっているためだ。MAX 10 Analog to Digital Converter User GuideのPage 2-7〜2-8(日本語版・英語版共に同じ)には、温度コード変換表が掲載されており、コードが3798なら-40℃、コードが3431なら125℃となり、この範囲の値が返ってくるので、あとはコードを見て温度を判断する。このテーブルと温度の範囲をプロットしてみたのがグラフ1である。赤い点がテーブルに記されたコードと温度の関係をプロットしたもの、青い点線が直線近似の結果である。グラフを見ていただくと分かるが、一致しているのは80℃付近と0℃付近のみで、あとは近似直線とテーブルの値に結構な差がある。
そこで二項近似にしてみるとどうか?というのがグラフ2だ。80℃、60℃、20℃のあたりに若干の差はあるが、直線近似に比べるとずいぶん差が少なくなっている。ちなみにこのXの2乗項の係数の-0.0003は丸めた後の数字で、Excel上でシミュレーションをしてみたところ -0.0003054 あたりが一番近い数字となっている。今回はこの2項近似を使って値を引っ張り出したが、その代わり倍精度の浮動小数点演算が必要になるため、得失は判断が難しいところだ。ただ既にHM1000の温度取得で浮動小数点演算を使っているので、いまさらこれを拒む理由はないと判断した。
余談ながら、では三項近似にすればもっと精度がよくなるか?ということで試したのがグラフ3だが、計算量が増える割に余り誤差は減らないので、今回は二項近似のままでよしとした。
ということでソースに戻る。「 while() 」ループの中で、まず先頭でキーの値をチェックして表示モードを切り替えるが、その後の「 switch() 」でcase 1の場合がTSDの処理である。
先に書いた通り、まず64個のデータの平均を取る必要があるので、これを「 for() 」ループで回したあとで、先の二項近似の計算式を使って温度を取得している。case 2はI2C経由でHM1000からデータを取得する処理である。最後にLEDと、デバッグ用に「 printf() 」でコンソールに表示する、というものだ。
今回は動画は省いた(前回と見かけが変わらないため)が、実行してこんな具合(Photo17)にちゃんとそれぞれ温度を取得して表示できることが確認されれば完了である。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- オンボードされた温湿度センサーからFPGAで値を得る
FPGA「MAX 10」搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、そこにはTI製の温湿度センサーも含まれる。サンプルプログラムを元に、オンボードされたデバイスの制御を試みる。 - 「MAX 10 NEEK」でストップウォッチを開発し、内蔵メモリから起動する
アルテラのFPGA「MAX 10」を搭載した開発ボード「MAX 10 NEEK」にはLEDやフラッシュメモリなどの各周辺機器が備えられている。今回はLEDを使ったストップウォッチを開発し、内蔵メモリから起動する。 - 「MAX 10 NEEK」に搭載されたDDR3メモリを使う
MAX10搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、その中にはDDR3メモリも含まれる。ソフトコアCPU「Nios II」からの利用も含めて手順を紹介する。 - 「MAX 10 NEEK」へソフトコアCPUを組み込む
周辺機器の充実したMAX10搭載開発ボード「MAX 10 NEEK」に、ソフトコアCPU「NIOS II」を組み込み、ソフトコアCPUからボード搭載LEDの制御までを紹介する。 - 周辺機器の充実した「MAX 10 NEEK」で本格的な開発を目指す
FPGA開発において周辺機器(回路)は見落とせない要素の1つ。タッチパネルや各種出入力などを備えた「MAX 10 NEEK」を導入して、本格的な開発を目指す。