« 2014年5月 | メイン | 2014年7月 »

2014年6月20日 (金)

エレキー回路の自作(PIC12F675)

 

<カテゴリ: PICマイコン >

再開局したころから、オートアンテナチューナー(ATU)を模索し、これを自作しようともくろみましたが、挫折が多くて今だに手づかずの状態です。 ここにきて、再度ATUの自作に挑戦しようと思いますが、ATUはそのコントローラーをマイクロコンピューター(マイコン)で作る必要が有り、マイコン開発は避けて通れない状況です。 現役時代はマイコン屋に仕様書を出して、バグを見つけては、ソフト屋をいじめるのが仕事でしたので、自らマイコンソフトを開発した事はありませんでした。 そこで、インターネットでも情報の多いPICマイコンの勉強を始める事にしました。

ハムがマイコンのソフト開発を勉強しようと思えば、最初の教材は、「エレキー」と相場が決まっています。 以下見よう見まねで作ったエレキー回路を紹介します。 なお、ソースファイルは、あまりにも恥ずかしくて公開する自信はありませんでしたが、かなりの方がこの記事にアクセスいただいておりますので、未熟ながら記事の最後の行でダウンロードできるようにしました。

Pickit3_2

使用するマイコンは、開発事例の多い「PIC12F675」とします。秋月で80円で売っていました。 開発環境はMPLAB IDEとHI-TECH Cそれに書き込みアダプターPICkit3です。 書き込みアダプター以外は無償アプリです。

まず、この開発環境構築でトラブリました。メインで使用しているPCはWindows7 64bitバージョンですが、アプリをインストールしてPICkit3を接続してもPICkit3がコネクト状態になりません。USBドライバーがうまくインストールされないようです。Helpをたよりにインターネットで調べていくと、Windows7の64bit版はトラブルらしく、わざわざ解決方法が絵入りで説明されていましたが、私のPCの表示とは一致しません。1日、ああでもないこうでも無いといじったあげく、64bit版を諦めて、Windows XP 32bit版に開発環境を構築する事にしました。インストールが完了し、PICkit3をつなぐと、簡単に認識され、かつファームウェーアーのアップデートを行うということで「OK」をクリックすると、アップデートされ、かつこのPICkit3が正常につながったとコメントがでました。 試に、このファームウェーアーをアップデートしたPICkit3を64bit版のPCにつないでみましたら、こちらも正常に動作するようになりました。  結局、マイクロチップが公式に言っている64bit PCによる不具合ではなく、自社のファームウェーアーにバグが有ったようですね。

やっとPICの開発の勉強ができる環境が整いましたので、PIC12F675の英文データシートとグーグル翻訳を駆使して、ハードの設計を行いました。グーグル翻訳の日本語はほとんど意味が判りません。翻訳された日本語文の中から、判らない単語のみピックアップして、後は英語の原文で理解するのが早いですね。

Elekey675

 上が、このエレキーの全回路図です。 ドットとダッシュの入力端子はマイコンの中の約20KΩの抵抗でプルアップしてあります。送信機に接続されるキー出力はN-MOS FETのオープンドレインとして可能な限り消費電流を減らしました。 また、キーイングのスピード調整は10KΩの可変抵抗で分圧された電圧をマイコンのA/Dコンバーターで読み込み連続可変できるようにし、かつこの可変抵抗器に加える電圧もマーク信号の時だけ加える事により電流を押さえます。 A/Dコンバーターへの信号源出力インピーダンスは10KΩ以下が推奨されていますので、可変抵抗器は20KΩでもOKですが、手持ちが無かったので10KΩとなっています。また、方形波ですが760Hzのサイドトーン信号も出力しています。このサイドトーン信号を実際に使う時は、この端子の後に2段くらいのCRフィルターを設けて高調波を少なくすると聞きやすい音になります。 電源は乾電池3本の4.5Vを想定しています。 CNP1のコネクターはPICkit3を接続する端子で、開発が終われば不要になります。

