2016年1月17日 (日)

E級アンプ 出力アップ検討

<カテゴリ AM送信機(PWM方式)

AM送信機のRFユニットの効率が、WEB上で紹介されている例に比較して、かなり落ちる原因を調べる目的で、RFユニットだけの検討を行いました。

Eamp_2a

 上が検討したE級アンプの回路で、コイルはその時の出力に応じて選択しています。

Etest

Vdの波形をオシロでモニターしながら、VC1とVC2を交互に回し、最良ポイントを探しますが、教科書通りの波形に近くなるように調整する事により最大効率ポイントが見つかります。この効率最大ポイントと出力最大ポイントは異なります。どちらかと言えば効率優先です。また、このVdの波形がきれいになる為にはゲートをドライブするデューティも大きく影響します。 従い、回路図には出ていませんが、VXOのバッファーアンプのベースバイアスを調整して、ドライブのデューティが可変できるようにしてあります。 実験開始時は、ファイナルのトランスにTS930S用の入力トランスを使用していましたが、10Wくらいで、ほんのり暖かくなるので、また出力トランスに戻しました。

この検討の途中で効率90%超の数値が時々出る調整ポイントがある事が判りました。しかし、その時のVdの波形はオシロのトリガが安定しない程、寄生振動を伴った波形で、LPFを通った後もFM成分とAM成分を持ったかなり汚い信号になっていました。 E級アンプはオシロが手元にある場合のみ自作できる回路かも知れません。

このようにして、2SK3234とFKI10531で最良ポイントを求めた結果は以下の通りです。

Efet1 2SK3234の場合、Vdを13.8Vに固定して、コイルを変えて最適ポイントを探したものです。10W以上の出力が出るようにコイルを小さくすると、効率が50%を切りますので、10W以上の検討はしていません。

一方、FKI10531の場合、13.8Vで20Wくらいの出力になるようコイルを選択した後、調整ポイントは動かさずにVdを18.4Vや9Vに変えたものです。 18.4Vで40W出て効率も72%となっています。このFETの場合、最高効率が得られるVdはもっと高い電圧かも知れませんが、DC電源の電圧がこれ以上上がらないのでテスト出来ていません。 ちなみに、この時のVC1の値は170PF、VC2は700PFでした。

そして、写真にもあるように、バリコンを接続して、最適容量を探し、そのバリコンと同じ容量の固定コンデンサに置き換えても、バリコン使用時と同じ状態になりません。 バリコンまでのリード線がもつインダクタンスや、図体がでかいことによる浮遊容量の影響が無視できないようです。 以後、面倒でも固定コンデンサを付けたり外したりして検討する事にしました。

これらの結果から、FETのスペックと、このE級アンプの性能についての関連性を調べてみる事にしました。

Fet_spec

 上の表は手元にあるFETのスペックを抜粋したものです。 限界FREQというのは私が勝手に作ったデータでtd(on),tr,td(off)及びtfの合計値の逆数で、基本的にはこの周波数以上では正常にスイッチングしないという周波数です。 ただし、個々のFETで条件が異なり、実際に使用している条件はこれ以下の環境という事もあり、表示された周波数より上の周波数でもスイッチング動作はしております。 従い、比較したときの目安として気にしたらよいデータと考えます。 また、個々のタイムスペックはメーカー発表のノーマル値ですので、実際はこれ以下の周波数になる事もあります。

このようにして眺めてみると、サンケンのFKI10531はON抵抗を含め最良の数値を示しています。  他の3種類の限界周波数は似たり寄ったりで、バラツキによっては逆転するくらいの実力ですが、効率に関係するオン抵抗の値がそのまま表れている感じです。  また、データとして残していませんが、限界周波数も最も低く、ゲート入力容量が最も大きい2SK2382は、最大出力も効率も全くダメでした。

ただ、FKI10531にも欠点があります。それはゲートの入力容量がこの中では比較的大きいことです。これは、ドライバーICの負担が大きく、TC4422がアッチッチになる原因のようです。そして最大の欠点は耐圧が100Vしかないという事でしょう。  40W出力のときのVdmaxは75Vでした。AM送信機の場合、ピーク電力を確保する為にVdを上げますので、これがネックになります。

8vvd

一応、FKI10531 1石で定格出力10W(ピーク出力40W)のAM送信機を作る事は出来る事は判りましたが、激しいリンギングの為、動作が安定しません。

左は、FKI10531を9Vで動作させた時のVdの波形です。 ピーク部分で凹みが出来ていますが、長時間送信していると、温度が変わり、次第に波形が崩れます。これは使用しているコンデンサの温度特性が大きく影響し、発振寸前の帰還状態がクリチカルになっているのが原因のようです。

色々検討している内に、FKI10531を2個もショート状態に壊してしまいました。 また、リンギングは出力インピーダンスが小さくなるほど出易いようです。 そこで、この際、FETも変更し、電源電圧を上げられるE級アンプを再設計する事にしました。

Fet_spec2_2 

ところで、私の手元に有った、IRF640はIR製ではなく、セカンドソースだったようです。 WEBで紹介されているIR(インターナショナル レクティファイアー)製の場合、私が勝手に定義した限界周波数がリーズナブルの周波数を示すようです。 上の表はIRオリジナルのIRF640のスペックを抜粋したもので、納得出来る限界周波数を示しています。

そこで、IR製のIRF640を手配しようと考えたのですが、入手できるのはTO-220でドレインがそのままフィンにつながっている物しか有りませんでした。 出来たら、フルモールドパッケージのFETが無いかRSで物色しました。 結果、IRF640と似たようなスペックを持つSTマイクロのFETが見つかりました。 上の表にその仕様の抜粋を示します。  STF19NF20は、TO-220Fパッケージで絶縁シート無しで放熱板にビス止めできます。 このほど、このFETを手配出来ましたので、同時に入手したTC4452を使い、下記のように回路を改造しました。 TC4452はVdd端子がフィンに接続されていますので、絶縁シートと絶縁ワッシャは必要です。  (後日、フルモールドパックを選択したのは間違いだったと後悔します。 面倒でもマイカシートで絶縁し、シリコングリスたっぷりのドレインむき出しのFETの方が良いです)

OSCバッファーとFETドライバーの間に挿入されていたインバーターがDC直結になっており、OSC段の異常でFETのゲートがHになりっぱなしという現象が再現しましたので、OSCバッファの出力をコンデンサでDCカットし、インバーターをC-MOSに変えました。C-MOSの入力にはプロテクトのダイオードが実装されていますので、このダイオードで入力信号が0Vでクランプされ、うまく動作します。 ただし、そのままでは、入力が無いとき、FETゲートは常にHとなりますから、もうひとつインバーターを入れてあります。

Eamp5

Rfunit5

また、基板上のレイアウトも変更し、TC4452とSTF19NF20は基板上に配置した放熱板に固定し、リンギング対策としてFETの出力ラインは5mm幅の短冊状に切った厚さ0.3mmの銅板で配線し、極力浮遊インダクタンスを削減しました。

左がその基板ですが、TC4452とSTF19NF20のパラレルドライブが可能なように配置してありますが、今はシングルドライブです。

この状態で、電源電圧13.8Vのとき、15Wの出力が得られ、効率は63%くらいです。

TC4452の消費電流は200mAくらいでTC4422と同じですが、FETのゲート電圧波形が気持ちだけ良くなりました。 また、このゲートドライバーも終段FETと同じ放熱板上に止めてある関係で、長時間連続送信でも安定しています。

Amtx_640hz

このRFユニットを変調器と組み合わせて見ました。 電源電圧を18.4Vにすると、無変調時の変調器DC出力は9Vとなり、RF出力は7Wとなっています。 最大変調度は、87%くらいで、電流の増加はありますが、クラニシの終端型電力計は7Wのままです。 この電力計は熱電対型ではないので、変調度が変わっても指示は変わりません。 少なくとも、マイナス変調にはなっていないようです。

 左の波形は680Hzで変調した時の波形です。 現在、RFユニットと変調ユニットを無造作に置いてある為、RFが変調器へ回り込み、波形が崩れる事もあります。 実際に組み立てる場合、配置やシールドを検討する必要があるかも知れません。

 

New_lpf0129

7MHzのLPFは計算で求めた定数のままで、特性の確認はやっていませんでしたので、出力側に50Ωのダミー抵抗をつなぎ、入力側にアンテナアナライザを接続してSWRを計ってみました。すると、7MHzでSWRが2を示します。インピーダンスは25Ω付近です。周波数を3.5MHzまで下げると、SWR1.1くらいになります。 どうやら、計算間違いがあるようです。 このLPFは再設計する事にします。

上が、新たに設計したチェビシェフLPFの定数です。 計算は下記URLで行いました。

http://gate.ruru.ne.jp/rfdn/Tools/ClpfForm.asp#

計算されたインダクタンスやキャパシタンスを実装できる訳はありませんので、自由の効かない、インダクタンスを一番近い巻き数にしておき、後は、コンデンサで微調整した結果が上の定数です。

Lpf0129

このLPFに50Ωのダミー抵抗をつなぎ、入力部分に自作のアンテナアナライザーを接続した時の周波数対SWR特性を表示させたグラフを左に示します。 SWR最少周波数が7.200MHzで1.16となっており、そこそこの特性は得られているものと考えます。 しかし、事前確認では、かなりの挿入損失が有りそうでした。

過去、いくらやっても、60%かそれ以下の効率しか出ないのは、このLPFの挿入損失の性かもしれません。 そこで、新たに作成したこのLPFでLPF有り無しの時の効率データを取ってみました。

Lpf_pwr

結果は下の表の通りで、LPFが無い場合のE級アンプの効率は74.8%とそこそこの値が出ていますが、LPF有りの場合、62.1%となり、LPFだけで、27%もロスしております。 今回のLPFはコイルにT-50-2というトロイダルコアを使ったものです。 今までのLPFは定数設定に誤りがあり、LPFのロスも30%を超えていたようです。

E級アンプの効率が悪いのは、LPFの問題であり、実験した回路で、世間並の効率は確保されている事が判りましたので、以降、単純にパワーアップに絞って検討していく事にします。

E_amp0130

左の表は、E級アンプの回路を当初のコイルとコンデンサが直列に接続されたフライホイール回路に戻し、トランスを1対3の巻き数として、最適値を探した時のデータです。 LPF無で、81.6%の効率は良く出来た方と思われます。

E0130vd

左の波形は、12.84Vで15Wの出力が得られている時のVdの波形です。 ほぼ教科書通りの波形をしています。 また、リンギング対策もかなり効いてきました。 

電源電圧を17Vくらいまで上げると、LPF付でも25Wの出力が得られていますので、 定格出力20W(ピークパワー80W)のAM送信機がこのFET1石で可能かも知れません。 これから、36VのDC電源を模索します。

Eamp0130

左は、E級アンプのファイナルとフライホイール回路及び出力トランスの部分です。 使っているコンデンサは200V耐圧のセラミックで、わざわざ温度特性がかなり良いB特を選定しましたが、パワーON直後の1分くらいは出力が変動します。 最終的には、シルバードマイカに変更しなければならないかも知れません。

左の隅に一部写っているのが問題のLPFです。これは、この送信機が完成した後、再検討する事にします。

ここまでの配線図 AMTX_8.pdfをダウンロード

変調性能確認 へ続く

INDEXに戻る

2016年1月 3日 (日)

低周波信号発生器

PICマイコンによる正弦波発生器を使いやすくする為、このコントローラーを作成しました。

DAコンバーターを利用した正弦波発生器はこちらを参照下さい。

PICで作成した正弦波発生器はDAコンバーターの駆動周期を初期設定した後、この設定値に基づき、ただひたすらに正弦波を発生し続けるもので、周波数を変更したい場合、PICをリセットする必要がありました。 また、発生する正弦波の周波数はPICのクロックや命令サイクルに依存し、きりの良い1000Hzとか3000Hzとかは不可能で、PIC内部の分周値による決まった周波数しか発生できません。 よって、発生した正弦波の周波数を計測して、なんらかの形で表示が必要でした。 その為、コントローラーには、正弦波発生器の初期値を決めて、RESETする機能、発生した低周波の周波数を計測する機能、計測した周波数を表示する機能が必要となります。

まずは、ソフト開発のデバッグにも使える、周波数(整数)をLCDに表示する機能をつくりました。 詳細はこちらを参照下さい。

正弦波発生器の初期設定とRESETは、本来、メカニカルSWで行っていたi/o操作をオープンコレクタのデジトラで行えるようにするだけですので、これは簡単に実現できます。

Sin_osc_cntler

発生した低周波の周波数を計測する周波数カウンターが必要になりますが、Hz単位での表示となりますので、カウンターのゲートタイムは1秒必要です。 最初,100msec単位で計測し、10回分を合計したカウント値を表示していましたが、周波数が低くなるほどカウント誤差が大きくなりました。 原因は100msecの間に発生するカウントの実際は小数点付になるのですが、PICの中では整数としかカウントしませんので、10回分合計しても、最大で-10の誤差が出ることでした。 やはり、表示はとろいですが1秒間待って表示しています。 周波数を可変すると、正しい周波数を表示するまで1秒以上かかりますが、周波数切り替えやLCD表示に違和感はありません。 

