● 実験テーマ29

「PIC32MXによる、オシロ実験_1」(トリガ方式:ポテンショレベルをAD変換)

■ 2013.4.8
  (1) 実験目的
    @ PIC24Hと、PIC32MXのシステムクロック速度の違い(40MIPSに対し80MIPS)
       で測定帯域がどこまで伸びるか実験してみる。
       PIC24Hの時と同じサンプリング+バッファ処理方式(2分割のダブルバッファ)
       でやってみる。
       目標としては、SPIラインの観測が出来るように、100kHzのクロックが
       0.2ms/div(2uSサンプル)で、レベル低下なしに周期が確認できる程度に
       表示できればと思っているのだが・・・・
       まあ、100kHzの1サイクルは、10uSなので、2uSだと、1サイクル5データしか
       サンプルできないのでサイン波は厳しいと思われるが。

  (2) 実験環境整備
    @ PIC32MXトレーニング基板使用。
       ただ以下の改造が必要。
     a. 入力アンプ回路に、2ndOPアンプのZERO(オフセット)ポテンショを追加
       (センターレベル固定とポテンショ設定を選べるように、DICピンを立てる。)
     b. AN1ピンに、トリガポテンショを追加
       (これを切り離せる、DICピンも用意)
     c. 時間軸レンジ(サンプル周期)切替ロータリーDSW治具を追加
       (プルアップは、MPU内蔵プルアップを使用)

 

 

 

 

 

 

 

 

 

 


■ 2013.4.10
  ・とりあえず、PIC24Hの、AD設定条件そのままで、PIC32MXへ移植してみることにする。
  ・PIC24HJ12GP202と、PIC32MXの、ADCブロックは、ほぼ同じようである。
   またDMAを使わないで済みそうである。
   BUFとして最初から、ADBUF0〜Fの16個のバッファが用意されている。


■ 2013.4.11〜 2013.4.12
  ・ここまで、PIC24Hと、PIC32MXのAD設定関係のレジスタ類を比較検討[済]
  ・この他、PIC24Hと異なるのは、たぶんADC割込み関数の記述だと思う。


■ 2013.4.15
  ・一応ソース書き上げる。
  ・コンパイルエラー処理を行う。
  → CNENレジスタの構成が、PIC24Hと異なっていた。
     32bitあって、またマクロ名が異なる。
  → CNPU1は、NGで、CNPUEレジスタの、32bitしかない。
     記述については、下位16bitしか使わないので、16bit表記でOK
    → これでコンパイルは通った。


■ 2013.4.17
  ・PIC32MXトレーニング基板の改造が済んだので、今日は、100kHzサイン入力で前作の
   PIC24Hオシロの表示がどうなるか、まずリファレンス作りのため測定しようと思う。
  → 自作FGの出力範囲= 10Hz〜約10kHzまでが実用域(歪と、レベル低下を無視すれば、
     〜50kHz位まで)なので、100kHzサイン波は入力できない。(他にFGの持ち合わせ無)
  → そこで、秋月のLTC1799モジュールを利用して自作した、矩形波発生器(10k〜30M)
     を使うことにした。
  → これを使っての、
PIC24Hオシロでの結果は以下の通り。
     @ 100kHzでは、波形にならずレベルも極端に低下。
     A 30kHz位が実用限界


■ 2013.4.18
  ・PIC32MXでのデバッグ開始
  ・とりあえず、PIC32MXで基本のオシロ動作をするか、おおざっぱに確認することにした。
  → まず、イニシャルメッセージの、"Start Oscillo"は表示OK
     その後、XY軸が表示されない。
     たぶん、AD割込みに入ってこないと思われる。
     @ まず、EOC待ちの手前までは、RUNしていることを、デバッグ用LEDにて確認
     A AD割込みルーチンの頭で、デバッグ用LEDを点灯させ、プログラムを停止してみたが
        点灯しない。やはり、AD割込みにジャンプしてこないようだ。

  ・この想定原因としては、INT許可までの手順の誤りが考えられる。
   後閑氏の「PIC32MX活用ガイドブック」の手順(G〜H)を、AD_ONの前に入れてみる。
    
