● 実験テーマ62

「PIC32MX_モノクロ単CHオシロV2の、製作実験記」
(実験テーマ59〜61の実験結果を踏まえ、ケーシングまで含め使える形にまとめました。)

<最終機能仕様概要  141205作成>
 (1) 測定チャンネル: 1CH
 (2) 入力モード切替: AC/DC(液晶上に、そのキャラクタを表示)
 (3) 入力インピーダンス: 1MΩ
 (4) 測定可能周波数: 1Hz〜 50kHz
               (50mV/Dの場合は、100kHzまでは、レベルを落とさず、その周期を確認できる位の表示は可能)
 (5) トリガモード: AUTO/SINGLE
   (5)-1 AUTOトリガ
     @ トリガが成立しない場合は、最初から、1画面分波形を表示
     A トリガが成立した場合は、成立したところから、1画面分波形を表示
        トリガ成立の場合、緑LEDが点灯する。
     @、Aを自動で繰返す。
   (5)-2 SINGLEトリガ
     @ トリガモード切替SWが、SINGLEになっている時、次のシングルトリガ動作となる。
     A まず、READY SW ON待ちとなり、READY SWが押されると、赤LEDが点灯
     B 信号を入力し、トリガが成立すれば、緑LEDを点灯/赤LEDを消灯させ、1画面分の波形を表示する。
     C 操作の途中で、トリガモード切替SWを、AUTOにすると、AUTOに戻る。
 (6) トリガスロープ切替
    @ SLOPE SWを押す毎に、立上りエッジと、立下りエッジを交互に繰り返すので希望のスロープに設定する。
       液晶上に、そのスロープキャラクタを表示する。
 (7) トリガレベル調整
    @ ロータリエンコーダによって、トリガレベル調整を行う。
    
A 初期値=512(センター:1.5V相当)、1STEP ±16(約47mV相当)
       センター:512を中心に、±側は、31テップ、-側は32ステップになる。(計64ステップ)
       32ステップ目は、+側は、フルスケール値:1023をオーバー(1024)するので、1008(2.95V相当)とし
       −側は、0なので、そのまま0とする。
       −側は、33ステップ目に、フルスケール値:0をオーバー(-16)するので、0とする。
    B トリガ設定レベルが視覚的に判るように、液晶画面、右端に、バー(マーカー)表示する。
 (8) ホールド機能
    @ HOLD SWが押されたら、黄LEDを点灯させ、その時の波形表示を保持する。
    A もう一度押すと、ホールドを解除する。
    @、Aをオルタネートに繰返す。
 (9) 電圧軸レンジ切替
    50mV/D, 0.1V/D, 0.25V/D, 0.5V/D, 1.0V/D, 2.5V/D, 5.0V/D, 10V/D
    以上を、液晶上に表示する。
 (10) 時間軸レンジ切替
    0.1mS/D, 0.2mS/D, 0.5mS/D, 1.0mS/D, 2.0mS/D, 5.0mS/D, 10mS/D, 20mS/D, 50mS/D, 500mS/D
    以上を、液晶上に表示する。
 (11) 液晶画面イメージの保存機能
    液晶画面イメージを、BMP形式で、SDカードに保存することが出来ます。
    次に示す、2つのケースで利用できます。
     @ ホールド中に、WRITE SWを押すと、SDカードに画面イメージを保存します。
     A SINGLEモードで、トリガが掛り、再トリガ待ちになった時に、WRITE SWを押すと、その時の画面イメージ
        を、SDカードに保存します。

    記録ファイル名は、自動更新します。 
    "WAVE000.bmp"から始まり、"WAVE099.bmp"まで自動更新し、100ファイルを上限とした。
       (100ファイルを超えたら、"WAVE000.bmp"から上書きされる)

    尚、途中でオシロ電源を切った場合の、ファイル名のバックアップは省略しましたので、途中で切った場合は
    それまで保存したファイルを、PCにコピー(バックアップ)する必要があります。

 (12) 時計機能
    SDカードにイメージを保存する際、タイムスタンプを書込む必要があるので、時計機能を追加しました。
    時計は、ボタン電池によるバックアップ回路を有します。
    また、電池交換時に、時計合わせが必要になるので、時計合わせも出来るようにしてあります。
    HOLD SWを押しながら、電源ONした時に、時計合わせモードに移行します。
    時計合わせに必要なSWは、オシロ機能の次のSWと兼用にしました。
     @ 項目選択(TM_SEL):HOLD SW
     A アジャスト(TM_ADJ):SLOPE SW
     B アジャスト確定(TM_ENT):READY SW
    時計合せの操作については、実験テーマ60を参照してください。

    時計の液晶画面への表示については、ホールドモード時と、SINGLEモードの時だけにしました。
    通常は、イメージ保存の時に、この時計表示もイメージとして保存されますが、
    時計表示をイメージ保存したくない時は、WRITE SWを押しながら、電源SWをONします。
    すると、液晶へは時計表示しなくなります。

