製品情報>ZYNQ搭載 ADCボード「Cosmo-Z」>開発日記>2015年1月

2015年1月

フォトマルの筐体

平成27年1月30日

今日、アルミの材料が届きました。

すんげーひんやりしてて気持ちいい。

Pmt_al


プラスチックシンチレータとフォトマルを入れる筐体に使います。

自分は穴あけとか金属加工は苦手なので、材料持ち込みで加工してくれる業者さんを探して依頼することにします。

 

完成すると、

Pmt_kansei

フォトマルが二重のアルミ箱の中に納まる形になります。

四角柱の筐体の中から、にゅっと、円柱が出てくるのです。

結構重い。

新しいハイボル

平成27年1月22日

光電子増倍管用の高電圧源(ハイボル)に、いままではaidtendoで購入したインバータに倍電圧整流回路を使っていたのですが、

Old_hv

あまりにもノイズが大きいという問題がありました。

下の図はaitendoのインバータで作ったハイボルの出力を、100MΩと1MΩで100分の1に分圧して測った波形なのですが、3V程度のノイズが乗ってしまっています。単純に考えれば300Vものリップルが乗っていることになりますが、実際にはそんなに多くはない(飛んできているノイズをオシロの同軸ケーブルで拾っているため)でしょうが、相当な量のノイズをばらまいているので、リップルは少なくはないはずです。

Scope_1

このノイズは、コイルやコンデンサでは取り切れません。蛍光管インバータで作ったハイボルがノイズだらけだったので、新しくハイボルを作り直すことにしました。

sun

aitendoのインバータの問題はノイズです。ノイズが出る原因は、コイルに流れる電流をバチバチとON/OFFしてしまうことです。

急激な電流変化は激しいノイズを起こすので、つるつるの正弦波を作ってトランスで昇圧することにしました。

それが↓の波形。

Scope_5

逆位相で振幅5Vくらいの正弦波を2個つくって、1:100トランスの1次側に入れると、2次側から1000Vになって出てくるというしくみです。

作った回路はこんな感じ。

Hv

100分の1にしてノイズを測ってみると、ノイズのピークツーピークは6.7mVでした。ノイズが50分の1に減りました。

Scope_3

本当かどうか疑いたくなりますが、ちゃんと1000Vの高電圧は出ているのは間違いないので、1000Vでリップルが0.6Vくらいの電源として動いているようです。

シンチレーション検出器の開発

平成22年1月21日

マルチチャネルアナライザといって、パルスの高さでヒストグラムを取る回路をFPGAに入れてみたところ、プラスチックシンチレータ+光電子増倍管+Cosmo-Zでバックグラウンドのスペクトルを測れるようになってきました。

カリウム塩を置いた場合と、何も置かない場合で比較してみることにしました。

減塩しおは、塩化ナトリウムの代わりに塩化カリウムが含まれています。天然のカリウムには放射性同位体が含まれているので、減塩しおは簡単に入る放射線源として使うことができます。

Cosmozsalt

減塩しおのあるなしで1.5時間測ってみた結果は、

Cosmozsalt_mca

横軸がパルスの大きさ、縦軸がカウント数です。

140ch目くらいのところから差が出ていますが、まだ有意なものかどうかはわかりません。

せっかくフォトマルが2個あるのだから、コインシデンスの処理をしてみて、特定の方向から来たものだけをカウントするように改造してみようかと思います。

Cosmo-Zをインターネット経由で見られるようにしました

平成27年1月19日

Cosmo-Zをインターネット経由で見られるようにしました。

???と思うかもしれませんが、こういうことです。

Cosmozredirect

 

特電のオフィスにおいたプラスチックシンチレータ+PMTで計測している波形を、Cosmo-Zで集計し、それをインターネットで見られるようにしています。

ただし、特電オフィスはIPアドレスを公開していないので、特電サーバ(IPアドレス固定のレンタルサーバ)に来たリクエストをPHPのプログラムで受けて、それをfile_get_contentsで特電オフィスに飛ばしています。

このような形で、ユーザは特電社内に置いたCosmo-Zのページを見ることができるというわけです。

実際に、初詣に行きながらマルチチャネルアナライザの結果を見たりすることができました。

Cosmozweb1


いつでもどこでも、計測結果が見られるのは、ZYNQでLinuxが動き、ネットワーク経由でつながるからです。

Cosmo-ZのWeb UI画面

2015.01.17

