PIC32MZ-DA CPUボードが完成しましたので、このCPUボードを利用してWaveAnalyzerを作成します。

仕様

  • 機能         オシロスコープ、FFT、1/3オクターブアナライザ
  • サンプリングレート  12.5Msps(max)=3.125Msps*4
  • 分解能        12ビット
  • サンプリングバッファ 2048ワード
  • CPU         PIC32MZ1025DAG176(QFP 176pin)
  • プログラムメモリ 1024kB
  • データメモリ 256kB
  • DDR2 SDRAM 32MB
  • アナログ周波数帯域  10Hz~1MHz
  • 垂直感度       2V/Div~0.1V/Div(10:1プローブ使用時)
  • タイムベース     10msec/Div~1μsec/Div
  • 入力インピーダンス  1MΩ
  • 最大入力電圧     ±10Vpp(1:10プローブ使用時)
  • ディスプレイ     8インチ TFT カラーLCD
  • チャンネル数     2
  • 外部インターフェース USB typeB
  • ストレージ      SDカード
  • 電源電圧       100V
  • 外形寸法       300mm(W)*150mm(H)*80mm(D)
  • 重量         約 kg


筐体

8インチのTFT液晶モニタを入手できましたので、これを加工してWave Analyzerを作ります。
入手したモニタです。

中身はコントローラー基板とインバーターが内蔵されていました。LCDインターフェースのコネクタは取り外しました。

コントローラ基板を外すと、液晶パネルが見えます。
液晶パネルは、東芝松下ディスプレイのLTM08C351Tで、800×600ピクセル、RGB6bitです。
インバータは TDKのCXA-0300が載っています。さらにタッチパネルもついています。

LTM08C351

アナログ入力部の設計

アナログ回路(入力部)には、10:1のプローブを接続し、測定する。
ADCの入力電圧範囲は0~3.3Vであり、プローブの1:10を考えると0~33Vとなる。
入力はACカップリングされているため33Vppの入力が可能である。


また、オシロスコープの入力電圧の切り替えが、1,2,5単位から、33V内の値では、2V/div×10div=20Vが近い。ゲイン1倍の時、入力の電圧設定値は2V/divとなる。
入力信号は、マイクロチップの可変ゲインOPアンプ MCP6S21で増幅される。
このOPアンプは、レールtoレールのオペアンプで シリアル設定で1倍、2倍、4倍、5倍、8倍、10倍、16倍、32倍の8種類の増幅率を設定することができる。
2倍に設定時、ADCの入力電圧範囲は0~33V/2(16.5V)であり、1V/div×10div=10Vから、ゲイン2倍の時、入力の電圧設定値は1V/divとなる。
同様に、各倍率の電圧設定値は下表のようになる。

倍率入力範囲入力範囲[V]/10[div]入力電圧設定値
1倍0~33V3.3[V/div]2[V/div]
2倍0~16.5V1.65[V/div]1[V/div]
4倍0~8.25V.825[V/div]0.5[V/div]
5倍0~6.6V0.66[V/div]0.5[V/div]
8倍0~4.125V0.4125[V/div]0.2[V/div]
10倍0~3.3V0.33[V/div]0.2[V/div]
16倍0~2.0625V0.20625[V/div]0.2[V/div]
32倍0~1.03125V0.103125[V/div]0.1[V/div]

上の表から、2[V/div]時:1倍の倍率、1[V/div]:2倍の倍率、0.5[V/div]:5倍、0.2[V/div]:16倍、0.1[V/div]:32倍の設定が最適となる。

mcp6s2x

OPアンプの出力は、PIC32MZ-DAのADCに入力する。
チャネル1(CH1)の出力信号は、AN0、AN1、AN47、AN48に入力する。
チャネル2(CH2)の出力信号は、AN2、AN3に入力する。
ADCの変換スピード5k[Sample/Sec]~2.5M[Sample/Sec]の時,CH1はAN0(ADC0)、CH2はAN2(ADC2)でAD変換を行う。
ADCの変換スピード5M[Sample/Sec]~6.25M[Sample/Sec]の時,CH1はAN0(ADC0)とAN1(ADC1)、CH2はAN2(ADC2)とAN3(ADC3)で2つのADCでインターリーブAD変換を行う。
CH1のみの測定時、AN0(ADC0),AN1(ADC1),AN47(ADC2),AN48(ADC3)の4つを使用しインターリーブADCを行う。
詳細は 後で説明する。

周波数測定は、CH1入力ではAN1に接続されているコンパレータCMP2でデジタル信号に変換され、Timer6/7とIC7に入力される。
ダイレクト周波数カウントでは、内部タイマーで1Secのゲート時間を生成し、Timer6/7を有効にし、入力信号をカウントする。
レシプロカルカウントでは、IC7で入力信号の周期をを測定し、逆数をとることにより入力周波数を求める。
同様にCH2入力ではAN2に接続されているコンパレータCMP1でデジタル信号に変換され、Timer4/5とIC2に入力され周波数を求める。
  

オシロスコープ・タイミング生成(1Div=50dotとする。T3CK=50MHz)