この回路の低周波の出力電圧は約0.78V(0dBm)ありますので、20dBと40dBのATTを設け、-20,-40,-60dBmの信号を得る事ができ、また、可変抵抗器で連続可変できるように、可変抵抗器のつまみの周りに実測値による目盛を入れ、-16dBまで1dB刻みで絞れるようにしました。

1khz_spectol

上のスペクトル画像は1KHzの出力をフリーソフトWaveSpectraで表示させたものです。第2高調波レベルが-40d以下になっていますので、なんとか1%以下の歪率は確保できました。

Sinosc_box

完成した基板やコントロール類、LCDを透明のタッパーの中に収め、単3電池8本の電池パックで動くようにしてあります。 これで、AM送信機の検討が便利になりそうです。

ソースファイル OSC_controller.cをダウンロード

配線図 OSC_schema.pdfをダウンロード

AM送信機のテストの為に使ってみました。一応基本動作はOKで、歪の確認や周波数特性のチェックは出来るのですが、送信ONにすると、周波数があさっての方に飛んでいきます。OFFにしても同じ。 マイコンの高周波妨害耐力は甚だ弱いようです。 少しでも効果があるようにと、タッパーの内側に銅箔テープを貼り、アースしたのですが、イマイチでした。

そして、AM送信機の出力を40Wまでアップしましたら、送信中に周波数変更もできない事が発生しました。 暇なら対策しますが、今はAM送信機を完成させる事の方が優先で、インターネット上で「WaveGene」というフリーソフトを入手し、PCから正弦波を供給しています。 こちらの方は、PCが誤動作しない限り大丈夫ですが、そのままでは誤動作しますので、USBマウスの根本に40mmの長さのフェライトコアを挿入し、このコアにUSBケーブルを4回も巻きつけております。

暇になりましたので、RF回り込みによる対策を行いました。 配線図とソースファイルは修正済みです。(2016年7月31日)

その後、PCのWGの利用と、パナソニック製のファンクションジェネレーターなどの入手により、この発振器はジャンク箱いきとなり、今では部品取りの材料になってしまいました。

INDEXに戻る

2016年1月 1日 (金)

LCD-TS174をPICによりドライブ

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

「aitendo」という通販ショップで99円のLCDが売られていました。 その他の部品を含めてこのLCDを2個購入したのですが、仕様書はなし、有るのは、使用されているICの品名と、ATMELのチップ用デモソフトのみという物でした。 

今、PICマイコンで正弦波発生器を作っていますが、この周波数表示にちょうど良さそうですので、このデモソフトをPIC用に書き換え、WEB上からダウンロードしたICの仕様書を基に周波数を表示させてみる事にしました。

使用するマイコンはPIC16F1827という8bitのマイコンです。 周波数表示ですので、マイコンのクロックは7.2MHzの水晶発振で、これをPLLで4倍とした28.8MHzのメインクロックとしてあります。

回路図 LCD_demo_schema.pdfをダウンロード

オリジナルのデモソフトをこの配線図に合わせてi/o変更をした上で、XC8でコンパイルできるように書き換えました。 オリジナルの仕様では、一旦LCD全画面をクリアーした後、左側から順番に各セグメントが点灯していきます。 これをヒントに7セグの数値を表示させるコードを調査し、下記のように解析しました。

Ts147_segmap

このコード表をベースに7ケタの整数を表示するプログラムを作りました。数値以外に文字やドットがありますが、今回は使っていません。

Lcd1250disp

このLCD用のICのクロックは3.3uS以上を要求していますので、余裕を見て約6uSくらいのクロックになるようディレーを入れてあります。 また、メイン関数の170行目にwhileで無限ループを作り、以下のプログラムは実行されないようにしてあります。 この170行目のwhile文をコメントアウトすると、オリジナルデモソフトが動作します。  

また、プログラム上にはLEDが出てきますが、デバッグ用です。 さらに、RB0からの外部割込みの記述もありますが、このLCD表示については不要です。

PICkit3からHEXファイルを書き込もうとするとき、このICもVDDを5Vを指定するとエラーになります。4.875Vに設定すると問題無しです。

99円のLCDでも十分実用になります。 周波数のLCD表示が可能になりましたので、正弦波発生器のコントローラーを作る事にします。

ソースコード LCD_TS174BNLdemo.cをダウンロード

このオリジナルソースをベースにXC16でコンパイルしたところ、LCDのデータラインに信号が出ません。 色々調べた結果、下のLCD_Wr_Data()の関数の中で、

 B=B>>7; の処理を追加しないと、現状のままでは、データをi/oポートへ送る事が出来ない事が判りました。 判ってしまえば当たり前の事で、いままで動いていたのが不思議なくらいです。

void LCD_Wr_Data(unsigned char Data,unsigned char cnt) {
   unsigned char i,d,B;
    d = Data;             //Dataを一度ローカル変数に置き換える
    for (i=0;i<cnt;i++) { 
         LCD_WR=0;
         delayNop();
         B=d & 0x80;         //Dataと0x80とアンドを取った値を一度ローカル変数に置く
        B=B>>7;
         LCD_DA =B;          //LCD_DA=Data & 0x80 ではうまくいかない
         delayNop();

         LCD_WR=1;
         delayNop();
         d = d<<1;
       }
  }

INDEXに戻る

2015年12月28日 (月)

7MHz RFユニット

<カテゴリ AM送信機(PWM方式)

AM送信機のRFユニットの作成です。

まず、7195KHzと予備として7190KHzをカバー出来るVXO回路を作る事にしました。

 

Amtx_vxo_2

7.2MHzという水晶はAM/FMラジオ用PLLシンセの基準周波数として使われていたものですが、最近、この周波数の水晶が大量に格安で売られています。 今回は「aitendo」という通販ショップから購入しました。 

この回路で7199KHzから7188KHzまでの11KHzを可変できます。水晶に直列に入れたコイルはSMTタイプの固定インダクタですので、最適インダクターとはなっていないかも知れませんが、目標とした2つの周波数は確保できましたので、良しとします。

AMのもうひとつの常用周波数である7181KHzをカバーするVXO回路の製作はこちらにあります。

次に、ドライバーとMOS-FETによるファイナル部分です。

送信機全体の回路図 AMTX_0.pdfをダウンロード

Q3でTTLレベルまで増幅し、波形整形の為、CMOSゲートを通した後、FETドライバーのTC4422に入力し、その出力でMOS-FET FKI10531をドライブします。FETのドレイン側にはチョークコイルとフライホイール回路とインピーダンス変換トランスを設け、7MHzの7次LPFを通してアンテナに出力されます。 E級アンプの基本回路では、FETのドレインとGND間にCdsなるコンデンサが必要なのですが、FETのドレイン、ソース間に120Pの出力容量が存在しますので、60PFのトリーマーだけを入れてあります。 このトリーマーを回しても、出力や効率はほとんど変化しませんが、Vdの0V付近で発生するリンギングの様子が変化します。 調整はこのリンギングが最少となるポイントに合わせました。

この回路は下記のURLを参考に、13.8Vの電源で50Wを出そうと考え、設計しましたが、残念ながら出力も効率も全くダメでした。 (ダメな原因は私の使い方でした。ここで正しい使い方を紹介しています。)

http://people.physics.anu.edu.au/~dxt103/class-e/

当初6V12.5Wで設計したのですが、2SK3234で1Wしか出力できず、効率も30%以下でした。 色々WEB情報を調べても、6V12.5Wクラス(12V50W同等)のアンプは130KHzくらいのアンプの例しかなく、7MHzくらいの周波数では無理があるようです。 従い、6V5W(12V20W相当)まで出力を落とす事にしました。しかし、2SK3234ではどんなに頑張っても3Wくらいしか出ず、効率も50%くらいでした。 また、手元にIRF640もありましたので交換したところ4W出ましたが、効率は50%止まりでした。 そこで、変調器のFETはサンケンが一番良かったので、キャリア増幅用もサンケンのFKI10531に換えてみました。すると、5Wの出力で効率も60%くらいまで改善しました。 

Amtx_6v_test

手前の基板がVXOとキャリア送信部です。 今回はVXOの出力は使用せず、アンテナアナライザーから7195KHz付近のキャリアを入力し、周波数を可変しながら、フライホイール回路が最適になっているかをテストしました。 基板上の黒い四角の物体はメガネコアで、ジャンク扱いのTS-930Sのファイナル段から取り外したものです。1次側は銅パイプによる1ターンの巻き数で、2次側はAWG24のビニール線を3ターン巻いてあります。 この出力は左上にあるコイル3個のLPFを経由してクラニシの終端型パワー計につないであります。

FETのドレインに接続される10uHのチョークコイルもTS-930Sのファイナル段から取ってきたものです。

Amtx_7mout

左のオシロ波形は下がFETのゲート電圧波形で8Vピークあります。 E級アンプの技術資料には決まって台形の波形が登場します。1.8MHzくらいなら、きれいな台形波形をしていますが、7MHzともなると、だんだん角が取れてくるようです。 当初、教科書通りの波形にならないので悩みましたが、WEBで見つけた7MHzや14MHzの1KWアンプのゲート波形はこれよりもっとひどくなまっておりましたので、安心しました。 

上の波形はドレイン電圧の波形で、37Vピークあります。この時の正確なVDDは6.01Vでしたので、約6.2倍の電圧が発生しています。 このFETのVdmaxは100Vですので、16V以上の電源では使えないという事になります。 パワーアップする場合、再度FETの品種選定が必要です。  

Amtx_7mhz_out

左の波形は7次バターワースLPFを通過した後の7MHz出力波形です。見た目での高調波歪はかなりよさそうです。 変調器との結合が出来たらスペアナでチェックする事にします。 この7次バターワースLPFの計算もPWM変調器用LPFと同じURLで計算しました。

Eamp04uh_2

コイルのインダクタンスが少し大きいとおもわれますので、現在の約1μHから約0.4μHくらいまで小さくし、シリーズコンデンサを約1500PFくらいまで増やしてみましたら、左のようなきれいなVd波形となりました。パワーは6Vで4W出ていますが、効率は、50%前後まで落ちました。

その後、13V 10Wの出力になるよう定数を変え、実験しましたが、テストした3種類のFETいずれでも55%以上の効率を確保できませんでした。 効率が上がらない理由は、FETも関係しますが、コイルやコンデンサ、トランスが最適になっていないのが原因のようです。

E級アンプの調整箇所を少なくして、検討しやすくする記事が見つかりました。 これによると、コイルにシリーズに入るコンデンサを無くした代わりに、コイルの前後にコンデンサを追加し、コイルとコンデンサ2個を最良状態にもっていけばいいようです。 

フライホイール回路の直列共振コンデンサを廃止し、トランスも止めて、LCによるインピーダンス変換回路をジャングル配線で試したところ、2SK3234では55%の効率でしたが、FKI10531では75.5%まで改善しました。 ただし、5Vで1.5Wしか出ていません。 12V換算で9W弱ですから、目標にはまだまだですが、効率を上げる方法が判ってきました。

Amtx_01

効率を上げようとすると、出力にリンギングが激しく乗ります。これを対策する事を含めて、各回路の配置をやり直し、かつトランスも廃止したのが左の写真です。

コイル両端のコンデンサをバリコンに置き換え、コイルも効率最大となる値になるよう試行錯誤した結果4.8Vの電源で1.8Wの出力が得られた時のIdは0.392Aでした。 効率は95.6%と計算されました。 この時の負荷インピーダンスは約12Ωです。 

ここまで出来ると、後は、効率を我慢できるレベルまでダウンさせ、6Vの電源で何ワット出力できるか探ることにより、なんとか実用できそうです。

Vd_0109左は、この95.6%の効率の時のVdの波形です。従来の波形よりいびつですが、FET OFFの時のVdの面積が明らかに広くなっています。 また、この時の波高値は25Vくらいで、初期のころよりピークは小さくなっています。 この事は、Vdmax100VのFETでも電源電圧を19Vまでかけても良いという事になります。

この状態の時の回路図を以下に示します。

Amtx_rf1_3

当初の目標である6V 5Wの出力にトライし、効率78%を得ましたが、激しいリンギングが発生し、回路が安定しません。 リンギング対策は難航を極めました。 上のトランスの無い回路では、フライホイール回路に流れる歪んだ電流経路が多技に渡り、発振現象を押さえるのがとても難しくなりました。 そこで、最終的に、フライホイール回路のコイルの向きを90度変え、かつトランスを復活させフライホイール回路電流通路の単純化を行い、出力も3.4Wまで落とした結果、なんとか安定して動作するようになりました。この時の効率は70%くらいです。

Amtx0111

また、OSCとFETドライバーの途中に挿入したバッファーもインバーターに換えました。 これはOSC回路が動作停止したとき、ファイナルのFETのゲート電圧が8Vで固定され、大電流が流れ、FETが壊れるのを防ぐ為です。