省電力の配慮をしたのに、SLEEPモード時の消費電流は360μAもあります。乾電池につなぎっぱなしで液漏れせずに使用できる消費電流は、過去の経験から140μAまではOKでしたが、メーカーの判らない100円ショップの電池でも安心していられるのは50μAくらいまでです。SLEEPモードにはいる手順が悪いのか、初期設定が悪いのかと、変更、コンパイル、確認を10数回も繰り返しましたが、一向に改善しません。 もしかしたら、ICが不良品?と予備のマイコンと交換したら、あっさりと直ってしまいました。 動作はすべて正常なのに、SLEEP状態の電流が多いという現象に遭遇しましたら、まず最初にマイコンチップを疑った方が早く解決できそうです。 ICは最初からの不良品ではなく、私が壊したと思われます。なぜなら、一度ラッチアップさせ、マイコンがアッチッチになった事がありましたので。

Elekey675b

最終的な消費電流は以下のようになりました。

マーク出力状態  1.4mA

スタンバイ状態   0.78mA

スリープ状態       1μA以下

マーク信号の出力が終わってから、約3秒後にスリープ状態へ移行します。

左の画像はスタンバイ状態での消費電流を測定したものですが、スリープ状態では、テスターの針はほとんどゼロを指します。 開発ボードにはLEDも見えますが、実際は使っていません。

一応完成したので、キーイングすると、今までのCK-100Aに比べて非常に打ちにくく、さらに時々スリープモードから復帰しません。 CWの短点はコンテストの時など40m秒くらいの長さしかなく、時には35m秒くらいの速さになる事もありますので、通常のチャタリング吸収手法は使えず、とりあえずチャタリング対策なしで設計していました。 キーを自作のキーに変えると、さほど気にならないのですが、GHDのキーにすると、打ちにくさが目立ちます。 そこでGHDキーのチャタリング波形をチェックしてみました。

Elekey675c

左の画像はGHDキーでキーダウンしたときのマイコンのGP4端子の波形です。一応1KΩと0.01μFのフィルターは入っていますがノイズを押さえる効果があっても、チャタリングの吸収は出来ておりません。  チャタリング吸収の為に、通常20~30m秒かけて、入力変化があったと判定させますが、この期間は次の入力を受け付けない訳で、短点、長点メモリーというエレキーには欠かせない機能が制限を受けます。 従い、このキーを受け付けない期間は出来るだけ短くする必要があります。 この為、タイマー0を使ったKey入力の状態チェックは約4m秒くらいで行っていました。 GHDキーのチャタリングを、デジタルストレージオシロで十数回測定した結果、上の画像が一番ひどいチャタリングで幅は5m秒くらいあります。 その為、チャタリング発生中に次のキー状態をチェックする事になり、多重割り込みが発生したり、キー入力を誤判定していたものでした。

キーのチャタリングで5m秒はかなり優秀な方で、手入れが悪いと、10m秒くらいになる事もあります。 よって余裕をみて、タイマー0で割込みが発生してから、約15m秒は次の割込みを禁止し、短点、長点メモリーも機能している事を確かめて、とりあえず逃げました。

ソフト屋からみると、かなり低レベルの部分でトラブりましたが、とりあえず勉強になりました。

しばらく使っていましたが、どうもしっくりいかないので、キー入力のチェック間隔を約16m秒にした上で、割り込み処理中にあった15m秒の割り込み禁止期間は廃止し、かつ長点の長さを従来の3短点から3.3短点に変更しました。 これで、28ワード/分のコンテストスピードでも違和感なく打電できるようになりました。

エレキー用HEXファイルをダウンロード

HEXファイルは説明なしで更新しております。気になる方は最新のファイルをご利用ください。

Eleky675d_2

Elekey675case_2

出来上がったエレーキーは、小さな透明ケースに収納し、FT-450を使った移動運用時に持っていくことにしました。 50MHz 50W運用で時々誤動作がおこりますので、キー出力ラインにLCのフィルターを追加してあります。 LもCもジャンク箱から最初に掴んだものを取り付けましたので、定数は吟味しておりません。

ワンチップマイコンでは無く、プログラムの不要なICによるエレキーの製作はエレキー回路の追加 で紹介しております。

とりあえず、PICマイコンの開発ができるようになりましたので、本来の目的である、ATUの開発に着手しました。 バリコン式ATUの自作 1 を参照下さい。

