● 実験テーマ46

「PIC32MX_多機能信号発生器の実験」
(後閑氏のHP記事を参考に、トレーニング基板を使って実験をしてみました。)



■ 2014.1.14
  ・以前にも、後閑氏の記事を参考に、dsPIC30Fでの、「多機能信号発生器」を自作し
   今までの実験でも活用していました。
  ・以前のは、上限出力周波数が、50kHzに制限されていることもあり、
   もう少し上の、100kHz以上出力可能なものを実験したいという思いがありました。
   そこで今回、後閑氏のHPの記事を参考に、PIC32MXと高速2CH DAC:AD5440による
   「多機能信号発生器」の実験をしてみました。
   尚、この記事の詳細は、2009年7月号の、トラ技に掲載されているので、大変参考
   になりました。

  ・最初は、いきなり、EAGLEによるP板化を考えましたが、ちょっと後閑氏の回路に
   疑問があったので、トレーニング基板と治具基板によって動作を確認してからにしました。
   
その疑問点とは、この実験に使用している、COPAL社製の、
   光学式ロータリーエンコーダの、電源電圧を、+3.3Vから供給している点です。
   COPALの当該製品のデータシートによると、電源電圧は、+5.0Vとなっています。

   失礼ながら、これでちゃんと動いているのかと、疑問があったので、
   後閑氏に質問のメールをしてみました。
   早速、回答があり、「内部回路が正確には不明ですので何ともいえませんが、
   とりあえずは問題なく動作しています。」
   ということでした。


■ 2014.1.15
  ・まずは、後閑氏の回路(DAC_ABを切替えて両方使用)を殆どそのまま拝借し、
   AC出力のレベル可変ポテンショを追加しただけの、自分用の実験回路図を
   水魚堂で作成しました。
   また、手持ちにない部品(AD5440, 変換基板等)の手配も済ませました。


■ 2014.1.21
  ・部品が揃ったので、まずは、AD5440(SSOP24パケージ)を、ダイセン電子の、
   DIP変換基板(24pinのは無いので、28pinのを利用した)へ実装することから始めた。
   表面実装ICでピン間のピッチも、0.65mmと狭いので、そんなに楽にはハンダ付できないが
   この程度なら自力でハンダ付の経験はあるので問題なく作業は完了した。
   (0.5mm以下になるときついので、いつもマルツさんに実装依頼していますが・・・)


■ 2014.1.25
  ・DAC+ロータリーエンコーダ治具基板+治具ケーブルの製作を行った。
   また、トレーニング基板と各治具の総合接続図も、手書きでラフ書きした。

  <動作確認に入る>
   @ まずは総合接続状態で、各電源とGND間がショートしてないかのチェックを行う。→ OK
   A DAC未実装時の電源電圧OK
   B 液晶を実装後、後閑氏が用意されたHEXを、そのまま書込む→ OK
   C ざっとの動作感触だが、
     ・液晶表示はOK
     ・タクトSW動作もOK
     ・ロータリーエンコーダも、回転方向によって、WidthとFreg表示が増減しているので、大方は
      +3.3Vでも動いているようである。


■ 2014.1.27
  <動作チェック続行>
   @ 中華オシロで確認したが、RCAジャック出力(DAC_A, DAC_B)に出力されてないようだ。
   → DAC_CS信号を中華オシロで確認したが、十分追従できてないようで、Lowレベルが
      正しく表示できなかったが、おおざっぱには決まった周期で、Lowパルスが出ている
      ようである。


■ 2014.1.28
  ・後閑氏作成のオリジナル・ソースを見始めた。
   ちょっと気になるのは、このDACは、10bitデータ入力なのであるが、実際にアクセス
   しているのは、上位8bit(DB2〜DB9)のみである。
   この理由はあとで解ったのだが、
「PIC32MX側での、DMAの自動繰返しの範囲が
   256バイトに制限されている」
という理由であった。
   それはいいのだが、どうも後閑氏のオリジナルソースには、