G AD1IFビットを一旦クリアして割込み要因をリセット
     → mAD1ClearIntFlag();
    H AD1IP<2:0>と、AD1IS<1:0>でプライオリティレベルを設定
     → mAD1SetIntPriority(7);
        mAD1SetIntSubPriority(3);
   → これらを追記してみたが、未だダメ
   → こうなったら後は、ベクター割込み許可の記述が適当でないのかもしれない・・・・
      ベクターは、AD割込みしか使ってないと理解しているので、シングルベクター割込み許可の
      記述にしてあるのだが、マルチベクター割込み許可に記述を変更してみたら、AD割込みが
      入るようになった。
(AD以外はタイマーも使っているが、PSとPRの設定だけで、割込みは
      使ってないので、シングルベクターでもよいはずと思っていたんだが・・・ まあ結果良しとしよう。)

  ・次に、1kHzサイン波を入力してみた。(1ms/divレンジ、0.3Vp-p入力)
  → 
ZERO及び、TRIGポテンショは効いているが、周期が正しく出ていない?
    (若干速めに表示されてしまう)

  → たぶんT3のPR設定ミスだろうと思い、調査を始めた。


■ 2013.4.19
  ・T3周期(サンプル周期)が合わない件の調査
  <調査事項>
   @ そもそも自作FGの出力周波数は正しいか?
   → Fカウンタにて正しいことを確認した。
   A それでは、PIC32MXトレーニング基板上の、入力アンプの出力Fはどうか?
   → これも、Fカウンタにて正しいことを確認した。
   B AD割込み周期を測定すれば、T3周期が合っているか確認できるので、
      AD割込み関数の頭に、ポートをトグルする記述を追加してチェックしてみた。
   → 最初、Fカウンタで測定したのだが、割込み処理が終わった後、メインの描画処理があるので、
      ON/OFFサイクルの規則正しい繰返しにならず、正しく測定できなかったので、
      (まあ、よく考えれば最初から解ってることなのだが・・・)ソフトオシロ2にて確認することにした。
   → 1ms/div(10uSサンプル)時、AD割込み周期は、80uSになっていることが確認できた。
      ソフトオシロ2の、オーバーサンプル機能を使って、50uSレンジで見ているので、確かさは保障できない
      ので、念のため、10ms/div(0.1msサンプル)でも測定してみたら、0.8mSになっていることが確認
      できた。(2CH分(信号入力と、トリガ入力)を、各4回ずつサンプルするので、10uSサンプル時の
      AD割込み周期は、10uS*4*2=80uSで正しい。)
      以下に、その時の測定波形を示す。

  ・T3割込みルーチンだけ、デバッグ用に作り、そこでトグル・フリーランさせて、Fカウンタで見れば確実なので
   別プロジェクトで、T3の設定周期(サンプル周期)精度を、Fカウンタにて確認してみる。
   (まあ、ソフトオシロ2の結果で殆ど問題ないのだが、精度までは判らないので・・やってみることに)
  → 10uSサンプルで、ポートをトグルさせると、周期は2倍の20uSになるので、周波数は50kHzになる
     はずである。
     その測定結果は、自作の周波数カウンタで、49.961Hz(20.0156uS)であった。
     つまり、サンプル