スリープモードへの入り方、復帰の仕方のみ、ソースファイルを抜粋しました。

void interrupt TimerSleep( void ) {
     if (T0IF == 1) {             // タイマー0の割込み?
          TMR0 = 0x00 ;         // タイマー0の初期化
           if ((GP5 == 0) && (dashfg == 1)) {  
                dotmemofg = 1;
                dashmemofg = 0;
                }
      if ((GP4 == 0) && (dotfg == 1)) {  
             dashmemofg = 1;
             dotmemofg = 0;
             }
       slpcount++;//スリープカウンター
       T0IF = 0;
       }
 if (GPIF == 1) {//sleep modeからの割り込みチェック
       cnt0 = 0;
       GPIF = 0;
       GPIE = 0;
       } 
}

以下main()の中のループの一部です。

if (slpcount > 200) {//スリープカウントが200を超えたら
  GPIF = 0;
  GPIE = 1;
  asm ("sleep");//スリープモードへ
  asm ("nop");//スリープモードから復帰した時のダミー命令
  GPIE = 0;
  }

...

全ソースファイル elekey12f675.cをダウンロード (バグ修正済み)

2017年2月追記

このエレキーの電池は100円ショップの単4アルカリ乾電池3本でしたが、2年8か月でとうとう力尽き、2017年2月に新品と交換しました。

 

2020年11月

プログラムにバグが発見されましたので、XC8用に書き換えて修正しました。

elekey_XC8_version.cをダウンロード

2024年4月

エレキーのWPM速度を表示出来る新エレキーを作り始めました。

 

INDEXに戻る

2014年6月 9日 (月)

C メーターの製作

カテゴリ<道具

最近、チップ部品を多用していますが、一度実装したチップコンデンサは、いくらの容量であったか判らず、疑義を生じた時は、判っているコンデンサに取り替えるという手間をしいれられていました。 在庫が沢山ある場合、問題ありませんが、手持ちが1個や2個になると、外したコンデンサをまた実装する事になりますが、机の上は外したコンデンサだらけで、どれがいくらの容量だったか忘れてしまう事が度々です。 また、運悪く、テーピングからこぼれたコンデンサは、その容量は?で結局ごみ箱行になります。 何かいい手だてはないかと思案していましたら、「JH1HTK方式Cメータ」なるものがある事が判りました。 1PFの容量も測定できるとインターネット上で紹介されていました。

ちょうど、手元に、壊れたクロスメーター式のSWR計と使い道が決まっていなかった広帯域発振器が有りましたので、ジャンク箱をかき回して、手持ちの部品を使いながら作る事にしました。

まず、アナログメーターですが、メーター感度はフルスケール100μAという高感度品ですので、Cメーターには最適です。 しかし、FWD側のメーターは内部で断線しているようで、全く振れません。REF側は生きていますので、FWD側のメーターユニットを取り去り、新たに0から10PFまでの目盛をJW-CADで作成し、これを光沢フォト印刷用紙に実寸大で印刷すると、メーカー品並みの仕上がりで目盛板ができました。

広帯域発振器は、秋月で販売していたLTC1799という品番の方形波発振ユニットです。 以前、FT-450の修理の為、トランジスターを手配した事がありますが、部品代と送料が同じくらいの金額でしたので、何かに使えるかも知れないと一緒に購入しておいたものです。 LTC1799というLinear Technolgy社のICはRSで買っても400~600円しますので、秋月のユニットはお買い得ですね。

このCメーターはCMOS ICの消費電流が負荷となるコンデンサの容量や、ドライブする周波数により変化する事を利用したもので、アナログメーター式ではありますが、かなり正確に測れるらしい。 そのCMOS ICはインバーター1回路を使用するとのことでしたので、ジャンク箱から40年くらい前のモトローラー製の4069UBといインバーターを見つけ出しこれを使用する事にしました。