ADCクロック(1/Tad)は、データーシートより 160kHz(6250nSec)<Fad(1/Tad)<50MHz(20nSec)である。12bitADCの処理には16Tadを要する。これからADCクロック(1/Tad)は、トリガークロックの20倍の値として設計する。ただし上記のデーターシートからのFad(1/Tad)の仕様内とする。

測定範囲(Hz)Time/DivTime/dotサンプリングトリガー
(PR3)
OCCONCLKDIVADCクロック (ADCxDIV)
10-10010mSec0.2mSec5kHz
(50point)

10000-1
40MHz(4)160kHz(250)
20-2005mSec0.1mSec10kHz
(50point)

5000-1
40MHz(4)200kHz(200)
50-5002mSec40uSec25kHz
(50point)

2000-1
40MHz(4)500kHz(80)
100-1k1mSec20uSec50kHz
(50point)

1000-1
40MHz(4)1MHz(40)
200-2k0.5mSec10uSec100kHz
(50point)

500-1
40MHz(4)2MHz(20)
500-5k0.2mSec4uSec250kHz
(50point)

200-1
40MHz(4)5MHz(8)
1k-10k0.1mSec2uSec500kHz
(50point)

100-1
40MHz(4)10MHz(4)
2k-20k50uSec1uSec1MHz
(50point)

50-1
40MHz(4)20MHz(2)
5k-50k20uSec0.4uSec2.5MHz
(50point)

20-1
100MHz(1)50MHz(2)
10k-100k10uSec0.2uSec5MHz
(50point)
2.5MHz*2
20-1
20/2100MHz(1)50MHz(2)
20k-200k5uSec0.1uSec10MHz
(25point)
2.5MHz*2
20-1
20/2100MHz(1)50MHz(2)
50k-500k2uSec40nSec25MHz
(12.5point)
3.125MHz*2
16-1
16/2100MHz(1)50MHz(2)
100k-1M1uSec20nSec50MHz
(6.25point)
3.125MHz*2
16-1
16/2100MHz(1)50MHz(2)

・20uSec/Div以下のの測定では、サンプリング周波数が2.5MHzでADCの最大変換速度3.125Msps以下なので 1つのADCを用いてAD変換処理を行う。
・10uSec/Divの測定では、サンプリング周波数が5MHzでADCの最大変換速度3.125Msps以上なので 2つのADCを用い(3.125Msps*2=6.25Msps)てAD変換処理を行う。
・5uSec/Divの測定では、サンプリング周波数が10MHzで2つのADCの最大変換速度(3.125Msps*2=6.25Msps)以上なので サンプリングポイントを半分の25ポイントとしてAD変換処理を行う。不足データーは、隣接するデーターから補間する。
・2uSec/Divの測定では、サンプリング周波数が25MHzで2つのADCの最大変換速度(3.125Msps*2=6.25Msps)以上なので サンプリングポイントを1/4の12.5ポイントとしてAD変換処理を行う。不足データーは、隣接するデーターから補間する。
・1uSec/Divの測定では、サンプリング周波数が50MHzで2つのADCの最大変換速度(3.125Msps*2=6.25Msps)以上なので サンプリングポイントを1/8の6.25ポイントとしてAD変換処理を行う。不足データーは、隣接するデーターから補間する。

FFT・タイミング生成(2048ポイントFFT, T3CK=20.48MHz)

測定範囲(Hz)最小分解周波数(Hz)トリガー
(PR3)
CONCLKDIVADCクロック (ADCxDIV)
1-1024Hz1Hz1024Hz
(20000-1)
40MHz(4)160kHz(250)
10-10.24kHz10Hz10.24kHz
(2000-1)
40MHz(4)200kHz(200)
100-102.4kHz100Hz102.4kHz
(200-1)
40MHz(4)2MHz(20)
1k-1.024MHz1kHz1.024MHz
(20-1)
40MHz(4)20MHz(2)

レジスタ表

SDRAM初期化

DDR SDRAMの初期化を実行するには、次の手順が必要です。


1.電源を入れてDDRクロックを開始します。
初期化コマンドを送信する前にDDRクロックは最低200µsの間安定している必要があります。

2.DDRCMD1xおよびDDRCMD2xレジスタを次のシーケンスでプログラムします。
コマンド:
a)リセット後にCKEをハイにし、NOPまたはDESELECTコマンドを使用して400ns待機します。
b)Precharge AllBanksコマンドを発行します。
c)拡張モードレジスタ2(EMR2)を初期化します。
d)拡張モードレジスタ3(EMR3)を初期化します。
e)拡張モードレジスタ(EMR)に書き込んでDLLを有効にします。
f)モードレジスタ(MR)に書き込んでDLLをリセットします。
g)Precharge AllBanksコマンドを発行します。
h)2つの自動更新コマンドを発行します。
i)DLLをリセットせずにMRを再プログラムします。
j)OCDのデフォルトでEMRを再プログラムします。
k)OCD出口でEMRを再プログラムします。

3.コマンドの数をNUMHOSTCMDS(DDRCMDISSUE <3:0>)に書き込みます。