・以下、この実験の顛末記です。

■ 2014.11.10
  ・PIC32MXを使い、トリガレベル調整を、ロータリエンコーダで行う、モノクロ単CHオシロを、使える
   形にまとめようと思います。
   今迄、自作してきたオシロにない機能を追加しました。
   それは、オシロ画面イメージ(BMPファイル形式)をSDカードに保存する機能です。
   その際、タイムスタンプを書込む必要があるので、外部に電池バックアップ付の、RTCデバイス
   を追加しました。
   オシロ性能としては、
最少2uSサンプル(0.1mS/D)が可能となっています。

  ・今迄のオシロに、機能追加をしたので、ポート割付を大幅に変更する必要があります。
   しかし、SDカードインターフェースと、液晶インターフェースは、ライブラリが確定しているので、動かしては
   いません。
   割付を終え、水魚堂による回路図作成も済ませました。

  ・さて本番ソフトは、今迄ポイント、ポイントで実験して来たソフトの一部を組合わせればよいが・・・・
   参照ソースは以下の通りです。
    @ Scope_PIC32MX_RE_TRG_TEST.c
    A PIC32MX_RTC8564_Test_2.c
    B PIC32MX_BMP_WriteTest_1.c
   尚、今回のソース名は、「Scope_PIC32MX_V2.c」としました。
   一連の自作オシロシリーズは、V6が最新ですが、2現象オシロとなっているので、今回のは、V7としないで
   PIC32MXでのモノクロオシロとしては、実験バージョンを含めて、2台目なので、この名前にしました。   


■ 2014.11.11
  ・新たに考えないといけない箇所(シングルトリガに於けるイメージ保存とか、RTC8564でのタイムスタンプ等)
   もあったが、一応、ソースを書き上げた。
   コンパイルもOK!!


■ 2014.11.12
  ・ソースと、HEXは準備できたが、肝心のハードは未だ。
   とりあえず部品を手配しないといけないので、パーツリストを作成することにした。

   今回、なるべく安く上げるため、毎回マルツに依頼していた、TQFP64(PIC32MX)の、変換基板への実装は
   依頼しないことにした。
   とは言っても、自力で半田付けする自信はないので、以前オシロV4の前段階で製作した、オシロV3から
   変換基板:Q064へ実装した基板を部品取りすることにした。
   オシロV3は殆ど使用しないので問題はない。


■ 2014.11.13
  ・この、部品取りが思いのほかやっかいだったが、何とか部品取りを済ませた。
   結局、コネクタを付けたまま本体ユニバーサル基板側の半田を吸取って抜いた。
   Q064側は小径のスルーホールなので、吸取りにくくあきらめた。
   まあ、吸取りといっても、電動の吸取り器を持っている訳でもない(手動のみ)のでしょうがないが・・・