また、暗電流キャンセルの為に定電流回路が必要で、ジャンクションFETを使った回路が良く使われているようです。残念ながら、手元にJ-FETが有りませんので、ここはジャンク箱にゴロゴロしている3端子レギュレーター2個で、常に一定の電位差を作り、抵抗値を選ぶ事により常に一定の電流を得る事にしました。 5V用と3.3V用のレギュレーターをシリーズに接続し、CMOS ICや広帯域発振器は3.3Vで動作させ、5Vと3.3Vの電位差1.7Vの間に半固定抵抗を入れば、任意の定電流を作れます。 

2.54mmピッチの蛇の目基板にCMOS ICや発振ユニット、3端子レギュレーターを実装し、動作テストすると、100PFや1000PFはいとも簡単にフルスケールが得られ0PFの暗電流キャンセルも簡単に調整できますが、10PFレンジのテストを行うと、うまくいきません。 うまくいかない最大の原因は、周波数を上げていくと、消費電流も比例して増えていくのが正常ですが、15MHz以上になると、逆に電流が減少していきます。 最近の高速CMOSではないからかもと、データシートを確かめると、昔の4069は電源電圧が5V以下になると急激に動作可能周波数が下がってくる事がわかりました。 原因はJ-FETが手元に無かった為、3.3VでCMOS ICを動作させたことのようです。 3.3Vの電源を外部DC電源に変更し、30MHzくらいまでリニアに電流が増える電圧を探すと、3.7V以上あればOKである事がわかりました。 3端子レギュレーターの出力電圧をかさ上げする場合、GND側にダイオードをシリーズに入れ、本来の出力3.3VにダイオードのVf 0.6Vを加えて3.9Vを作る事ができます。  ところが、ダイオードを1個入れたのに3.5Vにしかなりません。 3.3VのレギュレーターはLDOと呼ばれる安定化電源で、消費電流が少なく、シリコンダイオードのVfが0.2Vくらいしかならないような電流しか流れません。ダイオードを3個シリーズにいれると、3.9Vの電圧を実現できますが、微小電流によるかさ上げは、温度変化に敏感になる可能性が強く却下。 インジケーターとして使用しているLEDの電流をダイオードに流し込み0.6VのVfを確保することにしました。 4069を74AHCシリーズのICに変更し、3.3VのLDOのままで動作するようにする案もありましたが、LTC1799も3.3Vのままでは、周波数が20MHzを超えると方形波出力が難しく正弦波にちかくなり、これがまた周波数対消費電流の変化を狂わせてしまいます。

J-FETが入手でき回路を5Vで動作させるのが一番のようですが、とりあえず、以上の対策で使う事が出来るようになりました。

Cmeter1

Cmeterbk1

一応、基本動作はOKとなりましたので、レンジ切り替え用ロータリースイッチやつまみ、半固定抵抗、ケース、電池用ケースとコネクター、それに電池を加えると、3000円近くかかってしまいました。 全体の消費電流は4mAくらいですので、レンジ切り替え表示のLEDにバッテリーインジケーター機能を持たせ、電池電圧が6.5Vを下回ると、LEDが次第に暗くなり6V以下ではほとんど点灯しなくなるようにしました。

Cmeter2

実際の使用では、取り付けられたターミナルに無接続の状態で0PFのキャンセル回路が調整されています。 コンデンサを掴みやすくするためにミノムシクリップを接続すると、この赤色のリード線を取り付けただけで1.2PFくらいを示します。しかも、リード線を動かすとコロコロと数値が変わりますので、ミノムシクリップを使って10PF以下を測定する時は、この浮遊容量を気にする必要があります。

このCメーターは、容量不明のチップコンデンサの容量確認を目的に作ったものでしたが、いざ、使い始めると、自作のポリバリコンや2本のビニール線を互いによじって作ったアンテナチューナー用のコンデンサの容量確認時に威力を発揮しています。

C-METER配線図をダウンロード

5Vのレギュレーターは1Aクラス品ですが、ここは0.1Aの78L05でも問題ありません。   使用している抵抗に75KΩという特殊な値を使っている所がありますが、使用するZDの品種でこの抵抗値は変わります。100KΩの半固定にして、調整可能にした方がいいかも知れません。

容量だけでなくインダクタンスも測れるデジタル式LCメーターの自作はこちらにあります。

INDEXに戻る

続きを読む »