周期は、20.0156/2= 10.0078uSで、0.0078uS(7.8nS)の誤差しか出てないことが判った。

  ・どうも検証の結果
   T3サンプル周期の設定に間違いはなく正確に出ているようなので
   AD割込み周期も正しいようである。
   ならば、時間軸の描画位置(固定)と、取得プロットデータ数による波形描画との関係に誤りがあるのか??

  ・疑いたくないが、(意図的かもしれないので)後閑氏のPIC24Hのクロック設定の疑問が今でもある。
   PIC24Hのデータシートの説明通りに、後閑氏の設定はなっていないことが、前回の実験でも分かって
   いることから、このことで、描画との辻褄が合っているのかもしれない・・・・
  → ここで、PIC24Hオシロでも、T3周期の確認を行ってみることにした。

  ・ここで仮説を立てる。
   後閑氏の画面座標(時間軸)の、Xポジションの値:53及び、106は意図的かもしれないが、誤りと思われる。
   X= 50及び、X= 100が正しいと考える。
   (PIC24Hオシロで、うまく行っているのは、クロック設定が誤っていて、T3周期がズレそれで波形描画との
   辻褄が合っているのだと思われる。
   (または、オーバークロックにして意図的に、Xポジションを、ずらしているのかもしれないが・・・)

  <その理由>
   ※ 条件として、1ms/div(10uSサンプル)で考えると
    @ 1mS= 1000uS/1サイクル
       AD割込み周期= 80uS
       なので、1000u/80u= 12.5回、AD割込みが入って、波形1サイクル分のデータが揃うことになる。
    A 8回のサンプル+AD変換が完了すると、1回のAD割込みが入るように設定されているが
       その内の4回が、入力信号(AN0)についてのサンプル+変換(残り4回はトリガ入力いついての
       サンプル+変換)であるので、1回のAD割込みで得られる、AN0についてのデータは、
       4データである。
    B よって、1サイクルを描画するのに必要なデータ数は、
       4データ × 12.5回= 50データ
       になる。
    このことから、必然的に、最初の1サイクルのX座標位置は、X= 50になると考える。
    (実際に、50データ分が、AD割込みで取得されるのは、13回目のAD割込みが入った時になる)


■ 2013.4.20
  ・昨日の理由で、PIC32MXオシロの、時間軸の、X座標を、
   X= 53→ X= 50
          Y= 106→ Y= 100
   に変更したら、波形周期と、時間軸がぴったり合うようになった。

  ・昨日やろうと思っていた、前作の、PIC24Hオシロについても、T3割込みだけのプロジェクトを、
   PIC32MX同様に作成し、サンプル周期が、どの程度ズレているか確認してみることにした。
  → 結果は、Fカウンタによる実測で、52.5kHzであった。
     つまり周期にすると、1/52.5kHz= 19.048uS
               よって、T3周期(サンプル周期)としては、19.048uS/2= 9.524uS
     だから、PIC32MXオシロでは、スケール上の波形周期が速く見えていたことになる。

  → さらにこの結果から、Fcyを逆算すると、(PIC24Hの場合本来は、40MHzになるはずだが・・・)
     T3分周器の設定値:n=400なので、システムクロックサイクル:Tcyは以下で求まる。
     Tcy × 400= 9.524u
         ∴ Tcy=  9.524uS/400= 0.02381uS= 23.81nS(本来は、25nS)
     よって Fcy= 1/23.81nS= 41.999MHz

  → この結果から、後閑氏のクロック設定値は、意図的にオーバークロック(40M→42M)にして、サンプル周期を
     設定より若干速めにし、その分時間軸のX座標をズラして動かしていると考えられる。     

  <補足>
   ※ 
PIC24Hのクロック設定(PLLDIVの設定)について
    ・PLLDIV<8:0>に設定した値そのものが、逓倍値ではなく、設定値+2が設定値になる
ので、
     現在40としているのを、38(PLLFBbits.PLLDIV= 38;)にすれば、Fcy 40MHzになる。
     ちなみにこれでやると、T3割込みを使った、ポートトグル実験での、実測値は、50.002kHzになるので
     間違いない。

  ・ここで、PIC32MXオシロでの波形取りをして、PIC24Hオシロと比較してみた。
    以下の通りで、実用的には変わらず、30kHz位だが、PIC32MXの方が、50KHzも含めてレベルは落ちてないし
   波形としてもややはっきり表示できている。
   また、100kHzもレベル落ちしていない。(ただこれじゃ100kHzはとても実用にならない。)
   この差は、Fcyの差というより、ADCの若干のスピードアップによるものが大きいと思われる。


■ 2013.4.21
  ・これで、殆どPIC32MXへの移植実験は清んだが、思ったような高速化の成果は得られなかった。
  ・やはり少なくとも、0.2mS/div(2uSサンプル)レンジで、100kHzを矩形波入力でよいから、見れる
   形の波形表示にしたい。
  ※ 一つの案が前からあって、
    
トリガを、現在のポテンショレベルをサンプル+AD変換する方式から、2つの、TRG_UP、TRG_DWN
     SWで、直接デジタル値を設定する方式に変更すれば、AN0のみの連続サンプル+AD変換が可能
     なので比較的きれいな波形になると考えている。
  
→ このテーマは、次回の「実験テーマ30」として、展開したいと思います。


  <最終回路図及び、ソース>

   ・回路図は、こちらからどうぞ→ PIC32MX_オシロ実験回路図
   ・
Cソースは、こちらからどうぞScope_PIC32MX.c


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