今週は、ZYNQ搭載ADCボード「Cosmo-Z」のWebユーザインタフェースを作っていました。

みんながみんなZYNQのLinuxにログインして、コマンドを叩いて操作できるわけではないし、WindowsマシンからUSB3.0でつないでキャプチャできるわけでもありません。

でも、ZYNQのLinuxでWebサーバを動かして、Web画面で波形が見られれば、誰でもどこからでも見れますよね。

 

Cosmo-Zは、もともとミューオンという宇宙線を検出するために開発されました。

ミューオンの検出には、プラスチックシンチレータと光電子増倍管を使っています。

Pmt


プラスチックシンチレータと光電子増倍管からの信号をCosmo-Zにつないで、

Csz_20150116_1

それをオシロにつないで波形をモニタしつつ、Web画面でもみてみると、確かに一緒のタイミングで連動して、何かトリガしながら動いていることが確認できました。

Csz_20150116_2



Webの画面をさらに進化させていたら、このようなになりました。

Csz_monitor

Web上で、トリガレベル(ディスクリ)や、現在のペデスタルレベル(無信号時の値)を見ることができ、画面上の波形がリアルタイムに更新されるようになりました。

波形の更新やトリガレベルの設定はAjaxを使っているので、画面全体の更新を伴わず、とてもスムーズです。

これで、世界中どこに置いた光電子増倍管でも、Webでモニタできますね。

ZYNQ上のCGIでグラフの画像を作ることができた

2015.01.13

ZYNQで動くLinux上で、波形のような画像を動的に生成し、CGIで返すことができるようになりました。

Cosmo-ZにHTTPでアクセスして、「波形モニタ」というところを押します。

Cosmozwebui_1

ぺこっと押す。

すると、このように

Cosmozwebui_2

このように、波形のようなものが右側に表示されます。

 

現在は実際のADCの波形ではなく、ZYNQの中で作り出しているダミーのデータを表示しています。ADCのデータをテキストとして取り出すことはすでにできているので、この波形ビューワーと組み合わせれば、Webインタフェースの8chモニタができるはず!

 

ちなみに、昨日作ったlibpngライブラリは、メモリ上の二次元配列の望みの座標に点を打つことしかできません。

線を書いたり塗りつぶしたりするのはlibpngだけではできませんので、GDというライブラリを使いました。GDは、線を書いたり塗りつぶしたりするためのグラフィックライブラリです。GDのバージョンは2.1.0です。

GDをARM用にクロスコンパイルする方法は、ここのページを参考にしました。

こんなファイルを作っておいて、myconfとかいう名前で保存し、

#!/bin/bash

# architecture prefix
ARCH="arm-linux"

# path to the toolchain and kernel base
TOOL_PATH=/usr/local/arm-linux

# path to the toolchain base
BASE_PATH=$TOOL_PATH/2.95.3

# cumulative toolchain prefix
PREFIX=arm-xilinx-linux-gnueabi

export CC=$PREFIX-gcc
export CXX=$PREFIX-g++
export LD=$PREFIX-ld
export NM="$PREFIX-nm -B"
export AR=$PREFIX-ar
export RANLIB=$PREFIX-ranlib
export STRIP=$PREFIX-strip
export OBJCOPY=$PREFIX-objcopy
export LN_S="ln -s"

export CFLAGS="-g -O2 -I/usr/local/arm-linux/include"
export CPPFLAGS="-I/usr/local/arm-linux/include"
export CXXFLAGS=""

export LDFLAGS=""

./configure \
            --host="arm-linux" \
            --prefix=/usr/local/arm-linux \
            --with-png=/usr/local/arm-linux \
            --with-jpeg=no \
            --with-freetype=no \
            --with-fontconfig=no \
            --with-xpm=no

libgd-2.1.0$ . myconf

でconfigureが実行されます。

そのあとはmake と make installで完成です。

ZYNQ上のLinuxでPNG画像を生成する

2015.01.12

ZYNQ上でPNGの画像を生成するには、libpngというライブラリが必要です。

パソコンのLinuxで動くlibpngならバイナリがいくらでもダウンロードできますが、ZYNQのLinuxで動くものなどそう簡単にはありません。

だから、libpngは自分でビルドします。


まず、デスクトップPCのLinux上にXILINXのSDKを入れたら、
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
source /opt/Xilinx/SDK/2013.2/settings32.sh
でパスを通します。

② zlib

