連載
» 2016年08月10日 09時00分 公開

FPGAの内蔵温度センサーから値を得るMAX 10 FPGAで学ぶFPGA開発入門(13)(6/6 ページ)

[大原雄介,MONOist]
前のページへ 1|2|3|4|5|6       

 ソースコードの変更点だが、まずヘッダファイルとして“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℃付近のみで、あとは近似直線とテーブルの値に結構な差がある。

グラフ1 グラフ1 MAX 10 Analog to Digital Converter User Guideに掲載されているテーブルと温度をプロットしたもの

 そこで二項近似にしてみるとどうか?というのがグラフ2だ。80℃、60℃、20℃のあたりに若干の差はあるが、直線近似に比べるとずいぶん差が少なくなっている。ちなみにこのXの2乗項の係数の-0.0003は丸めた後の数字で、Excel上でシミュレーションをしてみたところ -0.0003054 あたりが一番近い数字となっている。今回はこの2項近似を使って値を引っ張り出したが、その代わり倍精度の浮動小数点演算が必要になるため、得失は判断が難しいところだ。ただ既にHM1000の温度取得で浮動小数点演算を使っているので、いまさらこれを拒む理由はないと判断した。

グラフ2 グラフ2 テーブルと温度を2項近似とした

 余談ながら、では三項近似にすればもっと精度がよくなるか?ということで試したのがグラフ3だが、計算量が増える割に余り誤差は減らないので、今回は二項近似のままでよしとした。

グラフ3 グラフ3 三項近似としてみたが計算量の増加に精度が見合わない感じになってしまった

 ということでソースに戻る。「 while() 」ループの中で、まず先頭でキーの値をチェックして表示モードを切り替えるが、その後の「 switch() 」でcase 1の場合がTSDの処理である。

 先に書いた通り、まず64個のデータの平均を取る必要があるので、これを「 for() 」ループで回したあとで、先の二項近似の計算式を使って温度を取得している。case 2はI2C経由でHM1000からデータを取得する処理である。最後にLEDと、デバッグ用に「 printf() 」でコンソールに表示する、というものだ。

 今回は動画は省いた(前回と見かけが変わらないため)が、実行してこんな具合(Photo17)にちゃんとそれぞれ温度を取得して表示できることが確認されれば完了である。

photo17 Photo17:前半の26℃台がTSDの、後半の28℃台がHM1000の取得する温度である。どちらも絶対値の形で温度を返してくれるので、この差が実際にあるということだろう。一応温風を吹きかけたりすると温度が正しく変化することは確認した。

関連キーワード

アルテラ | FPGA関連 | FPGA


前のページへ 1|2|3|4|5|6       

Copyright © ITmedia, Inc. All Rights Reserved.