復活したトランスはTS930Sのファイナルの入力段に使用されていた小型のメガネコアに変えました。

 変調器から見たインピーダンスは約7.2Ωとなりました。

ファイナルのFETはベースのアルミ板にビス止めしてある事もあり、ほとんど発熱しませんが、TC4422はかなり熱くなります。 このICはスペック的にデータが公表されているのは2MHzまでで、7MHzは実力で動作していますので、製品ロットでかなりバラツキがあるのかも知れません。 データシートによれば、FETのゲート容量1500PFで、8Vの時の消費電流は2MHzにて74mAくらいと予想できますが、実際の回路では7MHzで200mA流れています。 次回の検討では、このICよりもう少しドライブ能力の高いTC4452を手配してみる事にします。

修正した回路図 AMTX_2.pdfをダウンロード

TC4452手配がまだですので、先にパワーアップ検討を行いました。

E級アンプ 出力アップ検討 に続く。

INDEXに戻る

2015年12月19日 (土)

PWM変調器

<カテゴリ AM送信機(PWM方式)

7MHzバンドで使えるPWM変調方式のAM送信機を作る事にしました。 CQ誌に掲載されたオール半導体によるPWM変調方式のAM送信機の記事を見て、作ってみたくなったのがきっかけです。

WEB上にあるOM諸氏の記事や解説を頼りに、構成を決め、机上検討していましたが、いよいよ部品集めの段階になり、ぼちぼち、部品が集まってきましたので、まずは変調回路から試作する事にしました。

Amtxmod1

Amtxmod2

 

Amtx_mic_freq

マイクの入力感度は-50dBmくらいですので、最大ゲイン60dBくらいのオーディオアンプの初段にDual-GateのFETを使い、G2の電圧をコントロールしてリミッターアンプ機能を付けています。また、3KHzをカットオフ周波数としたOP-AMPによる3次LPFも実装しました。 これらのアンプの動作テストも行い、リミッターがちゃんと動作する事は確認済みです。 ただし、リミッターのアタックタイムやリカバリタイムは実際にマイクに向かってしゃべってみないと良く判らないので、送信機が完成した時点で再調整します。 Dual-Gate FETの最大VDDは6Vなので、8VのLDOの出力をダイオードとLEDで無理やり5Vに電圧シフトして使っています。 これらのテストの為、作成したPICマイコンによる正弦波発生器は重宝しております。

このマイクアンプの出力は、TPA2006というTIのPWMオーディオパワーアンプに入力し、スピーカー出力用の+側端子からPWM波を取り出し、これをフォトカプラー経由でMOS-FETの終段をドライブします。

Amtx_1khz_tpa2006out

PWM変調に使うTPA2006は秋月で2.5ピッチの変換基板付で300円で売られているものですが、入力端子にシリーズに付いている抵抗とコンデンサは変更してあります。  左の波形は、このアンプのPWM出力をLPFを通した時の1KHzの波形です。 5Vの電源で4Vppの無歪出力が得られています。出力を上げていくと4.5Vppくらいからクリップしますので、リミッターアンプがクリップ寸前で飽和するようにVR2により調整します。

このパワーアンプの出力はVR4を経由して、高速フォトカプラーに入力されます。 この入力抵抗が5KΩの半固定抵抗になっているのは、内部のLEDとフォトTRのバラツキで、PWMのデュティが変わってしまうので、これを調整する為のものです。 最終的に7MHzのE級アンプに接続して、無変調状態で、E級アンプに供給されるDC電圧がファイナル用電源電圧の1/2になるように調整します。

Amtxpwmfetcomp_2

左の表は、最終段のMOS-FETの品種を変えて、測定した出力電力です。

FETのドレインに13.2Vを加え、ソースとGND間に2.2Ωを負荷として接続し、無変調状態で、この負荷抵抗の両端電圧と電流を計測したものです。 オシロスコープでモニターし、いずれも250KHzのデュティ50%の矩形波である事は確認しています。

結果は、秋月で1個40円で売っていたサンケンのFKI10531が一番良い結果を示しました。このFETはON抵抗は小さいのですが、入力容量が1500pFくらいありますので、7MHzのキャリア増幅には向かないかも知れません。 変調段は250KHzでのスイッチングですので、変調段のFETはサンケン製に決定します。

Amtxlpf_cal

左の表は、PWM終段のFET出力からE級アンプまでの途中に挿入されるLPFの計算結果です。 LPFは3段バターワースでカットオフ周波数を9KHz,入出力インピーダンスを1.8Ωとして設定してあります。 この計算はWEB上で計算方法を公開しているRFDNのサイトで計算しました。 URLは以下です。

http://gate.ruru.ne.jp/rfdn/Tools/BlpfForm.asp#p1

3dBカットオフ周波数と250KHzの減衰量を指定しますが、3段のLPFにしたいので減衰量は80dBとしました。次にLPF パイ入力型でインピーダンスを1.8Ωにしてやると、この表のような結果が得られます。 後日検討するE級アンプのインピーダンスをシュミレーションしましたら、1.8Ωくらいで出力10Wが得られるようですので、LPFのインピーダンスも1.8Ωで計算しました。

トロイダルコアにコイルを巻いて必要なインダクタンスを確保しますが、手持ちのトロイダルコアに1mmのPPシートによるギャップを2か所設けて、重畳される直流電流で磁気飽和しないように配慮した上で、1.5mmのPEW線を27ターン巻き約64uHを確保しました。 コアは北川工業のGTFC-41-27-16という品番です。 

Amtx_lpf63uh

左の画像は、トロイダルコアに巻かれたコイルに0.0056uFのマイラーコンデンサをシリーズに接続し、自作のアンテナアナライザーで共振周波数をチェックしているところです。  

L1の63.7uHと0.0056uFの共振周波数の計算値は約266KHzですが、実測値は263KHzでしたので、ほぼOKと思われます。

トロイダルコアはFT-140#61が一般的に入手しやすいのですが、たちまち手持ちがありませんでしたので、かなり特殊な北川工業のコアを使いました。 また、今回はLW帯で使用可能なアンテナアナライザーで測定しましたが、コンデンサを0.0056ではなく100PFにしてやると計算上は約2MHzの共振周波数となります。 しかし、一般的な1.8MHz以上で使用可能なアナライザーでは、コイルの浮遊容量などの影響で正しい共振周波数を見つける事は出来ませんでした。

 2016年1月10日 追記

LPFの定数が決まり、変調段だけのテストしたら、波形が大きく歪みます。原因を調査したところ、フォトカプラーの選定ミスという事が判明しました。TLP552クラスを選定しないとPWMのスイッチングスピードに追いついていかないようです。 TLP552を手配している間に予備検討したところ、スィッチング周波数250KHzは高すぎるかも知れないという不安がありました。 

TLP552が入手できましたので、各段における歪状態を確認する事にしました。

Mod_tpaout_clep_2

Mod_tpaout__2Mod_fet_sout_

波形は左側がPWMオーディオアンプのスピーカー出力端の波形で上下がクリップした状態で、このレベルから1dB下げた状態が真ん中の波形です。 右側が終段FETのソースとGND間に4.4Ωのダミー抵抗を接続し、その両端にLPFを接続した時の波形です。ひずみやクリップは有りません。 この状態でレベルを1dBアップすると、この出力も上下がクリップ始めます。 

スイッチング周波数が高すぎるのでは心配しましたが、波形を見る限り問題はなさそうです。

 

Mod_lpf1_2

RFユニットのE級アンプがなんとか使える状態になりましたので、インピーダンスを再設定して、LPFを再設計することにします。

E級アンプのインピーダンスは実測で7.2Ωとなりましたので、3dBカットオフ周波数を10KHzとして、再計算した結果は左の表のようになりました。 L1の値がかなり大きくなりましたので、コイルは作り直しです。 インダクタンスが大きくなりましたのでコアに挟んだギャップスペーサーは全て廃止し、ワイヤーも1mmのUEWに変えました。

さあ、出来たと、RFユニットと結合して変調の度合いを見る事にしました。ところが、1KHzのプラス側半分がつぶれた波形で、流れる電流も単体のときの約2倍。 まったく使い物にならないひどい変調です。 単体のときのモニターではきれいな正弦波が得られていたのにと焦りました。 原因はLPFのC1の存在でした。C1はFETのソースとRFのGNDの間に接続され、ここで250KHzのキャリアがフィルターへ行かずバイパスされていました。 変調回路のフィルターはパイ型は使えないということです。 C1の2.2uFのコンデンサを廃止し、その他のLCはそのままで、インダクターインプット型にするときれいな正弦波で変調がかかりました。

Amtx_mod90

上の波形が7MHzのキャリアに1KHzの変調をかけた状態です。 電源電圧は9VでRF出力は約1.5Wです。 残念ながら、この状態が約82%の最高変調度で、これより少しオーディオゲインを上げると1KHzの波形が上下でクリップ始めます。 原因は大体推測は出来ます。 FETの飽和電圧と思われます。 波形を見ていると、過大入力が有っても、このオーディオ信号のクリップの為、7MHzのキャリアがゼロになる事は有りません。 これは、過変調によるスプラッタ増大を防止する効果があるかも知れません。

デュアルゲートFETを使用したリミッターアンプを付けていましたが、このFETアンプのリップルリジェクション能力がほとんどなく、変調音に電源のリップルや、送信したRF信号が電源ラインに乗り、ノイズとして聞こえます。 よって、このFETによるリミッターアンプは廃止する事にしました。 とりあえずリミッター無しで進行し、その内にリミッターICでも追加する事にします。

修正した配線図 AMTX_9.pdfをダウンロード

F

最終的な変調器の周波数特性は左のようになりました。 -3dB幅は125Hz~3500Hzくらいです。

7MHz RFユニット へ続く

INDEXに戻る

2015年12月 9日 (水)

正弦波発生器(PIC18F14K50)

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

CQ誌のPWM変調AM送信機の記事に魅せられて、微力ながら、このアナログの塊のオールソリッドステートの送信機を作りたくなりました。  WEB上の情報から、この送信機の構成は理解できましたので、部品集めを進める傍らで、AM変調用の低周波発振器の必要性を認識しました。 実は、45年前に購入した20Hzから200KHzまでカバーするKENWOOD製の低周波発振器を6年前に完動品のまま粗大ごみに出してしまった事を悔やんでいます。 

CWのサイドトーン用にウィーンブリッジ式の正弦波発振器の製作例はこのブログでも紹介していますが、せっかくPICマイコンを曲がりなりにもいじれるようになりましたので、マイコンからDA変換を利用した正弦波発生器ができないか検討する事にしました。 WEBで検索すると、PICマイコンで正弦波を発生させる方法が沢山見つかりました。 その中で、マイコンのシステムクロックをフリーランの外部クロックで駆動し、任意の低周波周波数を得る方法と、固定クロックでADの出力周期を変えながら複数のスポット周波数として発生させるアイデアがあるようですが、その中で、比較的ひずみ率が良好で、簡単なCRフィルターで構成出来る8bitのラダー抵抗式DAコンバーターが良さそうです。

AM送信機で必要な周波数は1KHz、及び300Hzから3KHzの変調周波数特性と、これより広い範囲でどれだけ減衰しているかをチェックできる周波数帯となる100Hzから6KHzくらいをスポットでカバーできる周波数があれば良く、周波数も大体でOKですが、ひずみ率は1%以下とし、全周波数帯域に渡り出力レベルは+/-0.5dBくらいに抑えたいという条件があります。

マイコンは、使い道が無く、ジャンク箱に転がっていたPIC18F14K50というチップを拾い上げ、これにアセンブラでソフトを仕込む事にしました。 アセンブラによるソフトの開発は30年以上前にMC68000で少しかじっただけでしたが、データシートやWEBでの情報を頼りに再挑戦する事にしました。

まずは、ちゃんと正弦波が発生できるかどうかですが、約1週間かかり、なんとかそれらしき信号が得られました。 

40hz_nolpf_2

9khz_nolpf_3

左は最低周波数、1サイクルを256分割した40Hzの波形。右は最高周波数、1サイクルを64分割した12.5KHzの波形です。いずれもまだLPFは入っていないDAC出力直後の波形です。

波形の様子から、簡単なCRによるLPFでクロックによる高調波は取り除く事ができそうです。OP-AMPによりカットオフ周波数約30KHzのLPFを作り、DACとこのLPFが持っている周波数特性をもう1段のOP-AMPで補正し、40Hzから12.5KHzまでほぼフラットな正弦波発生器ができました。

40hz_lpf

1khz_lpf

9khz_lpf

左から40Hz,1KHz,12.5KHzのLPF後の波形で、周波数特性の補正を行い、振幅を一定にしたものです。ひずみ率計がありませんので、はっきりした数値は判りませんが、経験的にいずれもひずみ率は1%以下になっているようです。

配線図をダウンロード

A_osc2

A_osc1_2

