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が載っています。さらにタッチパネルもついています。
アナログ入力部の設計
アナログ回路(入力部)には、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~33V | 3.3[V/div] | 2[V/div] |
2倍 | 0~16.5V | 1.65[V/div] | 1[V/div] |
4倍 | 0~8.25V | .825[V/div] | 0.5[V/div] |
5倍 | 0~6.6V | 0.66[V/div] | 0.5[V/div] |
8倍 | 0~4.125V | 0.4125[V/div] | 0.2[V/div] |
10倍 | 0~3.3V | 0.33[V/div] | 0.2[V/div] |
16倍 | 0~2.0625V | 0.20625[V/div] | 0.2[V/div] |
32倍 | 0~1.03125V | 0.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倍の設定が最適となる。
mcp6s2xOPアンプの出力は、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/Div | Time/dot | サンプリング | トリガー (PR3) | OC | CONCLKDIV | ADCクロック (ADCxDIV) |
10-100 | 10mSec | 0.2mSec | 5kHz (50point) | ← 10000-1 | ー | 40MHz(4) | 160kHz(250) |
20-200 | 5mSec | 0.1mSec | 10kHz (50point) | ← 5000-1 | ー | 40MHz(4) | 200kHz(200) |
50-500 | 2mSec | 40uSec | 25kHz (50point) | ← 2000-1 | ー | 40MHz(4) | 500kHz(80) |
100-1k | 1mSec | 20uSec | 50kHz (50point) | ← 1000-1 | ー | 40MHz(4) | 1MHz(40) |
200-2k | 0.5mSec | 10uSec | 100kHz (50point) | ← 500-1 | ー | 40MHz(4) | 2MHz(20) |
500-5k | 0.2mSec | 4uSec | 250kHz (50point) | ← 200-1 | ー | 40MHz(4) | 5MHz(8) |
1k-10k | 0.1mSec | 2uSec | 500kHz (50point) | ← 100-1 | ー | 40MHz(4) | 10MHz(4) |
2k-20k | 50uSec | 1uSec | 1MHz (50point) | ← 50-1 | ー | 40MHz(4) | 20MHz(2) |
5k-50k | 20uSec | 0.4uSec | 2.5MHz (50point) | ← 20-1 | ー | 100MHz(1) | 50MHz(2) |
10k-100k | 10uSec | 0.2uSec | 5MHz (50point) | 2.5MHz*2 20-1 | 20/2 | 100MHz(1) | 50MHz(2) |
20k-200k | 5uSec | 0.1uSec | 10MHz (25point) | 2.5MHz*2 20-1 | 20/2 | 100MHz(1) | 50MHz(2) |
50k-500k | 2uSec | 40nSec | 25MHz (12.5point) | 3.125MHz*2 16-1 | 16/2 | 100MHz(1) | 50MHz(2) |
100k-1M | 1uSec | 20nSec | 50MHz (6.25point) | 3.125MHz*2 16-1 | 16/2 | 100MHz(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) | CONCLKDIV | ADCクロック (ADCxDIV) |
1-1024Hz | 1Hz | 1024Hz (20000-1) | 40MHz(4) | 160kHz(250) |
10-10.24kHz | 10Hz | 10.24kHz (2000-1) | 40MHz(4) | 200kHz(200) |
100-102.4kHz | 100Hz | 102.4kHz (200-1) | 40MHz(4) | 2MHz(20) |
1k-1.024MHz | 1kHz | 1.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回路を使用する