libpngを作るにはzlibが必要です。zlibはPNGで使われる圧縮形式です。

まず、zlibをとってきます。
http://www.zlib.net/
のページの真ん中ほどにあります。
http://zlib.net/zlib-1.2.8.tar.gz

これを解凍し
gunzip zlib-1.2.8.tar.gz
tar -xvf zlib-1.2.8.tar
cd zlib-1.2.8

ビルドします。
export CC=arm-xilinx-linux-gnueabi-gcc
として、
./configure --prefix=/usr/local/arm-linux
make
で通ります。

できあがったら、

sudo make install

で/usr/local/arm-linux/includeにヘッダファイル類が、/usr/local/arm-linux/libにライブラリのバイナリがインストールされます。

これは問題なく通ると思います。

③libpng

libpngはPNGファイルを作るライブラリです。libpngは1.6.16が最新版ですが、configureファイルがなく設定がよくわからないので、古いバージョン 1.2.52 を使います。

下記のURLからダウンロードしてきます。

http://sourceforge.net/projects/libpng/files/libpng12/1.2.52/

configureするときに、いろいろなオプションが必要です。NEONの命令を生成するなどこちらのページを参考にしました。

./configure --host=arm-xilinx-linux-gnueabi CC=arm-xilinx-linux-gnueabi-gcc AR=arm-xilinx-linux-gnueabi-ar STRIP=arm-xilinx-linux-gnueabi-strip RANLIB=arm-xilinx-linux-gnueabi-ranlib CPPFLAGS="-mfpu=neon -I/home/naitou/libpng/zlib-1.2.8/" LDFLAGS="-L/home/naitou/libpng/zlib-1.2.8/ prefix=/usr/local/arm-linux

make

でライブラリが作成され、

make install

でインストールされます。 私の環境ではなぜかranlibが最後まで動かなかったので、いくつかのファイルは手動でコピーしました。

④テストプログラムを作る

libpngのプログラムは、

http://www.cnx-software.com/2011/10/06/cross-comping-zlib-for-arm-target/

のページを参考にして作るのが一番簡単だと思います。

arm-xilinx-linux-gnueabi-gcc -I/usr/local/arm-linux/include test.c -o test.cgi -L/usr/local/arm-linux/lib -lpng -lz

でコンパイルできます。

できあがった、test.cgiを、ZYNQのボードの/var/www/cgi-binに置き、パーミッションを755に設定します。

⑤ .soのインストール

-lpngでビルドすると、シェアードオブジェクトのほうをリンクします。

コンパイルに使ったローカルPCの、/usr/local/arm-linux/libにlibpng.so.3.52.0というファイルができているので、これをZYNQのボードの/usr/lib/に置き、

ln -s /usr/lib/libpng.so.3.52.0 /usr/lib/libpng.so.3
ln -s /usr/lib/libpng.so.3.52.0 /usr/lib/libpng.so

でシンボリックリンクを作っておきます。これがないと、ldがエラーを出してしまいます。

ダイナミックリンクをせずにスタティックな実行ファイルを作るには-lpngではなく、-lpng12にするようです。そうすれば、libpng12.aのほうがリンクされるので実行時に.soは必要ありません。

ただ、私の環境ではranlibが失敗したとかでエラーがでているので、そのせいかもしれません。

 

これでCGIでPNG画像を作って返せるようになります。

Cosmozzynqpng

上のグラデーションの画像は、ZYNQの中のプログラムで作っています。

Cosmo-ZのLinuxでADCの波形が取れるようになった

2015.01.10

Cosmo-ZのLinuxアプリを鋭意開発中です。

ついに、Linux上でADCの波形を取れるようになりました。

./cosmoz.elf <command>

で、様々なコマンドを与えることができます。

今日作ったのはadcwaveというコマンド。

このコマンドを打つと、8ch 1024個の波形をキャプチャしてコンソールに表示してくれます。

Cosmozadc

アナログ入力端子を指で触って、データを取得し、Excelで適当なグラフにしてみると・・

Cosmozadc2

こんな感じになりました。

これを、SSHでのログインで波形を取るのではなく、Cosmo-ZのLinuxでWebサーバを動かし、ユーザはブラウザ上でグラフにしたいものです。

JavaScript (jQuery)でやるか、ZYNQ上でPNG画像を生成してブラウザに表示するかを考えることにします。

Cosmo-ZのLinuxを本格的に・・

2015.01.08