上がPICによるDAコンバーターとLPFのOP-AMPを実装した基板です。 基板裏側の左側の空き地は後日、この正弦波発生器をコントロールするマイコンを実装するスペースです。

PICのプログラムは周波数を初期設定した後、無限ループに入って、正弦波を出力し続けますので、周波数を変更したい場合、周波数設定用のSW1からSW5をセットした後、RESETスイッチSW9を押すことで実現します。 これをロータリーSWかロータリーエンコーダーの操作のみで実現する為に、周波数表示が可能な簡単なマイコンを実装する予定にしていますが、今回の目的が、AM送信機を作る事なので、コントロールマイコンやケース入れは後回しにします。

 ソースコード sin_wave_osc.ASMをダウンロード

SW1-SW4に対応した周期カウント値は適当な値ですので、周波数カウンターを使い、トリミング必要です。

INDEXに戻る

2015年11月 8日 (日)

アンテナアナライザーの製作(ケース入れ)

<カテゴリ:アンテナアナライザー>

手作り、バラック状態のアンテナアナライザーがなんとか完成しました。 しかし、アンテナアナライザーは基本的に屋外で使うものであり、これを実際に使用する為には、持ち運び可能なケース入りでなければなりません。 

Aa59_jw_case JW-CADで組み立て図を書いて、これを基に部品図面をお越し、雨の降る中、屋外で作業する事2日間。

Aa59_casein

アルミ板を切断したり穴を明ける加工は、ほぼ設計図面通り出来るのですが、曲げ加工は折り曲げ器がありませんので、当て木とハンマーで仕上げる事になります。 結局、曲げ部分は直角にならず、エッジも凸凹となってしまいました。  

左の写真は、塗装前の状態で、LCDやタクトSWの位置確認を行ったものですが、JW-CADによる実寸組み立て図が功をはくし、センターずれは有りません。 ただし、LCDのコネクター部分に何も配置できない為、デザイン的に、やや間延びした縦長の箱になってしまいました。

裏板も作ったのですが、電池ケースを入れるスペースにSDカードのコネクターが張出し、電池ケースを収納できませんでした。

他にも、不具合があるようですので、再度分解して、SDカードのピンヘッダーの位置を含め対策する事にしました。

Aa50blk

フロントパネル面のレタリングをデザインし、これをJW-CAD上で作成します。 このとき、邪魔にならない所に寸法を記入しておきます。 作成した原稿は、白地に黒の文字ですが、 ケースの塗装は黒色を予定していますので、 これをスクリーンショットでJPGに変換し、インターネット上のフリーソフトで白黒反転を行い、一度、windows標準付属の「ペイント」で読み込みます。 JW-CADの文字の種類が少なく、また色も限りがありますので、ペイント上で、文字のフォントの入れ替えや、必要に応じて、文字色や線の幅、色を修正します。 このJPGをエクセルに貼り付けます。 これを実際の寸法になるよう、印刷の縮小比を決めて、光沢フォト紙に印刷し、両面テープでケースの面に貼り付けます。 この縮小比を決めるとき、JW-CADで記入しておいた寸法が大いに役立ちます。

このようにして出来上がったアンテナアナライザーが左の写真です。 アンテナを接続するMコネクターの右側に飛び出ているビスは、アナライザーを接続する為に、取り外したトランシーバーへ接続されている同軸ケーブルのGND側とアナライザーを仮接続するGND端子です。 アナライザーが宙に浮いてしまうと、実際にトランシーバーから送信した時の浮遊容量の条件が異なってしまい、正しいSWRの計測が出来なくなりますので、これを防止する為、アナライザーのGNDを同軸ケーブルのGNDへ接続する為に使います。 CAA-500のように、アンテナ端子が2個ある場合、送信機に接続される同軸は、使用していないコネクターに仮接続しておけば良いのですが、このアナライザーのアンテナ端子は1個しか有りませんので、GNDだけは接続できるように端子を設けたものです。 実使用状態では、ここにミノムシクリップの付いたリード線を接続し、常にアナライザのGNDはトランシーバーのGNDと接続されているようにします。

実際にアンテナに接続して測定する場合の電源は電池で行い、決して外部DC電源を使わないようにします。アナライザーで調整したSWR最少周波数と送信機内臓のSWRメーターが示すSWR最少周波数が一致しない原因は、決まってこのトランシーバーのGNDと外部DC電源の性です。

間延びした縦長のケースはレタリングでごまかしました。 光沢フォトシートをパネル全面に貼ったことで、凸凹したアルミケースの、ぼろ隠しが出来ました。

LCD表面に保護シートが付いていますので、多少ボケていますが、ベランダや移動に持って行けるアナライザーが完成しました。

さっそく、ベランダに持ち込み、私のプリセットMTUの調整に使ってみました。 アナログメーターの応答が、やはり遅く、SWR最少にMTUを調整するとき、手持ちのCAA-500より慎重にやらないと、最少ポイントを通り過ぎてしまいます。 この辺は最初から判っていた事でしたが、気になります。 Microchipの有償版コンパイラーの説明によると、プロバージョンを使うと、少なくとも4倍以上の速さにオプチマイズできるとの事ですが、10万円以上もしますので、諦めました。

アンテナアナライザは屋外でつかいますので、直射日光の下に置かれる事が多々発生します。 この為、最初黒色でしたパネル面は現在赤色に変色してしまいました。

SWRカーブを取り、それをセーブ出来る機能は、例えば、このブログに結果を張り付ける為には便利です。 

Aa50_7mhz

左のSWRカーブはベランダで、MTUを再調整したとき、データをセーブして置いたものを、後から、再表示させデジカメで撮ったものです。

PCに保存するほどではないけど、データが残るというのはいいですね。

ところで、左のグラフはアンテナチューナー直下で測定したSWR特性で最少SWR1.05くらいですが、これを22m長の8D2Vを経由したトランシーバー出力部分で再度測定すると、100KHzくらいの幅でSWR1.0となってしまいます。 これは同軸ケーブルによるロスによるSWR差として出てくるものですが、得られたカーブは不自然です。いくら同軸で減衰があるにせよ、100KHzの範囲でSWR1.0はなかろうと、ソフトの中での四捨五入や切り捨て処理に問題がないかチェックしました。 色々検討した結果、ソフトではなく、ハードの問題である事が判りました。 

通常、OP-AMPには入力オフセットという誤差が有り、入力がゼロボルトでもこのオフセットの分だけ、出力がゼロになりません。 逆に、入力がオフセット電圧以下なら、出力は常にゼロとなります。 このICのバラツキによる入力オフセットの為、SWR用のDC電圧が少し出ているのに、出力がゼロになっていたものです。 これを補正する為、OP-AMPの入力にオフセット補正用のDC電圧を加え、これをキャンセルさせますが、今回使ったOP-AMPのオフセットの方向が+/-入力に対して逆になっていました。 

Offsetadj

今まで、マイナス入力端子にDCオフセットを印加していましたが、プラス入力端子にDCオフセットをかけて, 50Ωダミー抵抗の時、OP-AMPの出力をADが読んだ値を0010くらいにしておき、ソフトでADの出力が0010のとき、SWR1.0と定義する事により、自然なカーブが得られるようになりました。

また、目安にしかならないSWRのデジタル表示ですが、せっかく内部で小数点以下第2位まで計算していますので、これを表示させる事にしました。 実際のアンテナを接続した場合、SWR1.00の表示は出なくなりましたが、こちらの方が本物のような気がします。

LWの発振回路に使われているコンデンサC33は間違っていました。103Kではなく正しくは104Kでした。これを修正した結果、LWのカバー範囲は95KHzから530KHzとなりました。

最終的な各周波数の波形は以下のようになりました。

58mhz

7mhz

500khz

100khz

電池マークのバッテリーインジケーターは4.5Vでフル表示し、3Vまで電池の電圧に比例した残量が緑色で表示され、3Vから2.7Vまでは黄色で表示、2.7V以下では赤色になるよう設定しました。 この電源回路に使われている昇圧型のDC/DCは1.8Vでも動作しますが、さすがに2.7Vより下がると、電池の内部インピーダンスが急激に増大し、たちまち動作不能になります。 また、過去の記述には有りませんでしたが、CENTERキーを長押しするとオートパワーOFF機能を1分から20分まで1分刻みで設定できるようにしました。 もちろん、この機能をOFFする事もできます。

2016年8月11日

LWバンドをカバーする周波数帯域は、従来のアナライザーより便利に使える事が判りましたが、SWRグラフ表示のバンド幅が有限というのは、使い勝ってが悪い事が判りました。ここは、せめてセンター周波数の+/-30%くらいはカバーした方がいいようです。 これは、ソフトの変更のみで行えますので、スィープ時のバンド幅は 「1,2,4,6,10,20,40,60,100,200,400」のプリセット値としました。 

そして最大の欠点は、LCDで描画したアナログメーターである事が理解できました。 このアナログメーターはすでに、LCDの1ピクセルの分解能で動作していますので、これより細かい動きは出来ません。 アンテナアナライザーでSWRを計ったり、LCの共振周波数を計る場合、指針が最小値を表示する周波数を知りたい事が多々発生します。 このような時、1ピクセルの分解能では、最小値の周波数を知る事は出来ませんでした。 この感覚はメカニカル方式アナログメーターにはとても及びません。 どんなに精度の悪いメカニカルメーターでも、最小値や最大値を探すのは、簡単にできます。

Aa50_z_change

このアナライザーを製作するに当たり、SWRグラフィック表示とアナログメーター表示を兼用可能な液晶表示で、コメットやMFJのアナライザーより使いやすいアナライザーを目指してきました。 この手作り品は基板がユニバーサル基板なので、ケースサイズを小さくできませんでしたが、両面高密度基板を使えば、単3乾電池3本という電源を含めて、かなり小型のアナログ式アンテナアナライザーが出来ると考えました。 しかし、メカニカルメーターのフィーリングには勝てませんでした。  

今更、アナログメーターに戻す気はありませんので、現在は、SWRを小数点以下2桁まで、Z(インピーダンス)を小数点以下1桁まで表示した数値を見ながら、LCDによるアナログメーターの欠点をカバーしています。 直感的には判りませんが、そこそこの探索は可能です。 

LCD表示のアナログメーターは、Sメーターかタコメーターが一番合いそうです。 最近の車のスピードメーターやタコメーターはタイヤの回転数やエンジンの回転数をデジタルで検出して、そのデジタル値をベースにステッピングモーターを回して、指針を動かしているのだそうですが、これらは、今後インパネ内の表示量増大に伴い、LCDタイプが増加することでしょうね。 

 

2018年11月

マイコンのソースコードを公開しようとしましたが、どれが最終で、どのようにコンパイルしたかも忘れてしまいました。 以下のふたつのソースファイルは多分まともにコンパイルできないと思います。

AA50-LCD-SD.cをダウンロード

AA50SD_data.cをダウンロード

2022年5月

負荷オープン時の校正作業が行われなくなってしまいました。 原因を調査したところ、インピーダンス検出用のダイオードHSC285の逆方向抵抗が200Ωくらいしかなく、正常にDC電圧を得る事が出来ないのが原因でした。 このダイオードは劣化しやく、このアナライザーが完成してから、すでに6年以上経過していますので、しょうが無いという状態です。 補修用に手持ちしていた正常品に交換したら、インピーダンス表示は正常になりました。 バリキャップ電圧として14Vの電圧を一度リップルフィルターを通し、発振周波数がFM変調されるのを軽減しておりましたが、このリップルフィルターの劣化により、電圧降下が大きくなり、最大14Vくらいで有った、バリキャップ電圧が9Vくらいしか有りません。 その為、最高周波数が52MHzくらいしかなく、50MHz全帯域を測れない状態になっていました。 対策として、リップルフィルターを100Ωの抵抗に置き換えました。 結果、電圧は13.7Vくらいまで上昇し、最高周波数は64MHzくらいになりました。 リップルによるFM変調音は、リップルフィルターの時より大きいですが、我慢出来るレベルです。  また時々、AD変換データが間違う事がありました。 詳細を調べると、ADCのプログラム記述に間違いがありました。 今まで、どうしてまともに動いていたのが不思議です。 DATA処理マイコンのプログラムを修正しました。 

ダイソーの単3アルカリ電池3本では、電池の消耗が早く、トータルON時間が30分くらいになると、数分間くらいしかONしないのに、急激に電圧が下がり、インジケーターが黄色になります。 しばらく放置して再度ONすると、バッテリーインジケーターは元の緑に変わりますが、次に黄色になるまでのON時間が短くなって行きます。 そこで、この電池をリチウムポリマー電池(LiPo Batt)に変更する事にしました。 電池はアマゾンで3.7V900mAh品を999円で見つけましたので、これをゲット。 また、LiPo電池の充電ICは7~8年前に買ってあったMCP73832Tです。 

Liion_batt_2

Liion_chagar

Chargeindicator

 