■ 2014.11.14〜 2014.11.24
  ・この期間に、ユニバーサル基板の加工〜 部品実装まで済ます。

  ・まず、電源とグランド間の、ショートチェックから行う。
   何と、+3.3Vと、DG間が、ショートしているではないか!!
   早速、配線の目視チェックを行う。
   PIC32MXの電源配線回りが、あやしい。
   結局、PICへの大元の電源供給点である、9pin:Vssと、10pin:Vddへの配線がテレコになっているのが
   原因だった。
   修正し、OKとなった。

  ・次に、電源電圧を確認
   @ 液晶+PICと、LTC1144のみ実装(電池は未実装)した場合
      +5V→ 5.21V
      +3.3V→ 3.28V
      AVCC→ 3.25V
      -AVCC→ -3.27V
           -5V→ -5.21V
   A さらに、RTC8564+電池を実装した場合
      @と変わらず。
      Vbatをチェック
      電源OFF時の、Vbat= 3.10V
      電源ON時の、Vbat= 3.15V(IC3-8pin)

  ・この状態で、HEX焼きOK
   残りのIC(OP AMP等)を実装し、動作チェック開始
   まず駄目!!
    @ 時間軸が、0.1mS/D固定で動かない。
    A CN割込みが駄目?(SLOPE SWが効かない)
    B READY SWを押すと、HOLD LEDが点灯?
   この状態で電源電圧確認
      +5V→ 5.19V
      +3.3V→ 3.28V
      AVCC→ 3.20V
      -AVCC→ -3.12V
      -5V→ -5.20V

  ・調査開始
   @ SLOPE, HOLD SWが効かないのは、
      RB1(AN1): HOLD SW
      RB2(AN2): SLOPE SW
      を、デジタルピンに設定していなかったから。
   A 時間軸が、0.1mS/D固定?
      これも判った。
      読込み時の変数名を、SWとしていたためで、これは、TSWにしないと駄目
      尚、表示側では、TSWにしていた。

   上の2つは直ったが、まだおかしい。
   オシロ入力をオープンにしても、直線表示にならない。棒状の縦ラインが並んで表示される。
   これもすぐ判った。
   ADC設定が、入力スキャンする設定になっていた。
   つまり、アナログ的に、トリガレベル入力する場合の設定のままになっていた。
   AD1CSSL= 0x0005→ 0x0000, AD1CON2= 0X041E→ 0X003Cに修正しOKになる。

   しかし、ATT変化がおかしい。(GAINが合わない)
   これは、イージーミス。
   今回、部品代節約のため、オシロV3から、部品取りを行ったが、オシロV4の、マルチプレクサは、
   4051(8 対 1)でなく、4052(4 対 1 * 2回路)であるのを忘れていた。
   早速、4051に交換して、やっとオシロ波形がまともに表示されるようになったが、100KHz入力時の
   レベルの落ちが実験の時よりやや多い。
   まあ、実験の時は、トレーニング基板+外部に簡易ATT基板(約200k程度の入力インピーダンス)
   を、使用しているため、1MΩのインピーダンスよりかなり低いので入力容量(数pFの浮遊容量)
   の影響を受けにくいということもあるのだが、使用しているオペアンプの違いによる差も考えられる。
   トレーニング基板で使用しているオペアンプは、microchip社の、MCP6022で、GBWP(ゲイン帯域幅積)
   が、10MHzと広い。
   一方、今回のは、いつもの通り、TI社の、LMC6482で、GBWP= 1.5MHzである。
   最大でも、2uSサンプルなので、サンプル周期的には、100kHz(10uS周期)が測定限界ということを
   考えれば、LMC6482で十分であるが、今回は、入力インピーダンスを、1MΩと高くしたため、入力抵抗
   が入らない、50mV/Dを除いては、入力容量の影響を受けやすく、高い周波数でレベルが低下する。
   試しに、GBWPの高い、MCP6022に交換してみることにした。
   幸い手持ちがあったので早速交換した。
   若干ではあるが、100kHz入力時のレベルが上がったので、今回は、こっちで行くことにした。
   この時の、イメージを保存してなかったので、後日取ったイメージをアップしておきます。

  ・あと、今回、ACアダプタ入力(+5V)の、LCフィルタを省略したアダか、ZEROレベル表示時の
   ノイズの影響が、若干多いような気もする。
   これは後で詰めることにする。

  ・波形表示が大方OKになったので、他の機能チェックをしてみることにした。
   まずは、タイムアジャストモード。
   TM_ENT(設定確定)した後、ホールドモードになってしまう?
   これは、HOLDE SWを押しながら電源ONした場合、時計合せモードに移行という仕様にしたので、
   ここ(電源ON直後の、HOLD SW読込み)を通過する以前に、CN割込み+マルチベクタ割込みが許可
   されていると、HOLD SWを押した瞬間に、HOLD FLAGがONしてしまうので、こういう結果になることが
   解った。
   HOLD SWをレベルセンスし、時計合わせで、ENTした後に、CN割込み許可するようにしたら解決した。


■ 2014.11.25
  ・全体的な動きとして、まだおかしいところがあるので、それから先にかたずけることにする。
   @ 画面イメージ保存時のタイムスタンプが、RTCから読込んだ値でなく、デフォルト値(2014/10/29 14:30)
      になってしまう。(但し、イメージ上の時刻は正常)
   → 原因は単純
      SetClockVars関数に渡す変数の参照先が、デフォルトテーブルになっていたため!!
      これを、RTCレジスタの受信データバッファに変更すればよい。
      以下に、タイムスタンプを、PCのエクスプローラで確認した例を示す。

   A オシロ入力ZERO時の、ノイズの表示への影響が気になる。
      これは、私の手抜き(ACアダプタ入力:+5V_INの、LCフィルタを省略)がアダとなっていると思われるが、
      オシロV5の時と同じように、次のことを試した。
      使うACアダプタの違いで、ノイズの出方が異なるか?
     
