PC32MKの内蔵ADCを利用し100Mspsを実現する.

トリガー位置から10nSecずつずらしながら 10Msps(100nSe)のサンプリングを 10回行うことにより、相対的に100Mspsを実現する。

アナログ入力部ブロック図

PIC32M_MX064_LCD

PIC32MK_MX064_LCD_PCB

ADC DMA

PIC32MKのADCモジュールには、AD変換した結果を自動的にメモリにストアするDMA機能を専用で持っています。ADCモジュールは、AD変換されたデータをBufferAにまず格納し、予め設定されたシステムRAMバッファ長に達すると、自動的のBufferBにデータを格納します。

この機能を利用して、AD変換をした結果をメモリーへ自動で転送します。

専用DMAの設定では、ADC変換したデータを何ワードメモリにストアするかを予め設定する必要があります。ADCON1レジスタのDMABL(システムRAMバッファ長)で行います。また、ADCデータを格納するメモリの先頭アドレスをADCDMABに、メモリのどこまでがデータが格納されているかを示すサンプリングカウント数を格納するメモリの先頭アドレスをADCCNTBに設定します。

今回は、システムRAMバッファ長を128ワードに設定し、 ADCデータを格納するメモリの先頭アドレスを adc_dma_buffer, サンプリングカウント数を格納するメモリの先頭アドレス adc_sampling_countとし、 ADC0からADC4まで、5つのADCモジュールを、インターリーブ方式で使用しています。 下の表のようにAD変換されたデータが格納されます。

AD変換されたデータは、上の表のadc_dma_buffer[0]~adc_dma_buffer[1279]に格納されています。ただし、ADC0からADC4をインターリーブ方式でサンプリング/AD変換を行っていますので、データの格納順番が少し複雑です。

時系列的に整列された配列をadc_buff[n]とすると、下図のようにadc_dma_buffer[m]のデータを下の式でadc_buff[n]に移動します。

1)ADC0 0<=m<256 adc_buff[m×5]=adc_dma_buffer[m]

2)ADC1 256<=m<512 adc_buff[(m-256)×5+1]=adc_dma_buffer[m]

3)ADC2 512<=m<768 adc_buff[(m-512)×5+2]=adc_dma_buffer[m]

4)ADC3 512<=m<1024 adc_buff[(m-768)×5+3]=adc_dma_buffer[m]

5)ADC4 1024<=m<1280 adc_buff[(m-1024)×5+4]=adc_dma_buffer[m]

通信フロー制御

  • STX(0x02) テキスト開始
  • ETX(0x03) テキスト終了
  • ACK(0x06) 受信OK
  • NAK(0x15) 受信NG
  • DC1(0x11) XON(送信側にデータ送信可を伝える)
  • DC3(0x13) XOFF(送信側にデータ送信不可を伝える)

描画コマンドフロー

描画コマンドエラー

  • 0: エラーなし
  • 1: コマンド名が違う
  • 2: コマンド名が長い
  • 10: 既定の色指定以外の設定がされている
  • 11: 色指定の()がない
  • 20: y軸のコマンド名が長い
  • 21: yの数値が範囲外である
  • 22: yの数値が0~9以外である
  • 30: x軸のコマンド名が長い
  • 31: xの数値が範囲外である
  • 32: xの数値が0~9以外である
  • 40: 半径rのコマンド名が長い
  • 41: rの数値が範囲外である
  • 42: rの数値が0~9以外である
  • 50: フォントの文字列が長すぎる