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 のパターンを利用して、コンデンサを付加すれば、補正が可能です。