ハード的に接続されている
   下位2bit(DB0:RF0, DB1:RF1)をコントロール(上位8bitアクセスなので、普通は下位2bit
   は'0'にFIXするはず)する記述がどこにもない?

   まあ、実験レベルなので、その辺は気にされてないのかもしれないが・・・・
   ちなみに、後閑氏のHEXそのままを焼いた状態で動かすと、DB0:'1'で、DB1:'0'であった。
   出力ポートはイニシャライズしないとレベル不定になるはずなので、その状態で偶然この
   レベルになっているものと思われる。

  ・ここで、AD5440の動作をデータ・シートから把握することにした。
   後閑氏の回路図を見ると、AD5440をユニポーラモードで使用しており、データ線は10本フル
   に接続してある。
   またこのDACは電流出力タイプなので、DAC出力に、I-V変換用のOPアンプが必要になる。
   注意すべきは、このOPアンプ出力では、DAC入力コードに対し全てマイナス側に電圧出力される
   ということである。
   OPアンプの出力とDAC入力コードの関係は次式で示される。
   
Vout= -Vref X 入力CODE/1024

   Vref≒3V、入力CODE= 0〜 1023なので、Vout= 0〜 -3 X 1023/1024= -2.997Vの範囲になる。

   したがって、AC出力の場合は、さらにこの直流分をカット(セロ点を中央に)すべくコンデンサが
   必要になる。
   まあここまでは良いのだが、よくよく考えると、
DC出力の方は、OPアンプの出力そのままでは
   マイナス領域に出力されてしまうので不都合である。
   今回は、CMOSレベルのDC出力が欲しいので、この出力の後に、1倍の反転増幅を追加して
   対処することにした。

   またこう考えると、後閑氏の回路のように、DACチャンネルを両方とも同じAC出力にしてセレクト
   信号で切替えても、ちがうコード設定で同時出力はできないので、片チャンネル無駄なような
   気がする。まあ、AD5440の評価という位置付なのだと思いますが。
   
自分の用途としては、片チャンネルで、ACとDCモードの出力ができればよいので、
   今回は、DAC_B側のみ使い、DAC_ABピンは、'Hi'に固定することにした。

  ・ところで、未だRCAジャック出力には、波形出力されてない。(未だ、DAC_ABピンのレベル固定はしてない)
   そこで以下を確認した。
   @ DAC_ABピンの確認
      DACチャンネル切替SWで、Aチャンネル選択時: 0V(Low)/Bチャンネル選択時: 3.2V(Hi)でOK
   A DAC_CS信号周期の確認
      以下のようなチェックを行ったが、問題なし。

   B DACデータ入力の確認
      波形種別を、サイン波/矩形波/三角波と替え、上位8bit(DB2〜DB9)まで中華オシロで見ると、波形種別に
      よって、データのデュティーが変化し、MSBほど粗く(パルス幅≒5〜10uSでDuty:50%に近い)波形、
      LSBほど細かい波形になっているので、ざっと見は、データ入力も問題なさそうである。
   C そこで、OPアンプとDAC間の配線を疑ったが問題はなかった。

  ・ここまでの結果で、AD5440の実装(ハンダ付)に問題無ければ、何かしらの波形が、RCAジャックから出力
   されるはずなのだが・・・

  ・さらに追及したところ、RCAジャックでなく、その前段の、直流カット用コンデンサ出力では
   波形出力されていることを確認した。
   RCAジャックから出力されないで、その前の直流カット用コンデンサ出力では出力があるということは
   いったい何が原因なのかと思ったが・・・・
   気が付くのが遅かった・・・
   非常にお粗末な私の思い込みによるミスであった。

   
今回使用した、RCAジャックは、今迄使用してきた、マル信無線電機社製の、MR-551L-1
   の、2pinのものとは違い、秋月で販売している安価な、3pinの物なのだが、今迄のマル信無線電機
   の物と、GNDピンと、信号ピンのピン配列は同じだと思い込んでいたのだ。

   秋月の物は、ちょっと特殊で、ちょうど3pinの、オーディオ・フォーン・ジャックと同じピン構造をしている。
   GNDと信号ピン以外に、プラグを差し込むと、信号ピンから離れる接点ピンが追加されているのである。

   下図に示すのが、正解のピン配列と、シンボル・ピン番との対応であるが、私が信号ピンと、接点ピンの
   シンボルとの対応を逆に、思い違いしていただけであった。