4. VALIDビット(DDRCMDISSUE <4>)を設定します。

5. STINITビット(DDRMEMCON <0>)を設定します。

6. VALIDビット(DDRCMDISSUE <4>)がハードウェアによってクリアされるのを待ちます。

7. INITDNビット(DDRMEMCON <1>)をセットして、コントローラーを使用可能にします。

8.これで、DDRSDRAMは通常の操作の準備ができました。


グラフィックLCD(GLCD)コントローラ

下記の19のレジスタでGLCDコントローラを設定する。

  • GLCDMODE:グラフィックLCDコントローラモードレジスタ
    • LCDEN:LCDコントローラモジュール イネーブルビット 1:有効  0:無効
    • DEPOL:DE極性ビット 1:極性を反転する  0:極性を反転しない
    • PCLKPOL:画素クロック出力極性ビット 1:クロック出力を反転する  0:反転しない
    • PGRAMPEN:パレットカンマランプ イネーブルビット  1:有効  0:無効
    • RGBSEQ:RGBシーケンシャルモード 7:BT656  6:YUYV  0:パラレルRGB(RGB888、RGB666、RGB332)
  • GLCDCLKCON:グラフィックLCDコントローラ クロック制御レジスタ
  • GLCDBGCOLOR:グラフィックLCDコントローラ 背景色レジスタ
  • GLCDRES:グラフィックLCDコントローラ 分解能レジスタ
    • RESX:X方向の表示クロック数を設定します(例:640、800)
    • RESY:Y方向の表示ライン数を設定します(例:480、600)
  • GLCDFPORCH:グラフィックLCDコントローラ フロントポーチレジスタ
    • FPORCHX:HSYNCまでのクロック数を設定します(例:640+10クロック、800+20クロック)
    • FPORCHY:VSYNCまでのライン数を設定します(例:480+10ライン、600+20ライン)
  • GLCDBLANKING:グラフィックLCDコントローラ ブランキングレジスタ
    • BLANKINGX:HSYNCの幅をクロック数で設定します(例:640+10+5クロック,800+20+5クロック)
    • BLANKINGY:VSYNCの幅をライン数で設定します(例:480+10+5ライン,600+20+5ライン)
  • GLCDBPORCH:グラフィックLCDコントローラ バックポーチレジスタ
    • BPORCHX:1Hの幅をクロック数で設定します(例:640+10+5+15クロック=670,800+20+5+15クロック=830)
    • BPORCHY:1Vの幅をライン数で設定します(例:480+10+5+25ライン=520,600+20+5+25ライン=640)
  • GLCDCURSOR:グラフィックLCDコントローラ カーソルレジスタ
  • GLCDLxMODE:グラフィックLCDコントローラ レイヤ「x」モードレジスタ
    • LAYERN:レイヤイネーブルビット  1:レイヤを有効にする  0:無効にする
    • COLORMODE:カラーモードビット  12:RGB888  5:RGB565  4:RGB332
  • GLCDLxSTART:グラフィックLCDコントローラ レイヤ「x」開始レジスタ(x=0~2)
    • STARTX:X座標レイヤ開始位置ビット(画素オフセット)
    • STARTY:Y座標レイヤ開始位置ビット(画素オフセット)
  • GLCDLxSIZE:グラフィックLCDコントローラ レイヤ「x」サイズレジスタ(x=0~2)
    • STARTX:X座標レイヤサイズビット
    • STARTY:Y座標レイヤサイズビット
  • GLCDLxBADDR:グラフィックLCDコントローラ レイヤ「x」ベースアドレスレジスタ(x=0~2)
    • BASEADDR:フレームバッファ ベースアドレス
  • GLCDLxSTRIDE:グラフィックLCDコントローラ レイヤ「x」ストライドレジスタ(x=0~2)
    • STRIDE:レイヤ ストライドビット(ラインの間隔をバイト数で指定します)
  • GLCDLxRES:グラフィックLCDコントローラ レイヤ「x」分解能レジスタ(x=0~2)
    • RESX:レイヤ「x」のX方向の表示クロック数を設定します(例:640、800)
    • RESY:レイヤ「x」のY方向の表示ライン数を設定します(例:480、600)
  • GLCDINT:グラフィックLCDコントローラ 割り込みレジスタ
  • GLCDSTAT:グラフィックLCDコントローラ ステータスレジスタ
  • GLCDCLUTx:グラフィックLCDコントローラ グローバル色変換ルックアップテーブルレジスタ(x=0~255)
  • GLCDCURDATAx:グラフィックLCDコントローラ カーソルデータ「n」レジスタ(n=0~127)
  • GLCDCURLUTx:グラフィックLCDコントローラ カーソルLUTレジスタ「x」(n=0~15)

外観図

ERRATA21(内部DDRVref回路が動作していない)対応

  • DDRVref(66ピン)にVDDR1V8/2=1.8V/2=0.9Vを印加する(1kΩ抵抗2本で1.8Vを分割して0.9Vを作る)
  • DDR2初期化の前に、CFGMPLLbits.INTVREFCON = 0; //外部のDDRVref回路を使用する