南無ちゃんのブログ    https://namva.net

天下御免の夢中人=南無ちゃんは、今日も元気で明るく楽しく逞しく生きてゆく。

GPSDOほぼ完成

2020-03-31 19:13:09 | 電子工作
 今日も花曇りと言うのかくず付いた天気で、肌寒さを感じる一日でした。納期はありませんが、やりかけたGPSDOの製作を片付けるべく、無線小屋で一日中遊びました。
 FPGAとESP32とのプロトコルを見直して、ESP32から周波数測定開始の指令を出して、ポーリングして終了を検知するようにしました。しかし、インタフェースのための信号線は、SPIの4本を使うのみで、1本も増やしませんでした。良い手を見つけたのです。
 当初の予定通り、10秒間ゲートを開けて、OCXCの信号(10MHz)をカウントするようにしました。カウントしたデータをNokia 5110 LCDに表示するようにもしました。

 
 OCXOの制御電圧は外付けのDACかデジタルポテンショメータを使おうかと思っていましたが、なかなか適当なものが見当たらず、迷っていました。ESP32内蔵のDACは8ビットなので、少し粗いかなぁ・・・と思っていましたが、お金はかからないので、ダメ元で試してみました。DACの分解能が粗いので、急激に変化させることは避けて、10秒間に1カウントだけプラスまたはマイナスの方向に変化させるようにしました。
 意外にも良好な結果が得られたので、内蔵DACを使うことにします。後は、GPSが来るのを待って、仕上げをしたいと思います。
 シリアルコンソールに出力されたメッセージを以下に示しますが、ほぼ±1以内に収まっているので、±0.01ppm=±10ppbの精度になります。(ゲート信号の10秒が正しければ・・・)
read from SPI : 0x5F5E101 = 100000001
delta = 1
DAC out: 181
counter busy: status = A987654321
read from SPI : 0x5F5E100 = 100000000
delta = 0
DAC out: 181
counter busy: status = A987654321
read from SPI : 0x5F5E101 = 100000001
delta = 1
DAC out: 180
counter busy: status = A987654321
read from SPI : 0x5F5E100 = 100000000


コメント

FPGAとESP32を接続

2020-03-30 21:19:37 | 電子工作
 引き続きGPSDOを実現すべく、FPGAやESP32のプログラミングをして過ごしました。今日は、FPGA内に周波数カウンターとSPI(スレーブ)をインプリメントし、OCXOを接続してデバッグしました。

 FPGAボードの50MHzクロックを分周して作った1秒のゲート信号でOCXOを周波数をカウントしたところ、9999998~10000000の値が表示されました。ゲート信号の安定度や確度は???ですが、OCXOの安定度は0.2ppm程度であると推定できます。
 まだ、GPSモジュールを発注していませんのでそろそろ注文したいと思いますが、どのような方式でOCXOを制御しようかと思案中です。DACを使うべきか、デジタルポテンショメータを使うべきか??? できれば、GPSモジュールと一緒に注文したいので、よ~く考えねばなりません。
 GPSDOの全体的なブロック図は次のようなものを想定しています。

コメント

Arduino for ESP32のSPIライブラリ

2020-03-29 16:18:26 | 電子工作
 FPGAからのデータをESP32で読み取るためのインタフェースとして、SPIを使おうと考えています。理由は、配線数が少なくて済み、かつFPGAでのインプリメンテーションが簡単そうだからです。SPIというのはSerial Periphral Interfaceの略で、Motorolaが規格を制定したとのことですが、様々なインプリメンテーションがあり、縛りの緩い規格のようです。昨日試したNokia 5110もSPIでインタフェースしています。
 色々調べたところ、ESP32用ArduinoのSPIライブラリで標準的にサポートされるピンは、18(SCK)、19(MISO)、23(MOSI)、5(SS)のようなので、Nokia 5110と共存できるようです。
 周波数カウンターのデータは32ビットで一度に読み込みたいので、それが可能かどうかも実験してみました。Arduino UNOなどのAVRマイコン用のSPIライブラリにはSPI.transerおよびSPI.transfer16というメソッドがあり、8ビットおよび16ビットでデータをリード・ライトできます。ESP32はその名の通り32ビットCPUなので、SPI.transfer32というのが使えるんじゃないかと思って試したところ上手くいきました。
 テストプログラムを以下に示します。
#include <SPI.h>

void setup() {
  SPI.begin(18, 19, 23, 5);
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3));
  Serial.begin(9600);
}

