RFC-5 周波数カウンタの製作例3

おじさん工房さんが設計した高性能な「RFC-5 周波数カウンタ」用のプリント基板をお送りした3人目の方から、完成報告を頂きました。
今回は、その方(三人目の製作例なので、Cさんとします。)から、素晴らしい情報を頂いたので紹介します。
なんと、今まで色々な方が挑戦して実現できていなかった、OLED 化に成功されています!

なお、今までの周波数カウンタ関連記事は、以下のリンクから確認できます。

Cさんからの情報

Cさんから頂いたメールの内容を要約します。

性能としては、20dBアンプで最高周波数300MHz(TinySA -7dB入力)まで測れました。
またプリスケーラをつなぐと最高周波数960MHz(TinySA -7dB入力)、最低周波数は240MHzでした。
私の持っているTinySAの最高周波数が960MHzなのでもっと上まで測れると思います。

プリスケーラ部

RFC-5 の全体図です。

内容は下記のとおりです。
1.5倍アンプおよびローノイズ電源、20dBアンプなど全ての部品を実装しましたが、20倍アンプが良好なので5倍アンプは使っていません。
2.ローノイズ電源に使う高容量のコンデンサの手持ちでないので、1206の100uFのセラミックコンデンサを使いました。
3.部品のはんだ付けはすべて手はんだ付けしました。
4.表示には手持ちのOLED ssd1306を使いました。それに伴い表示に関係するプログラムを一部変更しました。
5.プリスケーラはuPB1507を使いました。(添付写真参照)レベル変換しなくても使える旨のWEB情報があったのでそのまま出力しました。
6.プリスケーラのBNC出力コネクタの手持ちが無かったのでSMAメスを実装し、SMAオス-オスコネクタで本体と接続するようにしました。
7.最も苦労した点は、TCXOの選定でした。当初秋月のTG – 5021CEを購入しましたが出力レベルが小さくて使えず、AliExpressから購入した
ものでやっと使えるようになりました。

凄いですね。
このサイズの SMD 部品(0603(1608M))を手はんだで組み立てる技術は、私にはありません。

プログラムの詳細

以下もメールからの引用です。

まだ作りかけでバグや未変更もあります。またコンパイラもLaunchpadを使っているのでオリジナルから
少し改変していますが表示はできています。
内容は大きく下記の4項目です。

  1. boardフォルダにoledフォルダを作成し、次のファイルを置きました。
    board—– oled —– font6.h (新規作成 8×6フォント)
    |
    — i2c.c (lcdと同じ)
    |
    — i2c.h (lcdと同じ)
    |
    — i2c_100khz.c (lcdと同じ)
    |
    — i2c_250khz.c (lcdと同じ)
    |
    — ssd1306_i2c.c (新規作成)
    |
    — ssd1306_i2c.h (新規作成)
  2. ssd1306_i2c.cで作った関数が下記の6種です。
    ① void oled_init(void);
    ② void oled_clear(void);
    ③ void oled_xy((unsigned char page, unsigned char column);
    ④ void oled_putch( int c );
    ⑤ void oled_putstr( char *str );
    ⑥ void oled_setcg(unsigned char page, unsigned char column, const char *string );
     例えば①の関数の場合は次のとおりです。
    //———————————————————-
    // OLED 初期化
    //———————————————————-
    void oled_init( void ) {
    i2c_init( );
    delay_msec( 20 );
    i2c_start();
    i2c_write8(0x78); // OLED slave address
    i2c_write8(0x00); // Control byte Co=0, D/C#=0
    // Co=0 とすると以後連続して1バイトづつ送れる
    // Co=1 とすると1バイト送る毎にControl byte を入れる必要がある
    i2c_write8(0x8D); // Set charge pump
    i2c_write8(0x14); // Enable charge pump
    i2c_write8(0xAF); // Display ON
    i2c_stop();
    // その他の初期設定値はパワーオンリセット時のディフォルト値のままとする
    oled_clear(); // clear VRAM
    }
  3. プログラムのlcdc関数を使っているところを上記のoled関数に置き換え
    ① boardフォント内のboard.c
    ② freqcounterフォルダ内のfreqcounter.cおよびfreqcounter_measure.c, freqcounter_setting.c
    ・freqcounter.c内のLCD表示メニューを定義している変数 static menuitem_tの変更
    static menuitem_t menus[N_MENU] = { // LCD 表示メニュー
    { 0, 4, 1, 0, “X1 \0X64 \0X128\0X256\0”}, // PRESCALER 4文字
    { 0, 1, 1, 32, ” “}, // 6文字空白
    { 3, 7, 1,80, “0.1s\0″”0.2s\0″”0.5s\0 1s\0 2s\0 5s\0 10s” }, // PERIOD
    { 1, 4, 1,112, ” -\0″” \0″” +” }, // DIGIT -1,0,+1
    };
    ・freqcounter.c内のsetting_all(void)関数のoled_setcgは、まだ表示データメンテをしていないので
    表示がおかしくなります。
    ・freqcounter_measure.c内のinit(void)関数のlcd_setcgは//でコメントアウト
  4. makefile内のboard 依存ファイルの箇所でlcd/.c および lcd/.hをoled/.c およびoled/.hに置き換え

まとめ

Cさんからは、まだ、試作段階と聞いていたのですが、OLED で表示出来た姿を皆様にも見ていただきたくて、無理を言ってソースの変更部分などをブログに引用させていただきました。
ご協力感謝します。

なお、Cさんからは RFC-5 の OLED 化は問題なく動作していると聞いていますが、改良したい点として、
・手持ちの 8 X 6 dot のフォントを使用したので、視認性を上げるために16 X 8 dot のフォントに変更したい。
・OLED は SSD1306 (128×64 dot)を使用したが、128 X 32 の横長の OLED が使えるかも検証してみたい。(これは私の希望です。このサイズの OLED が使えると、ケースが小型化できますね。)

最近、「エジプト旅行」ばかりしていたので、久々に趣味の電子工作の内容をお送りしました。
私も Cさんの情報をもとに、RFC-5 の OLED 化にチャレンジしたいと考えています。

コメント