dsPIC33FJ64GP802 (19) --- 周波数シフター (3)

 前回示したオブジェクト・プログラムでサポートしている

  • 外付け 12.288 MHz 水晶振動子を使用した回路
  • 外付け 16 ビット ADC を使用した回路

を示します。 ただし、簡単のため、電源の配線など前回の基本回路図で表されている部分は省略し、追加すべき部分についてのみ記述します。
 まず、12.288 MHz の水晶振動子を用いた回路を示します。

 マイコンの水晶発振回路としては、ごく一般的な回路ですが、CLKI (9 番ピン) と CLKO (10 番ピン) との間に 1 MΩ の抵抗が接続されている部分のみが違っています。
 これは、dsPIC3FJ64GP802 のデータシート (DS70292G) のセクション 9.0 「OSCILLATOR CONFIGURATION」の FIGURE 9-1 の脚注に

2: If the Oscillator is used with XT or HS modes, an extended parallel resistor with the value of 1 MΩ must be connected.

とあるためです。
 古いリビジョンのデータシートは見つけられませんでしたが、ひとつ前のリビジョンの「dsPIC33F Family Reference Manual Section 39. Oscillator (Part III)」(DS70216B、2008 年) には 1 MΩ の抵抗の記述がありませんでした。
 現行リビジョンの DS70216C (2010 年) には1 MΩ の抵抗の記述があることから、抵抗がないと特定の条件で発振に問題が生じ、それが抵抗の接続で解決されたのではないかと推測されます。
 サンプル数 = 1 ですが、抵抗なしで試してみても発振しないことはありませんでした。
 「動けばいい」というレベルでは、抵抗なしで発振するならわざわざ抵抗を接続する必要はないと思われます。
 前回示したオブジェクトでは、外付け水晶振動子の周波数は 12.288 MHz の設定ですが、コンパイル時にソースの記述を変更するか、プロジェクト・プロパティーコンパイラ・オプションのマクロ定義で指定するかすれば、周波数を変更することができます。
 12.288 MHz や 24.576 MHz などの 48 kHz サンプリングのディジタル・オーディオ用周波数のほかに、ボーレート・クロック用などに使われていて、それほど特殊でもない周波数について表にまとめました。

水晶振動子
周波数 [MHz]
プリスケール後
周波数 [MHz]
PLL
倍率
秋月 aitendo
4.9152 1.2288 120 O
7.3728 1.8432 80 O
8.1920 2.048 72 O
9.216 2.304 64 O O
9.8404 2.4576 60 O
12.288 3.072 48 O
14.7456 3.6864 40 O
16.384 4.096 36 O
18.432 4.608 32 O
19.6608 4.9152 30 O O
24.576 6.144 24 O O

 「秋月」の欄は、この記事を書いているタイミングで秋月電子通商の web サイトで通販の取り扱いがあることを示し、「aitendo」の欄は aitendo の web サイトで通販の取り扱いがあることを示しています。
 店舗に行って調べたわけではないので、店舗での在庫状況は分かりません。
 昔は秋月で 12.288 MHz の水晶振動子の取り扱いがあったのですが、現在では扱っていないようです。
 これらの周波数では、VCO 周波数 147.456 MHz = 3072 × 48 kHz が誤差なく実現できます。
 dsPIC の水晶発振回路では、発振周波数 10 MHz 以下は「XT」モード、10 MHz 以上では「HS」モードで動作させる必要があります。
 その指定はコンフィギュレーションレジスタで行われ、変更できるのはプログラム書き込み時のみであり、プログラム実行時に変更することはできません。
 前回のオブジェクトは 12.288 MHz の水晶振動子に対する設定となっており、当然、「HS」モードでの動作となっています。
 10 MHz 以下の水晶振動子で動作させる場合には、コンフィギュレーションを「XT」に変更してプログラムを書き込む必要があります。
 プログラムでは、次の手順で水晶振動子が接続されていることの判断を行っています。

  • まず FRC (Fasr RC) オシレータ・モードで起動
  • PRI osc (外部水晶発振) への切り替えを試行
  • 約 2 ms 経過後も切り替わらない場合には外部水晶なしと判断し、FRC のモードで PLL を設定
  • PRI osc に切り替わったら外部水晶発振モードとして PLL を設定

 次は、外付け AD コンバータの回路を PCM1808 の場合について示します。

 電源のデカップリング・コンデンサおよびアナログ入力の DC カットのためのコンデンサのみです。
 ディジタル部の電源 (VDD) に +3.3 V、アナログ部の電源 (VCC) に +5 V の、2 電源が必要です。
 「シグナル・コンディショニング」のための回路は含んでおらず、コンデンサで DC をカットして AD 入力へ 3 VP-P 以下の信号を直接入力する場合を想定しています。
 PCM1808 はステレオ ADC ですが、周波数シフターとしては片方のチャネルのみ使用します。
 L / R どちらを使うかはプログラムのコンパイル時に指定可能です。
 回路的には L ch / R ch 両方に入力をつないであるので、どちらを読み取っても構わないようになっています。
 また、PCM1808 は 24 ビット分解能の ADC ですが、dsPIC33F64GP802 の DSP は 16 ビット・データ対応なので、24 ビットデータの上位 16 ビットのみを読み込んでいます。  
 ディジタル・オーディオ・インターフェースのフォーマットは、

  • マスタークロックは 256 fs
  • I2S フォーマット
  • チャネル当たり 32 クロック、ステレオ・フレーム当たりで 64 クロック

になっています。
 プログラムのコンパイル時に I2S から「左詰め」フォーマットに変更することが可能です。
 これらの条件を満たせば、PCM1808 以外の ADC も使えます。 ただし、PCM1808 以外の ADC でのテストはしていません。
 PCM1808 の FMT/MD1/MD0 の設定で出力フォーマット、動作モードが決定されます。 プルダウン抵抗を内蔵しており、「オープン」にすると「0」を入力したものと見なされます。
 FMT = 0 が I2S モードの選択、MD1:MD0 = 0:0 がスレーブ・モードの選択なので、FMT/MD1/MD0 はオープン (未接続) でかまいません。
 内蔵 ADC を使うモードと、外付け ADC を使うモードの切り替えは、プログラムの最初の部分で DCI (Data Converter Interface) を通じて読み取ったデータで判別しています。
 ADC データ出力を読み込む RB2 (6 番ピン) は内部プルアップしてあるので、外部 ADC を接続せずオープンになっている場合には DCI を通じて読み取るデータは、L/R 共に常に 0xFFFF となっています。
 一方、PCM1808 は電源投入後 8960/fS = 187 ms の間、出力をゼロ・ミュートするので、DCI を通じた読み出しでは 0x0000 が連続して読まれることになります。
 プログラムでは、32 サンプル分の L ch / R ch データ、つまり 64 個の連続するデータがすべて 0xFFFF の場合に外部 ADC なしと判断しています。