容量の大きいACアダプタ(DC5V 4A出力/安定化出力のスイッチング方式:リップル規格=100mVp-p(max)))と、
      容量の小さいACアダプタ(DC5V 2.3A出力/スイッチング方式:リップル規格=150mVp-p(max))
      を使っているが、容量の大きいACアダプタの方は、ノイズの影響が、ZERO入力時の輝線表示に現れないが
      容量の小さい方を使うと、ノイズの影響が、ZERO入力時の輝線表示に現れる。
      そこで、オシロV5の時と同じように、2つの対策を施すことにした。
      1つは、-AVCC(-3.3V:初段バッファアンプの負電圧)のリップルレベルの減少処置で、
      これは、負電圧コンバータ:LCT1144の、負出力のコンデンサ容量を、10uから、100uに増やし対応。
      これによって、約0.1Vp-pあったリップルが、約20mVp-pまで減少。電圧も、-3.0Vを、キープ。

     もう一つの対策は、ACアダプタ入力:+5V_INに、π型LCフィルタを挿入する改造である。
      
ACアダプタ入力に、LCフィルタを追加すると、そのローパス(ハイカット)効果から、高い周波数成分(スパイクノイズ)
         はある程度除去され、通過域の低い周波数のみ通過されるので、たとえスパイクノイズが乗っていたとしても、
         そのレベルは小さくなっていてさらに、アダプターに関係なく、LCフィルタ通過後の、リップル周波数は下がるので
         ノイズがサンプルされる確率が下がると考えられる。

  ・ここで今一度、改造後の電源コンディションを確認
   @ 4Aの、ACアダプタ使用時
      +5V→ 5.09V(リップル:約10mV以下)
      +3.3V→ 3.28V(リップル:無し)
      AVCC→ 3.16V(リップル:無し)
      -AVCC→ -3.00V(リップル:20mV)
      -5V→ -5.20V(リップル:ほぼ無し)

   A 2.3Aの、ACアダプタ使用時
      +5V→ 4.03V(リップル:約10mV以下)
      +3.3V→ 3.28V(リップル:無し)
      AVCC→ 3.16V(リップル:無し)
      -AVCC→ -3.00V(リップル:20mV)
      -5V→ -5.20V(リップル:ほぼ無し)


■ 2014.11.26
  ・昨日までで、大方、全ての機能がよくなってきたと思われたが、
   ここで、イメージ保存機能に、不具合発覚!!
   SDカードを入れないで、電源を入れ、ホールドモードにて、WRITE SWを押すと、まずは、液晶に
   カード挿入を促すメッセージ表示→ ここまでOK
   ここで、カードを入れると、何故かリセットされてしまう??
   いつもではないが、発生頻度は高い。

   この現象は、不可解???
   カード挿入(CD/)は、ホールドモード中しか見ていないはずが、通常モード時でも、カードを
   挿入すると、CPU RESETが入るかのような動作をする。
   ハード的に、CD/ラインと、RESETラインがショートしているのか、はたまた、
   カード挿入時のノイズが、RESETラインに乗るのか?
   前者は調べたが問題なし。
   後者も、自作オシロで確認したり、RESETピンにC挿入してみたりしたが解決しないので、関係なさそうである。

   この不意にリセットが掛ってしまう要因が、なかなか解らなかったが、
   WEB上のサイトを眺めていて、ふとひらめいた。
   MPUのリセット要因として、MPU内部にある、ブラウンアウトリセット(BOR)によるリセットが
   考えられる一番の要因のような気がしてきた。

   Vdd(+3.3V)が、SDカード挿入時の突入電流によって、瞬間的に低下し、それがBORに引っかかって
   内部システムリセットが入ってしまうと推定できる。
   電源の安定化のため、試しに、3端子レギュレータ出力のコンデンサを、10uから、33uに増やしてみた。
   これでも、時々リセットが入るが、頻度は、だいぶ減った。
   連続して、カードの挿入、脱着を繰返すより、暫くおいてから挿入すると、発生率が高くなる。

   33uにさらに、10uパラ接続でよくなったので、明日、33uを、47uに交換するか、
   SDカードスロットの電源供給点のパスコン容量を、10uから、47uに交換してみることにする。