unsigned long outData = 0x55aa55aa;

void loop() {
  unsigned long inData;

  Serial.print("write to SPI ");
  Serial.println(outData, HEX);
  digitalWrite(SS, LOW);
  inData = SPI.transfer32(outData);
  digitalWrite(SS, HIGH);
  Serial.print("read from SPI ");
  Serial.println(inData, HEX);
  delay(2000);
  outData++;
}
 クロック(SCK)は、1MHzにしました。MOSI信号(出力)をMISO信号(入力)に接続することで、自分の出力した信号をリードバックできる筈です。期待した通り、シリアルモニタには次のように表示されました。
write to SPI 55AA5721
read from SPI 55AA5721
 MOSI-MISO間の配線を外すと、 read from SPI 00000000と表示され、リードバックされているデータであることが確認できました。
 オシロスコープで、SCK(黄色)とMOSI(水色)の波形を観測しました。MODE3に指定しているので、クロックはノーマルハイ、立下りエッジの後でMOSI信号が変化しています。データは正論理でMSBファーストで送信されていることが分かります。

コメント

ESP32にNokiaの液晶パネル

2020-03-28 16:29:48 | 電子工作
 FPGAで周波数カウンターを作ったとして、目に見える形で表示するにはどうしたら良いのでしょうか?従来、周波数カウンターの表示には7セグLEDというのが定番ですが、GPSDOを構成するには、やはりマイコンが必要です。マイコンがあるのなら、周波数カウンターからデータを読み出して、液晶表示器などに表示したいものです。
 5年程前に、aitendoでNokiaの5110LCDパネルを@500円で3枚購入しましたが、段ボール箱の中で眠っていました。現在でもamazonやaitendoで販売されているようです。
 最近の私のお気に入りマイコンはESP32 DevKitです。高性能な上に、WiFiまで付いていて、安価でかつ、Arduinoの開発環境でプログラミングできて、とにかく使い易いからです。

 初めて、ESP32で5110を使うにあたり、次の記事を参考にしました。
 この記事に書いてある通りにして、Adafruitのライブラリのデモを動作させることができました。後で、ライブラリーのソースコードを見ると、ソフトウェアでSPIを実現しているようなので、HSPI用のピンでなくても、どのピンでも良いようです。実際のピン配置に応じて、次の初期化部分を変更すれば良いでしょう。(実際には試してみていませんので、悪しからず・・・)
Adafruit_PCD8544 display = Adafruit_PCD8544(14, 13, 27, 15, 26);

 デモがちゃんと動作したので、実際に使うことを想定して、プログラムを書いてみました。その時の様子を写真に示します。最も小さな文字をぎっしり詰めて表示したとき、縦に6行、横に14文字表示できました。



コメント

FPGAの学習(分周器を作る)

2020-03-27 17:30:12 | 電子工作
 GPSDOを作るために周波数カウンタが必要なので、FPGAで実現しようとしています。マイコン内蔵のカウンターではビット数が足りなかったりするので、どうしてもFPGAで作りたいのです。
 昨日までに、FPGA開発ツールの簡単な使い方がマスターできたので、次は、VHDLで回路を記述していきたいと思います。まぁしかし、VHDLの勉強をしたのは20年以上前のことなので、殆ど記憶が消去されています。かと言って、一からVHDLの教科書を読むのもかったるいので、ネットでカンニングしながら、簡単なところから記述して、試して行きたいと思います。
 WINGONEERのCyclonII FPGAボードには、EEPROMの他、50MHzのクリスタルオシレータや3つのLEDおよび押しボタンスイッチが実装されています。これらのリソースを使って、周波数カウンターで必要となる1秒のゲート信号を作成するために、50MHzクロックから1Hz(正確に言うと0.5Hz)への分周回路を実験しました。
 動作状態を確認するために、1秒毎にON/OFFを繰り返す信号をLED(PIN3)に出力します。カウンターのビット数は定義していませんが、rangeを指定することで、コンパイラーは何ビットのカウンターが必要なのか分かるんでしょうね。カウンターの出力が49999999になるのは一瞬(20ns)ですが、ちゃんと期待通りに動作しました。下手にif (CNT >= 49999999) thenなどと記述すると、コンパレータ以外の余分な回路が合成されたりするかもしれないと思って、わざと省略しています。
 VHDLでの記述は次の通りです。

 Pin Plannerでのピンアサインは次の通りです。

コメント