■ 2014.1.29
  ・下位2bit(DB0, DB1)の、'0'FIX等、後閑氏のソースをいじりたいので、ここでようやく自分用の
   プロジェクトを作成することにした。
   また、昨日の考察を踏まえ、DC出力側へ、1倍の反転増幅回路を追加した。

  ・後閑氏のオリジナルソースからの変更点は以下の通りである。
   @ 
下位2bit(DB0, DB1)の、'0'FIX追加
   A DAC A/B切替サブルーチンは、不要なのでコメントアウトした。
   B 適時、後閑氏のコメントに自分なりの補足を追加した。

  ・ソフトは整備できた。
   いざコンパイル→ NG
    → プロジェクト構成時
     Source Filesに、lcdライブラリソースを登録する必要は、今回のメインソースのヘッダ部の
     書き方では必要なかったようで、lcdライブラリソースの登録を、Removeして再コンパイル
     したら、OKになった。
     いつもは、ソース・トップに、#include "LCD.Lib1.c"とやるが、
     今回の後閑氏のそれは、LCD関係のマクロ定義と、LCDで使っている関数の、
     プロットタイプ宣言の下に、#include "LCD.Lib1.c"としているため、メインソースの登録
     だけでよくなっているようだ。

  ・早速、HEXを書込んで試すが、上手く行かない?
   
分解能SW(INT3)を、ONすると、液晶クリアして、その設定画面になるはずが、
   ならず、メイン画面でフリーズしてしまう??


■ 2014.1.30
  ・昨日の不具合調査に入った。
   後閑氏のソース上で、1つ発見
  → 
ConfigINTx(・・・・)の中の、EXT_INT_PRI_x(優先順位)の設定値と、INT割込み関数の
     プライオリティ・パラメータ設定値とで、値が食い違っている。

     食い違っているのは、INT2(DMA CH)と、INT3(分解能)の2つで、
     ConfigINT2(・・・, EXT_INT_PRI_4);
      ConfigINT3(・・・, EXT_INT_PRI_5);
     に対し、関数の方は、
     void __ISR(11, ipl3) INT2Handler(void)
               void __ISR(15, ipl3) INT3Handler(void)
     となってて、食い違っている。
     しかもこれは、症状と一致している。

  <解決策>
   ・
割込み関数の方の、ipl設定値(INT0:2、その他は、3)は修正無しで、これに合わせ
    ConfigINTの方を修正してみた。

   → これで見事動いた。

  ・ここでもう少しソースを整理してみる。
  → まず、DMA CHはハード的に、Bサイド固定にするので、SW4(後閑氏回路図では、SW2)
     は不要になる。
  → そこで整理
     <修正案>
     ・ロータリーエンコーダ-B相による、INT0(RF6)
                 ・波形種別:SW5による、INT1(RD8)
     ・DMA CH:SW4による、INT2(RD9)→ これが不要になる。
     ・分解能:SW3による、INT3(RD10)→ これを、INT2(RD9):SW4に変更することにした。

  ・ソースを整理し、コンパイル〜 HEX書込みOK
    → 問題なく動いた!!
     動いたことは動いたが、ちょっと奇妙な点がある。
    
それは、後閑氏が作成されたプロジェクトの中に生成されたHEXをそのまま焼いた時は
     うまく動くのだが、何故か、同プロジェクトの中のソースファイルそのままに、新規に
     自分用のプロジェクトを作成してコンパイルした結果生成されたHEXでは、動かなく
     なる。

     普通は、同プロジェクトの中に生成されたHEXは、そのプロジェクトに登録されている
     ソースファイルをコンパイルした結果のものなので、そういうことは起こらないはずである。
     何故、OKなHEXに対応する、ソースなのに誤記があるソースが登録されていたのか??
     ちょっとこの点がグレイだが、動いたので良しとし、次の作業に移ることにした。


■ 2014.1.31〜 2014.2.1
  ・この期間は、種々の波形サンプル取りを行った。
   以下に、その結果をアップします。

  ・最後に、冒頭で気になっていた、COPALの光学式ロータリーエンコーダの、出力波形を取得してみました。
   Vcc(3.3V)近くまで、Hiレベルが上がっているので問題ないようである。


<最終回路図>
 ・こちらから、どうぞ→ 「PIC32MX_多機能波形発生器_実験回路」

<最終ソース>
 ・こちらから、どうぞ→ WaveGen1.C


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ47へ →