■ 2014.11.27
  ・現状で、5V入力の消費電流を実測してみた。
   @ バックライトOFF時
      SDカード未挿入時→ 約80mA(78〜80mA)
      SDカード挿入時→ 約82mA(80〜82mA)
   A バックライトON時
      手持ちのテスターが、200mAまでしか測れないので実測できないが、バックライト電流は定格の、300mAほど
      流しているので、消費電流は、約380mAほどになる。

  ・SDカード挿入時に、Vddのディップが見られるか、テスター、自作オシロ等で確認してみたが、測定できなかった。
   もう、SDカードスロットの電源供給点のパスコン容量を、10uから、47uに交換して試すしかないので、やってみたら
   結果は良好、何度挿入→ 未挿入を、間を置いて繰返してもリセットは入らなくなった!!

  ・そろそろまとめに入ろうと思う。
   イメージ保存の時に、時計表示を表示させたくない時(波形描画域を広くとりたい時)もあるので、表示するか否か
   の設定を電源ON時の、WRITE SWの状態で判断することにした。
   WRITE SW OFFして電源ONの時→ 時計表示有
   WRITE SW ONして電源ONの時→ 時計表示無し


■ 2014.11.28〜 2014.11.29
  ・アクリル板の加工がまだなので、加工をし、組込みまで済ませた。


■ 2014.12.2
  ・色々いじっていたら、イメージ保存時に、おかしなことが起こることを確認。
   ちょっと症状を整理しないと、解りにくいが、こんな感じ。
   「例えば、SDカード上に、前日採った、WAV000.bmpと、WAV001.bmpがあった場合
   当日、新たに、オシロの電源をONして、イメージの書込みを行うと、WAV000.bmpから上書きされるはず
   がされず、タイムスタンプ部の書込みがされないのか、PCのエクスプローラでみた場合、更新日時の欄
   が、ブランク表示になっている。
   しかしこのまま連続して書込みしていくと、あるところから正常動作となる。」

   この症状はタイムスタンプ時の問題で、液晶画面上の時計表示イメージは正常に保存される。
   SetClockVars関数がうまくいかない時があるのかを確認するために、毎回、固定時刻値をタイムスタンプ
   してみる。
   固定値であれば毎回問題ないことを確認した。
   ということは、正しい時計データを、RTCレジスタからリードして、この関数に渡している限りは、
   問題ないということが判った。
   ある特定の時刻に於いて、正しくない時計データをSetClockVars関数に渡している可能性がある。
   それを調べるために、SetClockVars関数の戻り値を見て、有効な時計データの時のみ、タイムスタンプ
   を行うようにしてみた。


■ 2014.12.3
  ・今、タイムスタンプに失敗した時の状態が今一不明なのだが、次の、2つが考えられる。
   @ RTCレジスタから読出した値が無効な値である。
   → これは、液晶画面上の時計表示が毎回問題ないので、考えなくてよいと思うが・・・
   A @はOKでも、型変換(BCD to バイナリ)した後の値が無効な値である。

   Aの可能性が強い。
   ちょっとソフトをいじって、RTCレジスタから読出した値と、型変換後の値を、液晶に表示させてみた。
   良い時と、悪い時でどう違うか確認すれば原因は明確になる。
   表示させた例を示す。

   これで、Aが原因であることがはっきりした。
   細かく見てゆくと、20秒以上になると、引き渡す値が無効な値になる事があることが判った。

   ※ 結局、SetClockVars関数に、RTCバイナリデータを渡す時、RTCレジスタ(BCD)の読み値を、
      マスク処理なしにそのままバイナリに変換していたのがNGの原因だった。
      RTC8564のレジスタは、本来の時計データの他に、不定ビット及び、他の機能ビットを含むので、
      マスク処理が必要になる。
     
      液晶への時計表示の時はマスク処理をしていたのに、タイムスタンプの時、忘れるとは・・・
      まあ、今回、手抜きで型変換ルーチンをサブルーチンにしてなく、
      直接関数の引数のところに個別に変換式を書いたのがいけなかったと反省している。
      もうちょっと早い時期に気が付くべきだった。


■ 2014.12.4
  ・最後に、HOLD LEDの問題が残っている。
   症状:HOLD SWの反応はOKだが、HOLD SWを遅く押した場合、ONでLEDが点灯しないことがある。
        HOLD SWを早く押した場合は比較的良い。
   推定原因:SW読込みは、CN割込みで実行
           フラグ渡しで、メインでLEDをON,OFFしているので、タイミングが合わない時があると推定

   解決策としては、フラグ渡しでなく、CN割込みの中で直接、LED ON,OFFをおこなえばよいはずである。
   LED ON,OFFだけなので処理時間の心配はしなくてもよいはず。
   この修正でこの問題も解決した。

   これでようやくまとまったので、ここいらで、何時もの通り、サンプル波形取りを行った。
   実験風景と、サンプル波形は、このページ頭の写真を参照してください。


<最終回路図>
 ・こちらから、どうぞ→ 「PIC32MX_モノクロ単CHオシロV2(デジタル部)」
                   「PIC32MX_モノクロ単CHオシロV2(アナログ部)」                

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


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