« C メーターの製作 | メイン | 50MHz用 L型アンテナチューナー »

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の短点はコンテストの時など30m秒くらいの長さしかなく、時には25m秒くらいの速さになる事もありますので、通常のチャタリング吸収手法は使えず、とりあえずチャタリング対策なしで設計していました。 キーを自作のキーに変えると、さほど気にならないのですが、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月に新品と交換しました。

INDEXに戻る