STM32F4-Discovery 用FM音源プログラム -- TGSTM32F4 (8)

STM32F4-Discovery の STM32F4 側の 8 MHz の水晶振動子 (X2) を取り外してソケットを実装し、水晶振動子を差し替えられるようにして 12.096 MHz での I2S の各種サンプリング周波数を測定してみました。
その結果、当然ですが、サンプリング周波数の相対誤差は測定誤差以内でゼロと見なせることが確認できました。
しかし、当初は 12 MHz の水晶に差し替えたのに発振周波数は 8 MHz のまま変化しないという現象に見舞われました。
さらには、水晶を挿していないのに 8 MHz が出力されるありさまです。
これは、ボードの回路上で ST-LINK 側の STM32F103 が、いわば「外部水晶発振器」として使われていて、X2 の水晶振動子は単なる「飾り」にしかなっていないためと分かりました。
STM32F4-Discovery のユーザ・マニュアル (UM1472) のクロックまわりの回路を抜き出して書いたのが下の図です。

ST-LINK 側の STM32F103 の MCO (Microcontroller Clock Output) 出力が 100 Ω の抵抗 R68 を介してSTM32F407 の OSC IN ピンに接続されています。 (C61 は実装されていません)
ST-LINK 側のファームウェアでは MCO/PA8 端子から HSE クロックである 8 MHz が出力されている設定になっているようで、STM32F407 に接続されている 8 MHz 水晶 (X2) の影響は、ほぼ無視され、ST-LINK 側 の 8 MHz 水晶 (X1) の発振出力で強制的にドライブされています。
そこで、R68 を取り外して ST-LINK 側からのクロック注入を遮断してみると STM32F4 側の水晶 (X2) で正常に発振するようになりました。
こうして、水晶振動子の差し替えが有効になった状態で、SPI/I2S モジュールのサンプリング周波数を測定してみました。
使っている周波数カウンタは、かなり昔の秋月のキットを組み立てたもので、本体の LSI (ICM7216) では 10 MHz 程度までしか測定できません。
この制限のもとで、なるべく多くの桁数を確保するために、32 fs となるシリアル・クロック (I2S_SCK) を測定しました。
22.05 kHz から 96 kHz までのディジタル・オーディオで良く使われるサンプリング周波数と、理論上のサンプリング周波数誤差が、2 種類の HSE のいずれに対しても「ゼロ」になる 60 kHz に対して測定しました。
まず、水晶振動子の周波数が 8 MHz (デフォルトの状態) の場合の測定結果を下の表に示します。
HSE = 8000000

目的 fs
[Hz]
SCK (32 fs)
測定値[kHz]
実 fs
計算値[Hz]
誤差
[ppm]
相対
誤差[ppm]
理論上の
誤差[ppm]
22050   705.6353 22051.103   50.03 -11.17 -11.19
32000 1024.1010 32003.156   98.63   37.43   37.56
44100 1411.5445 44110.766 244.12 182.92 183.04
48000 1535.8083 47994.009 -124.8 -186.00 -186.01
60000 1920.1175 60003.672   61.2   0     0.00
88200 2823.0899 88221.559 244.44 183.24 183.06
96000 3071.6183 95988.072 -124.25 -185.45 -186.01

第 4 カラムの周波数誤差の値は、周波数カウンタ側の絶対誤差と、STM32F4 ボードの水晶振動子 (X2) の初期周波数偏差を含みます。
第 5 カラムの「相対誤差」は、理論上のサンプリング周波数誤差がゼロになる 60 kHz での誤差を強制的にゼロと見なして、そこからのズレとして相対値で表現したものです。
最終カラムは周波数誤差の理論値を表しており、第 5 カラムの相対誤差の値と比較すると、その違いは 1 ppm 以下であり、測定誤差内で一致していると言えると思います。
次は X2 として 12.096 MHz の水晶振動子を使った場合の結果です。
HSE = 12096000

目的 fs
[Hz]
SCK (32 fs)
測定値[kHz]
実 fs
計算値[Hz]
誤差
[ppm]
相対
誤差[ppm]
理論上の
誤差[ppm]
22050   705.6783 22052.447 110.97  0.4   0.00
32000 1024.1136 32003.550 110.94  0.36   0.00
44100 1411.3562 44104.881 110.69  0.11   0.00
48000 1536.1697 48005.303 110.48 -0.09   0.00
60000 1920.2123 60006.634 110.57   0   0.00
88200 2822.7112 88209.725 110.26 -0.31   0.00
96000 3072.3389 96010.591 110.32 -0.25   0.00

第 4 カラムの周波数誤差 (周波数カウンタの絶対誤差 + 水晶振動子の初期周波数偏差) は、すべて 110 ppm 程度になっています。
第 5 カラムの相対誤差と、最終カラムの理論誤差の違いは 1 ppm 以下であり、これも、測定誤差範囲内で、すべて一致していると見なせます。
つまり、X2 として 12.096 MHz の水晶振動子を使えば、ソフトウェア上の対応は必要ですが、ディジタル・オーディオで良く使われるサンプリング周波数に対して、初期周波数偏差以外の定常的な周波数誤差原因はないと言えます。
初期周波数偏差については、周波数が高い側に偏っている場合には、未実装の C61 のパターンを利用して、コンデンサを付加すれば、補正が可能です。