左上が、単3乾電池をLiPo電池に変更して実装したところ。 真ん中は、米粒大のICを基板に実装したところ。(黄色の円の中)。 右端が充電中を表示するインジケーターです。 充電時の定電流は300mAに設定しました。 充電満了になると、LEDが消灯しますので、そこで、外部DC電源のプラグを抜く事にします。 LCD上のバッテリーインジケーターが黄色になるのが3V以下で、2.7Vで赤に変わりますので、再充電は黄色のマークが出たら行う事にします。 LiPo電池の取り扱い説明によると、推奨される使い方は、フル充電した後、終止電圧になるまで使い続け、終止電圧になったら、再度フル充電を行い、充電回数をなるべく多くしない事のようですので、充電しながらの使用は出来るだけ避けるようにする事にします。 この電池の終止電圧は、2.5Vですが、安全を見て3Vを切ったら再充電する事にしました。 (使用中でも充電できますが、その場合の充電電流は最大でも50mAしかありません)

このアナライザーにはPICKIT3を接続する為のコネクターが2個ついており、どちらがDATA用でどちらがLCD用か、毎回迷いますので、コネクタの位置にマーキングを入れました。

修正済みプログラム AA50SD_data_1100.cをダウンロード

修正済み配線図 AA50DATA220527.pdfをダウンロード

Aa50_pic_conector

ついでに変色したパネルも張り替えました。張り替え前と後を記録に残します。

Aa50old

Aa50new

INDEXに戻る

2015年10月18日 (日)

PICマイコンでSDカードのファイルを読み込む

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

マイクロチップのMLAの中にあるデモソフトは簡易データロガーともいえるもので、何らかの手段で定期的に入手したデータをデモファイルにAPPENDしながら書き込んでいくものです。 従い、MS-DOSのDIRコマンドに相当したファイル検索や、特定のファイル名をオープンして、中身を読みだすという動作は行いません。 ただし、これらの機能の、コマンドの使い方は例で示してあります。 

今回、SDカードにセーブしたCSVファイルを検索して、LCD上にファイル名を表示させる機能、及び、表示したファイル名を指定して、そのCSVファイルを読み込み、LCD上にSWRカーブを再表示させる事にトライしました。 FILEIOのHELPドキュメントを読んだだけでは理解できず、構造体の勉強を3週間くらいやって、やっと、思ったようにソフトが動くようになりました。

Aa50_find

Aa_50_40m

ソースコードを下記しますが、そのままコピペしても動作しません。 これをデモ用として提供されているソースコードの中に埋め込んでやると期待したような動作が得られます。

MS-DOSのDIRに相当する関数は「FILEIO_Find」という関数を使います。

searchnameは16bitの文字で "*.CSV" と初期設定し、FILEIO_Findの関数を実行させるとsearchRecordの中にファイル名がひとつだけストアされます。 これをset_dir_fname()の関数に送り、そこで2次元の文字列にストアします。この動作を20回繰り返します。 ファイルの数が20以下の場合、i=20で強制的にループを抜けます。

