FC2カウンター FPGAの部屋 Zybot に超音波距離センサを搭載する8(ZYBO_0_162_7 に 2 つのIP を追加2)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Zybot に超音波距離センサを搭載する8(ZYBO_0_162_7 に 2 つのIP を追加2)

Zybot に超音波距離センサを搭載する7(ZYBO_0_162_7 に 2 つのIP を追加)”の続き。

前回はVivado HLS 2016.3 の Ultrasorinc_sensor_inf IP とussensor_iobuf IP をZYBO_0_162_7 フォルダのプロジェクトのブロックデザインに追加して、論理合成、インプリメント、ビットストリームの生成を行った。
今回は、SDKでアプリケーション・ソフトウェアを作成して、ZYBO でテストを行った。

SDKで、ultrasonic_sensor_inf アプリケーション・プロジェクトを作成して、ultrasonic_sensor.c を作成した。
Ultrasonic_senser_inf_59_161216.png

ultrasonic_sensor.c を示す。

// ultrasonic_sensor.c
// 2016/12/14 by marsee
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "xil_io.h"
#include "xparameters.h"

#include "xultrasonic_sensor_inf.h"

int main(){
    XUltrasonic_sensor_inf uss_inf;
    int ret_val;
    float measure;
    
    XUltrasonic_sensor_inf_Initialize(&uss_inf, 0);
    
    while(1){
        usleep(200000); // 200 ms

        XUltrasonic_sensor_inf_Start(&uss_inf);

        while(!XUltrasonic_sensor_inf_IsDone(&uss_inf))
            usleep(500); // 5us

        if(ret_val = (int)XUltrasonic_sensor_inf_Get_return(&uss_inf))
            printf("Error: %d\n", ret_val);

        measure = (float)XUltrasonic_sensor_inf_Get_count_val(&uss_inf) * 0.000342 / 2.0;
        printf("Distance is %.2f cm\n", measure);
    }
}


ultrasonic_sensor.elf の実行結果を示す。
Ultrasonic_senser_inf_58_161215.png

うまく距離が測定できた。

しかし。。。距離は測定できたのだが、たまに動かなくなってしまう。5分くらいで動作しなくなってしまう。動作しなくなったら、再コンフィギュレーションしないと再び動き出さない。
2時間くらい悩んでいたのだが、ふと気が付いた。sensor_in に入って来る超音波距離センサの距離測定パルスは非同期なのに、シンクロナイザが入っていなかった。Vivado HLS で生成されるIP にシンクロナイザを望むべくもないので、自分で作った、Synchronizer を sensor_in に追加することにした。

Synchronizer を追加した階層モジュール usoinc_sensor_inf を示す。
Ultrasonic_senser_inf_60_161216.png

Synchronizer はビット幅 1 、ステージ数 2 に設定されている。
Ultrasonic_senser_inf_61_161216.png

これでもう一度、論理合成、インプリメント、ビットストリームの生成を行った。
レポートを示す。
Ultrasonic_senser_inf_62_161216.png

成功したので、ハードウェアをエクスポートして、SDK を立ち上げた。

ultrasonic_sensor.elf を実行したところ、30分経っても動作は安定していた。やはり、Synchronizer が無かったためメタステーブル状態が発生し、ステートマシンが不正ステートに行ってしまって、回復できなかったのが原因のようだ。
これで、超音波距離センサをZybot に搭載することができる。。。やった~~~。

なお、実験方法はZYBO のPmod の +3.3V を パララックス社の超音波距離センサの+5V に入力している。つまり、データシートの規格から逸脱して使っているが、今のところは問題なく使用できている。SIG はPmod のJB の 7 番ピン Y18 に接続している。
接続してる写真を示す。あとはGNDを接続している。配線だけのシンプルな回路だ。
Ultrasonic_senser_inf_63_161216.jpg
  1. 2016年12月16日 04:46 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3663-ae2d97df
この記事にトラックバックする(FC2ブログユーザー)