Cosmo-ZのLinuxを本格的にいじり始めました。

まず、ZYNQ Linuxの構築手順をこちらのページにまとめました。

http://www.tokudenkairo.co.jp/cosmoz/sdk.html

環境の準備から、u-boot、ramdisk、linux、devicetree・・とひととおり書きました。

また、LinuxやU-BootをビルドしているディレクトリをそのままZIPで固めて「Cosmo-Zダウンロードページ」で公開を始めました。SDカードに書くべき起動データなども一式そろっています。

それから、現在、Cosmo-Zの中にWebサーバを入れて(busyboxのhttpdですが・・)、こんな管理画面を作ろうとしています。

Cszcontrol1

 

BusyBoxのhttpdはCGIも使えてかなりGoodです。しかしPHPとか使えるわけではないので、ページ全体をCGIで作るのはちょっと大変。

そこで、Ajaxを使うことにしました。

Cosmo-Zの管理画面ではJavaScriptを動かして、Cosmo-Zのbusyboxの中にあるCGIをAjaxでつっついて、キャプチャの開始や波形の取得などをしようという考えです。

Cosmo-ZのADCが安定して受信できるようになった

2015.01.07

Cosmo-ZのADCが安定して受信できるようになりました。

今まで、Cosmo-ZのADCは、電源投入時にこんな

Cosmozerr_1

波形になることが多く、温まってくると正常に動作するという非常に怪しい状態でした。

それは、高速ADCからのLVDS信号を受信している回路の問題でした。600Mbpsで送ってくるので、1つのビットは1.6nsなので、信号の変化点から800ps経過したところでサンプリングするように合わせないといけなかったのですが、そのタイミングを間違えていました。

sun

まず、ADCから100000000000という固定のパターンを出力させて、それをZYNQのISERDESで受け取ります。そして、IDELAYを1個ずつ増やしていきますと・・

Iserdes_1

このように20~21個くらいのところで再びデコードの状態が変わります。IDELAYの1タップは75psなのでだいたい1.5nsくらいずらすと信号の状態が変わるということです。

そこで、最初に変わってから11タップ目で止めることにしました。

Iserdes_2

これで、ちょうど、ど真ん中でサンプリングしていることになります。

こうしてCosmo-Zは、電源投入直後でも綺麗な波形をサンプリングできるようになりました。

Cosmozok_1

 

すべてはミューオンの検出のため。頑張ります。

LVDSのデフォルト状態に要注意

2015.01.05

年末からZYNQ搭載のA/D変換ボード「Cosmo-Z」の納品用4号機を作っていたのですが、うまくADCが動かないというトラブルが起きていました。

ADCのチップ自体は動いていてテストパターンなどは送ってくるのですが、肝心のAD変換データを送ってこない・・

今までに動いていた1号機や2号機と徹底的に見比べていたのですが、ADCまわりにはどこにも差異はありませんでした。

で、ついに10日間悩んだ原因がわかりました。

thunder

FPGAが起動した後、AD変換器には100MHzのLVDS差動クロックが与えられます。

Clk100mok

このクロックはFPGAで作った100MHzをクロック分配ICで8個のADCに配っています。

図にすると、以下のようになります。

Clockdist

正常に動作する個体では、FPGAが起動する前には、AD9633のクロックが停止していたのですが、異常な個体では、FPGAが起動する前に次のような波形が出力され、ADCに送られていたのです。

Clkxng

 

実は、このクロック分配IC「ADCLK854」は、CLK+入力とCLK-入力の内部のプルアップ/プルダウン抵抗の比がわずかに変えられていて、入力オープンの際にどちらかの値に落ち着くようになっているのだとは思いますが、

Adclk854_selfbias
実際にはFPGAの内蔵プルアップ抵抗などのばらつきによって、ちょうど、2つの入力端子が同電位になってしまったのでしょう。

それゆえ、ノイズを拾ってしまい、上のようなふらふらとした波形になったようです。このふらふらしたクロックを受けてしまうと、AD9633は正常に動作できなくなってしまうというのが、今回のトラブルの原因のようでした。

とりあえず、CLK入力の片側をプルダウンすることでこの問題は回避しましたが、ベストなやり方は模索中です。

Adclk854_pulldown

 

今日の教訓

FPGAが起動する前、LVDSは同電位になって、不安定な状態になっている可能性があるので注意が必要。


© 2017 TokushuDenshiKairo Inc. All rights reserved