unsigned int  find_SD_card(void) {

     DEMO_STATE demoState = DEMO_STATE_NO_MEDIA;

   FILEIO_OBJECT file;

    FILEIO_SEARCH_RECORD searchRecord;

    init_SDcard();

    unsigned char i;

   uint16_t SD_ER = 0;

      while(SD_ER == 0) {

        switch (demoState) {

            case DEMO_STATE_NO_MEDIA:

                 if (FILEIO_MediaDetect(&gSdDrive, &sdCardMediaParameters) == true) {

                    demoState = DEMO_STATE_MEDIA_DETECTED;  

                    }

                 break;

            case DEMO_STATE_MEDIA_DETECTED:

                  SD_ER=(FILEIO_DriveMount(drive_A, &gSdDrive, &sdCardMediaParameters));

                if (SD_ER ==0){

                    demoState = DEMO_STATE_DRIVE_MOUNTED;

                     } else {

                    demoState = DEMO_STATE_NO_MEDIA;

                    }

                     break;

            case DEMO_STATE_DRIVE_MOUNTED:

                if (FILEIO_Find (searchname, FILEIO_ATTRIBUTE_MASK, &searchRecord, true) == FILEIO_RESULT_SUCCESS) {

                    i=0;

                    set_dir_fname(&searchRecord,i);

                    i++;

                    } //サーチの最初はこのようにtrueを指定して検索

                    while (i < 20) {

                        if (FILEIO_Find (searchname, FILEIO_ATTRIBUTE_MASK, &searchRecord, false) == FILEIO_RESULT_SUCCESS) {

                           set_dir_fname(&searchRecord,i);

                            i++;

                            } else {i=20;} //whileループから抜ける為

                        }  //2回目以降はfalseを指定して検索

・・・・・・

・・・・・・

このfind_SD_cardの関数は、ファイル名を検索して最大で20個表示したら一旦ドライブをアンマウントさせます。

.

.

ファイルの読み出しは「FILEIO_GetChar」という関数を使います。

void get_SDdata(unsigned int *sptr) { //テキストデータを1行(LFまで)読み込む
     uint8_t C=0;
     uint8_t i=0;
     while (C != 0x0A) {
        C=FILEIO_GetChar(sptr);
        if (C == 0x1A) {break;} //EOFでもループを抜ける
        SWR_SDdata[i]=C;
        i++;

     if (i>40) {break;} //1行の文字数が40を超えたら抜ける
        }
     SWR_SDdata[i-2]=0;
  }

セーブされたテキストデータは必ず「CR+LF」で1行完了としていますので、上の関数で、CR+LFが削除された文字列として、SWR_SDdata[]の中にストアされます。

正規のSWRカーブファイル以外の場合、暴走しないように、EOFを見つけたり、1行の文字数が40を超えたら、ループから抜けます。 

.

以下はASCIIからUTF-16への変換関数です。

void Uint8toUint16(uint8_t *fname8) { //ASCIIをUTF-16に変換します。
        unsigned char i ;
        for (i=0;i<13;i++) {
            fname16[i]=fname8[i];
        }
    }   

以下が特定の16bitファイル名「fname16[]」をオープンして読みだす処理になります。

unsigned int  open_SD_card(unsigned char *fptr) {
   DEMO_STATE demoState = DEMO_STATE_NO_MEDIA;
   FILEIO_OBJECT file;
   unsigned char i;
    uint16_t SD_ER = 0;
    Uint8toUint16(fptr);

・・・・・

・・・・・

 if (FILEIO_Open (&file, (uint16_t *)fname16, FILEIO_OPEN_READ) == FILEIO_RESULT_FAILURE) {
 
                    demoState = DEMO_STATE_FAILED;
 
                    SD_ER=2;
                    break;
                    }
                    SD_ER=50;
 
        get_SDdata(&file);
        set_FREQ_data(&SWR_SDdata,1);

読み込みは全部で225行に渡りくりかえされますが、それが終わるとファイルクローズします。 

 if (FILEIO_Close (&file) != FILEIO_RESULT_SUCCESS) { //ファイルクローズ                     demoState = DEMO_STATE_FAILED;

                  SD_ER=3;

                    return SD_ER;

                  }          

クローズが失敗したらメインルーチン側で強制的にドライブアンマウントを実行させます。

クローズが成功してもドライブをアンマウントします。

FILEIO_DriveUnmount ('A'); //ドライブアンマウント

SD_ER=20;

return SD_ER;

・・・・・・・

・・・・・・・

ファイルを削除する時は以下のコマンドとなります。

 if (FILEIO_Remove ((uint16_t *)fname16) != FILEIO_RESULT_SUCCESS) {
                        SD_ER=10;
                        }
                    break;

エディター上ではTABを使い、行の整列がきれいに出来ているのですが、このブログに貼り付けるとメチャクチャになって、大変読みにくくなってしまいました。

このデモプログラムのなかでは、かなり詳しいエラーメッセージが定義され、それが番号で返されますが、そのままでは、かえって混乱しますので、新たにSD_ERという変数で、勝手にエラー番号を定義し、ループからの抜けや、メインルーチン側でのエラー処理に使っています。

出来てしまえば、簡単な記述で完成するのですが、ここまでやるのに優に1か月かかりました。

SDカードからファイルを読み込むプログラム FILEIO_read_Faile.cをダウンロード

実際にアンテナアナライザーに組み込んだ状態はここで紹介しています。

 

この記事を基に2024年に再現を試みましたが、出来ませんでした。

再現可能な記事を2024年12月に公開しています。

INDEXに戻る

2015年10月17日 (土)

過去のデータを再表示

<カテゴリ:アンテナアナライザー>

周波数対SWRの変化特性をグラフにし、このデータをSDカードに保存し、PCでエクセルデータとして取り込む状態まで完了していましたが、せっかくSDカードにセーブできましたので、このデータを、再度アナライザーのLCD画面に表示する事にトライしました。

この機能を追加するのは、純然たるソフトウェアだけの世界となりますので、ハードの変更は一切なく、ただひたすらにC言語に苦しみながらPCと向き合う事になってしまいました。

 

Aa50_faile_select

Aa50_re_display

左上の画像がSDカード内のSWRカーブファイル名を表示させた状態で、画像ではSWR00044.CSVを選択している状態です。 この状態でワイドキーを押すと右上の画像のように、グラフデータをLCD上に表示します。 表示したデータは、前回セーブした14MHzのスカイドアアンテナの特性です。

Aa50_21m_mtu

左の画像は私の21MHz用アンテナを3つのMTUでそれぞれチューニングした時のSWR特性をグラフで表示させたものです。 SDカードにセーブして有りましたので、それを呼び出してLCD上に再表示させました。 この画像では、3本のSWRカーブが3色で描画されていますが、マイコンの仕様としては最大で7本のカーブを7色で描画できます。 また、読み込んだファイル名も表示させる事にしました。

ここまでの機能を入れ込んだ状態で、ROMエリアは91%、RAMエリアは85%となりました。まだ、バグや使い勝手の悪いところもありますので、それらの対策をして、ギリギリの容量かも知れません。

このアナライザーの場合、SDカードにセーブ出来るファイル数はSDカードの容量が上限を決めます。 しかし、検索出来るファイル数は、現在は20個までです。デバッグの進行状況を見ながら、RAMエリアに余裕があれば増やす事はできますが、それでもLCDの画面サイズの関係から最大50個くらいと思われます。 また、読み込み順序もFAT32のファイルシステムで記録された物理的なアドレス順になります。 通常は古いファイルから先に検索されますので、仮に50個以上のファイルをセーブしていても、新しいファイルは表示できなくなります。

Aa50_delete

このような条件から、SDカードのファイルをオープンしてLCDに表示した後、そのファイルを手動で削除する機能を追加しました。 グラフが表示された状態で左の画像のごとく、確認メッセージを出した上で、DOWNキーで削除できます。 この機能を追加した事により、削除する為にSDカードをいちいち抜いてPCに接続する必要も無くなります。

ファイル名が連番ですので、古い番号のファイルの中身が、どのアンテナのどのような条件でのSWRカーブであったかは、多分覚えていないでしょうから、必要なファイルはせっせとPCにコピーして置けば良く、その必要がないなら、古いファイルはせっせと削除すれば良い事になります。 RAM容量が限られているマイコンではやむを得ない処理でしょう。

10月31日追記

Aa50_max50

その後、2週間くらいデバッグを繰り返して、バグも収束してきましたので、表示可能なファイル名数を最大50まで増やす事にしました。 左の画像のごとく、LCD上でのディスプレーの都合でファイル名は連番の部分のみとしましたが、不便はないでしょう。  ファイル数が50を超えている場合、この画面上でなんらかの警告を出す事にしています。 常に50個以下にしておかないと、最新のファイルが検索できなくなります。  この状態で、ROMエリアは91%、RAMエリアは88%の使用となりました。

マイクロチップのMLAを使ったFILEIOアプリでファイル表示や、特定のファイルの読み込み方法は PICマイコンでSDカードのファイルを読み込む で紹介しています。

ここまでの基板の状況は以下のようになりました。 一番左の基板表側はスルーホールの部品だけが目立ちますが、真ん中のこの基板の裏側はチップ部品よりジャンパーワイヤーだけが目立ちます。 一応、高周波回路は最短で構成し、単純なDC電源やDC信号ラインはジャンパー線でまかなったので、発振回路としての動作は安定しております。 RF回路を横断しているいくつものジャンパ-線は、RF的にはすべてGNDレベルの線なので、写真では無造作に結線されているように見えますが、一応、元プロフェッショナルな作業は行っています。

Aa50_osc_f

Aa50_main_f

Aa50_mic_f

ソフトのバグも収束ぎみですので、これからケースに収納する為の検討をする事にします。

アンテナアナライザーの製作(ケース入れ) へ続く。

INDEXに戻る

2015年9月19日 (土)

SWRグラフをSDカードへセーブ

 

<カテゴリ:アンテナアナライザー>

PICマイコンでSDカードにテキストファイルを保存する事が出来るようになりましたので、この機能を使い、周波数対SWRのデータをCSV形式でSDカードに記録し、これをPCでエクセルファイルに取り込んだ後、自由にグラフデータをPC上に表示する事ができるようになります。  

SDカードとPICの通信はSPI1モジュールで行いますので、今までSPI1を使用していた、コントロールマイコンとの通信ラインをSPI2に引っ越しさせ、FAT32用モジュルールやドライバーなどを従来のアナライザー用ソースファイルと合成し、なんとかコンパイラーがエラーを出さなくなりました。 この状態で、128KあるROMエリアの約84%のが占有されました。 RAMは58%くらいの使用です。

Sd_ready

とりあえずコンパイル成功したプログラムは、アナライザーの機能とSDカードの機能は正常に動作しますが、両者の間でのやりとりはやっていません。 やっとSDカードの検出結果をLCDに表示する事だけ出来るようになりました。 ちなみにSDカードをソケットに差し込むとすぐにMEDIA READYになりますが、ライトプロテクトがONになっている場合、カードをロックするまで押し込んだ時点でNO MEDIAになります。 ちゃんとライトプロテクトは動作しますが、読み込みも出来ないという事ですから、ライトプロテクト機能は無効と考えるべきです。

カード有り無しの判定が出来るようになったので、アナライザーから引数を渡す方法でSDカードソフトと連結してみました。 

Sd_save1

しかし、そう簡単にはいきません。 コンパイルエラー続出で始まり、無限ループにはまったりで、何度も後退しながら、やっとアナライザーのキー操作で仮のテキストをセーブできるところまで出来ました。 下記の通りファイル名が連番でセーブされています。タイムスタンプは、リアルタイムではなく、PICKIT3でプログラムを書き込んだ時のPC側の時刻のようです。 

Sd_save0_2 

テキストファイルが連番でセーブ出来るようになりましたので、次は、いよいよ周波数対SWRデータのセーブにトライです。  しかし、これも私の非力の性で、コンパイルエラーの連続でした。 ここで、複数のソースファイルとヘッダーファイルの場合のコンパイラ動作をにわか勉強して、かろうじて、データのセーブが出来るようになりました。

セーブしたデータをエクセル上に展開し、これからグラフを作るのは手作業です。

まずは、7MHzの垂直ダイポールの例

Swr00040_2

Swr00040xls_2

 

左上がアナライザーのLCD上に表示されたSWRカーブ、右上はこのデータをSDカードに転送セーブし、PC上でそのデータをエクセルデータとして開き、そのデータから作成したSWRカーブです。 周波数は100Hzの位まで取得された値、SWRは実際値を100倍した値となっています。 Y軸(縦方向)の目盛間隔がLCDより拡大されていますので、急激に変化しているようですが、数値を見比べると同じである事がわかります。

次は、14MHzのCWバンドに合わせたスカイドアの特性です。

Swr00042_2

Swr00042xls_2

LCDのY軸目盛は良く見慣れたSWR計の目盛と同様にSWRが高くなると、目盛間隔が詰まっていきますが、エクセルのグラフは等間隔ですので、カーブの様子が異なります。 縦軸を対数目盛にすればLCD表示に近づくでしょう。 このへんはエクセル表現のワザの話になります。 SWR目盛も100で割った小数点値にし、周波数も10で割った小数点値にすれば見栄えも良くなるでしょうが、そこはPC上で処理する事に、このアナライザーはこのままです。

このアナライザーのSWRカーブの最大取り込み数は7本として作ってあります。従い、エクセルデータもSWR0からSWR6までの7本分のデータがセーブ出来るようにしました。

Swr00043

左の画像は、14MHzバンドでCWバンドにチューニングした青色のデータとSSBバンドにチューニングしたときの赤色のデータを重ねて表示したものですが、この状態でもエクセルデータとして取り込めるようにしてあります。

このデータを実際にエクセルで取り込み、グラフ加工したエクセルデータを添付しておきます。

SWR00044.xlsをダウンロード

ここまでの対応でLCDマイコンのROM使用量は88%、RAM使用量は81%になりました。 まだ、デバッグや操作性の改善も残っていますので、多少は増えると思われます。 XC16の無償版コンパイラはオプチマイズ機能が無いと聞いていますので、最悪有償版かROM容量を256Kまでアップする覚悟をしていましたが、その必要はなさそうです。

SWRカーブをPCに取り込むという目標は達成できました。 試に私のマルチバンドアンテナのSWRデータを取り、エクセルデータにしてセーブし、グラフをPC上に表示してみましたが、 苦労してプログラム開発したのに、私の場合、その利用価値は有りませんでした。 アンテナの解析などを行いたい場合、取り込んだデータが役立つかもしれませんが、アンテナを調整して、最適使用状態に設定するのが目的なら、このような機能は不要みたいです。 ただし、一度セーブした過去のデータを呼び出して、アナライザーのLCD上に再表示させる事ができれば、それはそれで、役立つかも知れません。 機会がありましたらその機能追加にトライしたいと思います。

ところで、時々マイコンが暴走します。 以前の検討でPICKIT3に接続するMCLR端子に、パスコンが必要となっていましたので、0.01μFを追加しました。 その後、異常が発生しなくなりました。

SDカード対応の配線図をダウンロード

過去のデータを再表示 へ続く

INDEXに戻る

2015年9月17日 (木)

PICマイコンからSDカードへのファイル書き込み

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

LCD表示のアンテナアナライザーの自作の中で、周波数対SWRのグラフを描かせるところまで成功しました。 そこで、このグラフをPCに取り込めないか、試行錯誤しておりました。 そして、やっと、PICマイコンでSDカードにファイルを書き込む事が出来るようになりました。 まだ、数行のテキストデータしかないファイルを書き込んだだけで、グラフデータは未完成ですが、ここまで、出来ると、後は時間の問題となります。

今回は、PICマイコンからFAT32のファイルシステムでフォーマットされたSDカードにテキストファイルを書き込む方法を紹介します。

ハードの構成です。 アンテナアナライザーのハードに秋月で売っているSDカードソケットを接続した、単純な回路となっております。

Pic_sd_schema

 検討するソフトもこのSDカードの部分のみで、LCD表示は実装していません。

秋月から「SDカードスロットDIP化モジュール」という名前のソケットを買ってきて、これを配線図のごとく、マイコンの空きピンに接続します。PIC24FJ128GB106はi/o設定が自由にできますので、このような場合、非常に便利です。

Sd_card0そして、左の画像のごとく実装しました。

この状態でSDカードをドライブするソフトはMicrochipが無償で提供しているfileioというアプリケーションを使います。

このアプリの説明を読んでいると、私のようにC言語のポインターもまともに扱えない者でもなんとかPCで読めるファイルを書き込めるかも知れないと思うようになりました。

しかし、これが間違いの始まりで、検討を開始してからすでに1か月。 やっとのことで、FAT32のファイルシステム上に自作のファイルを書き込む事に成功しました。

Pic_fat32file0 上はエクスプロラーでSDカード内のファイルを表示させたものです。

Sample long file name.txtはデモプログラムが見本として作成したファイルです。

SWR12345.txtは私が作ったファイルです。 いずれも2行、20文字くらいのファイルですが、ファイルの中身は、これから好きに変更できます。

ここまで出来るまでの工程を以下説明します。

MicrochipのサイトからMLAと言われるアプリケーションファイルをダウンロードし、デフォルトの設定のままインストールします。 私がインストールしたファイル名は以下の名前でした。

mla_v2015_08_10_windows_installer.exe

デフォルトでインストールした後、MPLAB Xから以下のプロジェクトを探し

C:\microchip\mla\v2015_08_10\apps\fileio\sd_card_demo_lfn\firmware\MPLABX

fileio_sd_card_demo_lfn を読み込むと、同名のプロジェクトがオープンします。

このプロジェクトができましたら、マイコンの品種設定とi/oの設定を書き換える事により簡単にデモプログラムが動作します。・・・・とはなりませんでした。

Mplabx_sd

上のダイアログはMPLABXにてプロジュクトをオープンした時の画面ですが、上の方にICの品種を指定するランがありますので、実際に使用しているICファミリーを選択します。 

私の場合、実際に使用しているICはPIC24FJ128GB106ですので、ファミリー名はpic24fj256gb110となります。 使用可能なICのファミリー名が左側の「exp16」フォルダーの下に表示されていますので、確認できます。ここにリストされた以外のICで、このデモソフトが動作するかは不明です。

リンクされたファイルには同じ名前で中身の違うものがいくつかあります。main.c やsystem.c が該当しますので、他のホルダーでプロジェクトを構築する場合は、一度デモプロジェクトをオープンし、そのとき表示されるファイルをコピーして他のホルダー移すことで間違いを防ぐ事ができます。 事実、最初、リンクを頼りにファイルをコピーしてきて、独自のホルダーに集めてbuildをかけたところ、エラー続出で困り果てた事がありました。 この為、main.c とsystem.c はそれぞれ、SD_main.c とSD_system.c いう名前にし、のちのち間違わないようにした上で、独自のフォルダーへ移動させ、オリジナルのファイルは元の場所にそのまま残しました。 

まず、lfn(ロングファイル名)を選んだのに、リンクされたヘッダーファイルはlfnなしの普通のfileio.h。 これをハンドでfileio_lfn.hに入れ換えました。 ソースファイルもlfnではなかったような記憶ですが確かでありません。もし、違ってましたらソースファイルもfileio_lfn.c に入れ換えて下さい。

また、system.c の中の一部を以下のように書き換えました。

#pragma config FNOSC = FRCPLL//OSCを32MHzのCR発振に変更

#pragma config FWDTEN=OFF

ただし、このままでは16MHzにしかなりませんでしたので、main()の中で、以下を

追加し32MHzにしました。

OSCCON = 0b0001000110100001; //Fosc FRCPLL 32MHz
 CLKDIV = 0x0000;

また、青色の設定は後日、追加したものです。 このPICマイコンはデフォルトでウォッチドッグタイマーがONになっており、約2分20秒でリセットがかかる原因になっていました。 これが時々暴走する原因と解るまで3週間くらいかかりました。

また、i/oの設定も変更しました。

void USER_SdSpiConfigurePins_1 (void) {     //Initialize the SPI    

RPINR20bits.SDI1R = 25;    //修正

RPOR10bits.RP20R = 7;    //修正

RPOR11bits.RP22R = 8;    //修正

    //enable a pull-up for the card detect, just in case the SD-Card isn't attached    

//  then lets have a pull-up to make sure we don't think it is there.    

//CNPU5bits.CN68PUE = 1;//プルアップはハードで行っていますので、この行は不要です。   

// Deassert the chip select pin    

LATDbits.LATD2 = 1;    //CS端子1に設定

// Configure CS pin as an output    

TRISDbits.TRISD2 = 0;    //CS端子出力に設定

// Configure CD pin as an input    

TRISDbits.TRISD1 = 1;    //CD端子入力に設定

// Configure WP pin as an input   

// TRISDbits.TRISD1 = 1; //この行はコメントアウト

}

・・・・・

・・・・

inline void USER_SdSpiSetCs_1(uint8_t a) {

    LATDbits.LATD2 = a;   //CS端子修正

}

inline bool USER_SdSpiGetCd_1(void) {

    return (!PORTDbits.RD1) ? true : false;//CD端子修正

}

inline bool USER_SdSpiGetWp_1(void) {

    //return (PORTFbits.RF1) ? true : false;//コメントアウトして0を返す

    return 0;

}

ここまで修正してBuildをかけてエラーが出なかったら、成功です。

しかし、PCでFAT32にフォーマットしたSDカードを用意し、マイコンにプログラムを書き込んでもファイルは出来ません。

今度はmain.c の定義の部分を変更します。

typedef enum
{
    DEMO_STATE_MEDIA_DETECTED = 0,
    DEMO_STATE_NO_MEDIA,
    DEMO_STATE_DRIVE_MOUNTED,
    DEMO_STATE_DONE,
    DEMO_STATE_FAILED
} DEMO_STATE;

DEMO_STATE_NO_MEDIA=0という記述が最初の行にありますので、これを上記のごとく2行目に移し、"=0"の文字を削除します。 DEMO_STATE_MEDIA_DETECTEDを一番上にして、"=0"を追記しておきます。これは、Maicrochipのデモ機はCDが0の時ノーメディアなのに対して、秋月のソケットはCDが1のときノーメディアになっている為です。

以上の手直しでデモ用のファイルがSDカード内に出来るようになりました。

次に自作のファイル名でファイル作成にトライです。 ところが、出来たファイル名は文字化けして読めない上、ファイルの中身も空です。 ファイル名は「SWR00001.csv」で始まる連番とする予定ですので、この数値の部分はunsigned int で1から始まる整数です。これをファイルに書き込めるようにASCII変換してファイル名としたのですが、うまく行きません。

色々調べて、判った事は、FAT32のファイル名はASCIIコードではないということでした。ファイル名はutf-16という16bitの文字でエンコードされていました。 XC16の中にあるストリング系の関数は使えませんので、自分でASCII to utf-16の変換ルーチンを作る必要がありました。 

幸い、ASCIIコードの文字だけに限れば、8bitのASCIIコードの上部に0x00のコードを加えて、16bitにするだけなので、変換ルーチンは私でも作れましたが、日本語のファイル名は使えません。

このようにして、「SWR12345」のようなファイル名を付けたテキストファイルを作る事が出来るようになりました。このファイル名の数字の部分を連番のファイル名にし、拡張子をcsvにするとOKとなります。

SDカードは、128Mと8Gの物をテストしましたが、いずれもFAT32でフォーマットしてあれば問題なく使う事ができました。 exFATでフォーマットしたSDカードの場合、エラーがでます。

この小さなデモファイルを作る為に必要なROM容量は約44.9Kバイトです。これから実験しようと考えているなら、ROM容量64Kでは心細く、最低でも128K品が必要でしょう。

ところで、出来たファイルにちゃんとタイムスタンプが付いています。どうやって時間を計っているのでしょうかね。マイコンボードは使わないとき電源OFFなのですが。

このSDカードドライブ機能をアンテナアナライザーに実装する事にします。

SWRグラフをSDカードへセーブ へ続く。

 

MicrochipのFILEIOライブラリーを使い、SDカードに記録されたBMPファイルをLCD上に表示するプログラム例をここで公開しました。

 

INDEXに戻る

2015年8月16日 (日)

細々と改善は続く

カテゴリ:オートアンテナチューナー(ATU)の製作

8月の初めに誘導雷を受けて、自作のATUが動かなくなりました。 チューニングスタートをさせても、すぐにエラーで止まってしまいます。 一応、誘導雷くらいなら、マイコン本体のi/oが壊れる前に、その周辺のパーツが壊れるという設計をしていました。 調べてみると、周波数カウンターが動作せず、RF信号はOKなのに、周波数が範囲外となり、エラーを出しているものでした。 故障個所はカウンター回路の入力にあるチップコンデンサの電極が高電圧の為割れており、コンデンサの役目をしていないのが原因です。 この50V耐圧のチップコンデンサを交換したら直ってしまいました。

Atuk1_2

せっかく、ベランダのBOXから取り外したので、かねてより温めておいた改善事項を盛り込む事にしました。

ひとつは、バリコンの可変範囲が広すぎますので、これを若干狭くする為、以前手配しておいた6000V 390PFというコンデンサをバリコンに直列に挿入する変更です。 3.5MHzでのコイルインダクターを増やすのが面倒なので、入力側のみ追加し、様子を見る事にします。

二つ目は、マイコンのソフトです。 SWR最少位置を探す途中で、次の動作に行くために、数10ミリ秒から数100ミリ秒の待ち時間がありました。 また、プリセット位置にバリコンを移動させるには数秒かかる事もありましたが、これらの待ち時間中は、単純に動作が終わるのを待っているだけで、この待ち時間中にSWRが1.5以下になる事があっても、無視されていました。 今回、この全ての待ち時間中でもSWRを常にチェックし、SWRが3以下ならただちにSWR収束動作へ移るよう変更する事にしました。

ここで、問題が発生です。

LCD表示のアンテナアナライザーを開発する為、PICの開発環境をMPLAB X IDEに変更しましたが、ATUの開発環境は旧MPLABとHi-TECH Cでしたので、この旧MPLABを呼び出しPICKIT3を経由して、プログラムの書き換える事にしました。 ところが、IDが違うとエラーがでます。 困りはてて、色々試しましたが、うまくいきません。  さんざん悩んだ末、MPLAB X IDEでプロジェクトを作り直し、なおかつ、HI-TECH Cで書かれていたソースファイルをXC8用に書き換えると、ちゃんと16F1939を認識して、プログラムの書き換えが出来ました。

さらにプルダウンメニューなどを調べていると、MPLAB XでもHI-TECH Cコンパイラも使えるようです。 結局判った事は、MPLAB Xをインストールした後は旧MPLABは使えないという事でした。

やっと、プログラムの改善ができましたので、21MHzだけですが、オートチューニングを試す事にしました。 以前はバリコンがいったりきたりして、なかなかSWR収束モードにならず、その内、VC maxの位置に収まってしまいSWRが3以下になりませんでした。 やむなく、ハンドでSWRが1.5以下になるようにバリコン角度やコイルのタップ番号を選択した後、収束動作をさせていました。  ところが、今回は1発でSWR1.4くらいまで収束し、再度チューニングさせるとSWR1.05まで収束します。

後日、3.5から28まで全バンド、チューニング出来る事を確認しました。 ただし、28MHzのみですが、SWR1.4以下になるまで、かなり時間がかかるようになりました。 このバンドでチューニング動作を見ていると、1回で送るVCの角度が小さすぎるようです。 ソフトの変更で改善出来そうですが、すでにコンテナBOXに収めてしまいましたので、 次回のチャンスの時、変更する事にします。 この時間のかかる問題は最初のチューニング動作のみで、一度プリセットされてしまうと、次回からは、短時間で整合状態になりますので、実用上の不都合は有りません。

2016年11月3日

LDGのATUのマイコンを改造する為に、このATUのソースコードを調べていましたら、ソフトにバグがある事が判りました。 バグの内容は、ある条件の基ではモーターが反転しないというものです。 これが為に、なかなか整合しないバンドが発生しているようです。 このバグ対策を行った結果、全バンドがかなり早く収束するようになりました。ただし、24MHz以上のバンドでなかなか収束しないのは変わりません。そこで、前回追加しました、バリコンに直列の390PFを廃止しました。

バグ対策を行った後、外付けのSWR計ではSWR1.1以下になるのに、TUNE OKにならない場面が増えてきました。 この原因を調べてみると、モーターにブレーキをかけた後、まだ、バリコンが動いている最中に、SWRをチェックしているというバグが見つかりました。 ここは、50msecのディレー時間を設けて対策しました。 さらに、SWR3以下の時のモーター駆動時間をSWR3以上のときの1/2にし、さらにSWR1.5以下の場合さらに1/2にしていたのですが、SWR1.5から3の期間のモーターON時間が長すぎて、SWRディップポイントを通り過ぎてしまうのが原因でした。 そこで、SWRによりモーターON時間をさらに細分化し、以下のように設定しました。

SWR10以上     200msec

SWR10-5       100msec

SWR5-3        67msec

SWR3-1.5       40msec

SWR1.5以下      33msec

これで、ディップ点を飛び越える確率が大幅に減少した上、収束時間も短くなりました。

最新回路図 ATU-VC11.pdfをダウンロード

バリコン式ではなく、コイルとコンデンサをリレーで切り替えるタイプのATUの例はこちらでPICのソースを含めて公開しています。

2018年1月

プリセットMTUも継時変化が激しく、3.5MHz帯はMTUの調整範囲を超えてしまい、最近はこのATUだけで運用しています。 ただし、他のバンドではATUは使いません。 いくらチューニングを早くしてもプリセットMTUにはかないません。

2024年6月

新マルチバンドアンテナを構築する為に、2023年1月このATUを含めて撤去し、LDGのKT-100をベースとしたリレー式のATUを自作しました。 そして、2023年4月末より運用を始めたのですが、KT-100の中にあるリレーのひとつが時々接触不良を起こしており、ATUをプリセットしても、SWRが許容値にならない事がしばしば発生し、電源ON/OFFの繰り返しでなんとか接触させ使ってきましたが、2024年の6月になり、この接触不良が起こるリレーの数が拡大し、7MHzも18MHzも使用できなくなっていました。 そこで、一旦廃棄処分を決めたバリコン式のATUを再度使用できないか検討を始めました。 

  

INDEXに戻る

2015年8月14日 (金)

PIC24FJ128GB106 データメモリー不足

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

TFT LCDにグラフィックや文字を表示させていますが、メモリー容量を64Kから128Kに替えた為、新たにフォントを追加する事にしました。 フォント作成アプリで大文字、小文字、数字、記号などを作り終え、これをincludeファイルにして、コンパイルすると、エラーになります。  出てくるコメントはリンカーエラーとの事で、メモリーが不足しているような内容です。

これらのエラーコメントを頼りにインターネット内で検索すると、Microchip(USA)のFAQページにメモリーを拡張しなければデータサイズは32Kまでと言う説明が見つかりました。 ただし、どうすれば、32K以上のデータメモリーを使えるのかは、やりとりが英文である事もあって、良くわかりません。

そこで、日本語の情報を探すと、データメモリーが32Kまでで制限されている事。 これを32K以上に拡張する為には、レジスターの設定やアドレッシングなど、変更する必要は判りましたが、肝心なXC16による記述方法が良く判りません。

結局、インターネットから探しだした、以下の記述でコンパイラーがエラーを出さなくなり、ちゃんと文字の表示が可能になりました。

コンパイルエラーになった記述例

const unsigned char Font7_space[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };//ASCII 32
const unsigned char Font7_sharp[] = { 0xb, 0xa, 0xa, 0x3f, 0xa, 0x1a, 0x1a, 0x3f, 0x16, 0x16 };// ASCII 35

・・・・・・

・・・・・・

const unsigned char *Font7_table[] = {
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //ASCII 0-15

・・・・・

・・・・・

コンパイルエラーが無くなった記述例

__eds__ unsigned char Font7_space[] __attribute__((eds)) = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };//ASCII 32
__eds__ unsigned char Font7_sharp[] __attribute__((eds)) = { 0xb, 0xa, 0xa, 0x3f, 0xa, 0x1a, 0x1a, 0x3f, 0x16, 0x16 };// ASCII 35

・・・・・・

・・・・・・

__eds__ unsigned char *Font7_table[] __attribute__((eds)) = {
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //ASCII 0-15

・・・・・

・・・・・

Aafont7

左の[SWR ANALYZER]の文字が今回作成した10x6のフォントです。

文字を書き込むとき、フォントアドレスをポインターで指定しますが、このポインターの型宣言も下記のようにする必要がありました。

__eds__ unsigned char *fontptr;

INDEXに戻る

2015年8月 8日 (土)

アンテナアナライザーの製作(全機能組み込み)

<カテゴリ:アンテナアナライザー>

LCDドライバーのマイコンのROM容量が64Kをオーバーしそうになったので、ROM容量が128K品であるPIC24FJ128GB106に変更し、製作を継続してきましたが、正規の基板を使っていない事もあり、配線引き回しが多く、ノイズによる誤動作で苦労しました。 せめて両面高密度実装基板なら、こんな問題は起こらないのですが、そこは手作りの基板ゆえ、苦労が絶えません。 とりあえず、目標としたアンテナアナライザーの全機能を組み込む事ができました。 これから、実際に使ってみると、問題点も出るでしょうが、 アンテナアナライザーの製作の最終章です。

Aa50normal

Aa50cal

左上がノーマル状態、右上が校正モード時のLCD画面となります。

校正が完了した各ダミー抵抗によるADの出力値は赤色で表示されています。

校正は3.5MHzバンド付近のみで行い、他の周波数では行いません。 これは、センサー部分のブリッジからダミー抵抗まで約50mmあり、これが影響して周波数が高くなるに従い、検出されるRやXはもちろん、Zも変化するためです。

Aa50100dummy

ちなみに、100Ωのダミー抵抗(純抵抗)を接続し、Mコネクターの特性インピーダンスを仮に30Ωと置いて、周波数を可変した時の計算値は左の表のようになり、実際の値も、近い値を示します。 例えば、50MHzで100Ωのダミー抵抗による校正をするという事は、50MHzでZ=100にすることになり、実際値とは異なる数値になるからです。 従い、このアナライザーでは、3.5MHzにてZ=100と定義し、RとXはその時のSWR=2.0との関係より計算させるという方法を取っています。 そして、広帯域発振器の出力レベルを比較し、周波数により変化が有ればこれを補正する事にしました。

Aa5017m

Aa50fc_2

左上が私の18MHz用ループアンテナのSWR特性。 右上が今回追加した周波数カウンターモードの表示例です。

周波数カウンターは、WWVやWWVHで校正された基準周波数を入力して、内臓の周波数カウンターのゲート時間を正確に20m秒に調整する必要があります。 その時の外部基準信号をアンテナを接続するMコネクターから加える事にしましたが、この機能をそのまま、周波数カウンターとして使えるようにしました。 0dBmの信号で最高周波数110MHzくらいまでは100Hz単位で計測できます。 しかし、よくよく眺めると、SWR,ZやR,Xの表示がバラバラです。バラバラになるのは当然なのですが、見てくれは良く有りません。次回、変更のチャンスが有ったら、これらの表示が無効になるような対応を考えたいと思います。

一応、当初の目標としていた機能はすべて組み込み完了しましたが、ひとつだけ気になる問題があります。 18MHzのアンテナのSWR特性カーブの中の、SWR1.1付近で不自然にカーブがずれています。 この原因を詳しく調べると、この不自然な変化周波数を境にして右側はインピーダンスが50Ωより高くなっており、左側は50Ωより低くなっています。 SWRを換算するとき、50Ω以上の時と、50Ω以下の場合のSWRの換算方法が異なる為、この境目でSWRが一致しないという問題でした。 SWRが小さい状態でインピーダンスが50Ωを横切った場合、あまり目立ちませんが、SWRが大きい状態でインピーダンスが50Ωを横切ると、完全に段差が生じます。

このインピーダンスにより、換算値に誤差が出る原因は、SWRメーターとアンテナのリアクタンスの関係 の記事で触れたように、リアクタンスが含まれた時の計測誤差が影響しておりました。

Aa50swr0

Aa50swr1

Aa50swr2

上の画像は28MHzのCW運用バンドに合わせたループアンテナのSWR特性です。 

 左の画像が、インピーダンス50Ωを境に、高い時と、低いときでSWR換算方法を使い分けたものです。 50Ωを横切る周波数が2か所ある為、2か所で段差が生じています。

真ん中の画像は、換算方式を通常のSWR計と同じ方法にしたものです。段差が無くなった代わりに、中心周波数より離れた周波数で、SWRが低く表示されています。

右側の画像は、インピーダンスが全て50Ω以下と想定して、換算させたSWR特性です。

どの、画像も、SWRが1.5を超えたら、それぞれ誤差が大きくなり、特にSWR2以上の場合、いずれも、正確なSWRは表示していません。 アンテナ調整を行う時、悪いSWRが良く出る率が小さい方がましですので、このアナライザーは一番右の特性になる方式でいきたいのですが、SWR2.0の校正を100Ωでやっている関係で、一番右の換算方法では100Ω時のSWRが校正されません。 25Ωの抵抗で校正すれば、OKなのですが、世の中のアンテナアナライザーのほとんどが100Ωで校正されていますので、25Ωで校正した場合、比較したとき誤差が大きくなりそうです。 従い、このアナライザーも一般のアンテナアナライザーやSWR計と同じ校正方法となる真ん中の方式でいく事にします。

また、この製作の発端となったLCD表示のアナログメーターの動きも、大きな違和感なしで共振周波数を探る事が出来ます。  指針の動く速さを改善する手段として新たに、指針移動角度に応じて書き換える範囲を可変する事にしました。 指針が移動するとき、旧指針を消して、新しい位置に指針を書き込む必要がありますが、これを1回の書き換えで実現する為に、新指針のエリアより上下左右の広い範囲に目盛の再書き込みを行い、この操作で旧指針を消していました。 しかし、指針が2度の角度で移動するとき、左右で9ピクセル分の目盛データを上書きする必要がありました。  そこで、指針の移動角度小さいときは、それなりにカバーする範囲を小さくし、最少角の0.25度の時は、左右で3ピクセル分のみカバーさせる事にしました。 さらに、このカバーエリアの拡大は、指針が右へ動く時は、左側だけ、左に動く時は右側のみとして、書き換えるエリアの面積を常に必要最小限とする事により、 クラニシのアンテナアナライザーのメカニカルメーターと同等の速度まで改善する事ができました。

指針が0.25度動いたときの最大移動ピクセルは約0.7です。 0.7ピクセルは実在しませんので、実際は1ピクセル移動します。 従い、進行方向はゼロピクセル、後方は1ピクセルだけ再描画すれば旧指針は消えるのですが、実際は、ADの変換値がチラチラとばらつきますので、そのバラツキをカバーする為に、進行方向は1ピクセル、後方はさらに1ピクセルの2ピクセル分だけ再描画が必要です。さらに、0.5度間隔から0.25度間隔に変更した時点では、0.5度分のピクセルが残っていますので、これを吸収する為、さらに後方に1ピクセル分の再描画エリアを確保する必要がありました。  このアルゴリズムでプログラムを組んで様子を見ていますが、時々旧指針が消えずに残る時があります。 旧指針の範囲を指針が移動するまで残ります。 ただし、この異常現象は、バグ対策を行うほどに頻度が小さくなっていくようです。

各ADの出力値は温度や周波数でわずかに変化します。このわずかな変化を検知して、出力されたADデータ値を補正します。 この補正プログラムも組み込みましたが、過酷な温度試験は実施していません。 たちまちは、気温差が10度くらいで100Ωの指示誤差が+/-1Ω程度になるように、補正係数を調整しました。

今後、実用テストが出来るようにケースに収納した上で、デバッグを継続する事にします。

ROM容量が64Kをオーバーするかも知れないと、マイコンを128K品に交換しましたので、少しでも視認性を上げるべく、フォントを新作して、組み込む事にしました。 ところが、データエリアが32Kを超えたとたん、コンパイラーがエラーを吐きます。 なんとか対策できましたが、完成度はなかなか上がりません。

最新回路図をダウンロード

完成度はあがりませんが、せっかく実現した周波数対SWRのカーブをPCに転送してPCの画面上にグラフを描かせる事にトライする事にしました。 たちまちは予備検討です。

この記事でアンテナアナライザ製作を終了する予定でしたが、色々と問題点や改善テーマが出てきて、終了できませんでした。 しばらくは製作記事が継続します。

SWRグラフをSDカードへセーブ へ続く。

アンテナアナライザーの製作を最初のページから参照したい場合ここからどうぞ。

INDEXに戻る

2015年8月 3日 (月)

PIC24FJシリーズ SPI 誤動作

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

アンテナアナライザーのLCDドライブ用に使用していたPIC24FJ64GA004のROMエリアがほぼフルになりましたので、128Kに換える事にしました。 選んだマイコンは、将来USB機能やSDカードを組み込むかも知れないとの考えから、PIC24FJ128GB106という品番のICにしました。 

Aa59pic24fj128gb106

左の画像が、128Kの64pin TQPF品に入れ替えた実装基板です。 変換基板の大きさが、44pinのときより小さくなっている関係で、以外とすっきり配線できました。

回路図的には、44pinの時と同じ構成で、一部i/oの割り当てを変更しただけで、さっそく動作確認です。 ところが、LCDの表示は問題なく表示されますが、コントロールマイコンとの通信がうまくいきません。 周波数表示はでたらめで時々暴走します。 UART通信のプログラムが異常なのかと、色々試しましたがうまくいきません。 じたばたしている内に、通信もうまくいかないのに、さらに、26バイトの伝送に15m秒くらいかかっている事が判り、LCDの表示速度も遅くなっている事に気付きました。 ボーレート38.4Kでは不足みたいです。 56K以上にアップする案もありましたが、 キー入力をADに変更して、ラッチアップの対策もできましたので、残りのUP,DOWNのキーもADに変更する事によりi/oポートが2本余ります。 この際、通信方式もi/o 1本のUARTからi/o 3本のSPIへ変更する事にしました。

しかし、これが、またまた、訳の判らない誤動作に悩まされる事になってしまいました。

時々、伝送に成功しますが、一度リセットをかけると、伝送データがでたらめになります。 約2週間悩んだ末、判った結論は、またまた、伝送路のリンギングによるマイコンのラッチアップでした。 ただし、ラッチアップの影響が小さい為、時々まともに動作するのは、プログラムの性ではないかと、ああでもない、こうでもないとやっていたのがいけなかったようです。 ふと、ハードが原因ではないかと、SPIのクロックやデータの波形をチェックしてみました。

Aa59spi0

Aa59spi1

上の画像は左が対策前の、クロック(下)とデータ(上)です。 右の画像は対策後の波形です。 対策前は、クロックにも、データにもリンギングのオーバーシュートやアンダーシュートが発生し、いずれも時々0.5Vを超えています。 これが伝送データがでたらめになる原因でした。 対策内容は、各ラインに1KΩの直列抵抗を挿入し、リンギングの発生をおさえますが、抵抗だけでは不十分でしたので、GNDとの間に68Pのコンデンサも追加しました。 波形がきれいになって暴走の確率はかなり減少しました。 

しかし、時々、電源ON直後に暴走します。 ただ、基板のGNDラインを指でつかむとか、オシロのGND端子へ接続すると完璧に直ります。 このような症状の原因はノイズです。 ふたつのマイコンのうち、どちらで暴走しているか確認したところ、コントロール側の24FV32KA302が暴走しています。 さらに、このマイコンの入力関係をひとつづつ殺して確かめても暴走するときは暴走します。 最後にたどりついたところはMCLR端子でした。 この部分についてデータシートを再確認したところ、推奨回路はMCLR端子にシリーズに100から470Ωを入れろと書かれていますが、8bit時の延長で抵抗は入れてありませんでした。 そこで、470Ωを追加し、10回くらいのPOWER ON/OFFでは暴走が起こらない事を確認できました。 しかし、頻度は少ないですが、たまに誤動作します。 このマイコンのデータシートには、さらに0.1μFでGNDへ落とせと書いてあります。  さっそく0.1μFのコンデンサを追加したところ暴走が起こらなくなりました。 しかし、PICKIT3の説明書では、MCLRラインにコンデンサを接続するなと書いてあります。 試にこのラインに0.1μFを接続したままで、フラッシュメモリーの書き換えを行ってみましたが、問題なく書き換えが出来ました。 もし、書き換えがうまくいかない時は、コンデンサを外し、アナライザーが完成したら、コンデンサを追加する事にして、コンデンサは追加したままにしています。

LCDドライブ用の24FJ128GB106のMCLRラインにはまだシリーズ抵抗は入っていませんので、抵抗だけは追加する事にしました。

対策済回路図をダウンロード

Aa59_spi2

このSPI通信は、PIC24FV32KA302をマスターとして、PIC24FJ128GB106をスレーブとした一方通行のシリアル通信です。 クロックは約156KHzとし、マスター側はワード(16bit)伝送で割込みなし、全17ワードを連続送信し、その間、CEとしてLの信号を送ります。 スレーブ側は、CE信号がLになったらこれを割込みで捉え、受信バッファのインデックスを0にした後、1ワード受信する度に割込みを発生させ、17ワードのデータをバッファにストアさせます。 CE信号を送ったり、CEを受けてインデックスを0にする動作以外、すべて、データシートにかかれた説明通りの設定です。 

上の画像は、下のパルスがSPIのクロック(SCK)で、上のパルスが受信割込みが発生したときのダミー信号です。 1ワード受信する度に割込みが発生し、先頭ワードのインデックスを0番として順次17ワードを受信バッファに格納していきます。

送信側のPIC24FV32KA302のmain内の初期設定と送信ファンクションは以下です。

main () {

・・・・・・・・・

SPI1CON1 = 0b0000011000111100;//マスターモード クロック1/64
SPI1CON2 = 0b0000000000000000;
SPI1STATbits.SPIROV = 0;
SPI1STATbits.SPIEN = 1;//SPI1有効化

・・・・・・・・・・・・・

送信処理

void sendDATA() {
    unsigned char i;
    SPIFlg = 0;//CE信号をL
     __delay_us(20);
    for (i=0;i <17;i++) {
        while(SPI1STATbits.SPITBF);
        SPI1BUF = TXData[i];
        }
     SPIFlg = 1;//CEをH
}

受信側PIC24FJ128GB106の初期設定と受信割込みルーチン

main() {

・・・・・・・・・・・・・・・

RPINR0bits.INT1R = 21;//INT1をRP21に割り当て(RG6)
 RPINR20bits.SCK1R = 26;//SCK1INをRP26に割り当て(RG7)
 RPINR20bits.SDI1R = 19;//SS1INをRP19に割り当て(RG8)
 SPI1BUF = 0x0;//SPIバッファークリアー
 IFS0bits.SPI1IF = 0;//SPI割込みフラグクリアー
 IEC0bits.SPI1IE = 1;//SPI割込み有効
 IPC2bits.SPI1IP = 3;//SPI割込み優先レベル3
 SPI1CON1 = 0b000011000000000;//SDO使用せず。スレーブモード
 SPI1CON2 = 0b000000000000000;//フレーム未使用
 SPI1STATbits.SISEL = 1;
 SPI1STATbits.SPIEN = 1;//SPI1有効化
 INTCON1 = 0b000000000000000;
 INTCON2 = 0b000000000000010;//INT1 ネガティブエッジ
 IFS1bits.INT1IF = 0;// INT1 割込みフラグクリアー
 IEC1bits.INT1IE =1;//INT1割込み許可
 IPC5bits.INT1IP = 3;//INT1割込み優先レベル3

 ・・・・・・・・・・・・・

CE割込み処理

void __attribute__((interrupt, no_auto_psv)) _INT1Interrupt(void) {
    IFS1bits.INT1IF = 0; //割り込みフラグ解除
    RXindex = 0;
}

SPI受信割込み処理

void __attribute__((interrupt, no_auto_psv)) _SPI1Interrupt(void) {
    unsigned int i;
 //    LED=1;
    IEC0bits.SPI1IE = 0;//受信割込み禁止
    IFS0bits.SPI1IF = 0; //受信割り込みフラグ解除
    i = SPI1BUF;
    RXdata[RXindex] = i;
    RXindex++;
    if (RXindex > 16) {
       RXreadyflag = 1;//全データ受信完了フラグ
       RXindex = 0;
       }
   IEC0bits.SPI1IE = 1;//受信割込み許可
//      LED=0;
}

INDEXに戻る