STM32F4-Discovery 用FM音源プログラム -- TGSTM32F4 (7)
HSE クロックの水晶振動子の周波数を 12.096 MHz に選ぶと、SYSCLK 168 MHz、USB クロック 48 MHz ジャストを維持したままで、I2S のサンプリング周波数の大部分を誤差ゼロで実現できることが分かりました。
(システム) PLL および PLLI2S のリファレンス周波数は、通常の 1 MHz ではなく、
HSE_VALUE / PLL_M = 12.096 [MHz] / 9 = 1.344 [MHz]
となります。 (PLL_M = 9)
ここで、PLL_N = 250、PLL_P = 2、PLL_Q = 7 と選ぶと、
fVCO = 1.344 [MHz] × PLL_N = 1.344 [MHz] × 250 = 336 [MHz]
SYSCLK = fVCO / PLL_P = 336 [MHz] / 2 = 168 [MHz]
USBCLK = fVCO / PLL_Q = 336 [MHz] / 7 = 48 [MHz]
また、RTC モジュールへのクロックとして、HSE クロックを整数分の 1 に分周して供給する場合にも、誤差が生じることはありません。
MCLK を生成する条件での、各種のサンプリング周波数に対する PLL_N、PLL_R、I2SDIV、I2SODD および誤差の表を下に示します。 (3 月 6 日追記: 表を差し替えました)
HSE_VALUE = 12096000, PLL_M = 9, PLL_REF_CLK = 1.344000 MHz Target PLL PLL I2S I2S Real error I2SCLK fs [Hz] N R DIV ODD fs [Hz] [ppm] [MHz] -------- --- --- --- --- ------------ --------- ---------- 6000 192 7 12 0 6000.00000 0.00 36.8640 8000 192 7 9 0 8000.00000 0.00 36.8640 11025 210 5 10 0 11025.00000 0.00 56.4480 12000 192 7 6 0 12000.00000 0.00 36.8640 16000 192 7 4 1 16000.00000 0.00 36.8640 22050 210 5 5 0 22050.00000 0.00 56.4480 24000 192 7 3 0 24000.00000 0.00 36.8640 32000 256 7 3 0 32000.00000 0.00 49.1520 40000 320 7 3 0 40000.00000 0.00 61.4400 44100 210 5 2 1 44100.00000 0.00 56.4480 45000 240 7 2 0 45000.00000 0.00 46.0800 48000 192 3 3 1 48000.00000 0.00 86.0160 49516 283 6 2 1 49525.00000 181.76 63.3920 49716 303 4 4 0 49710.93750 -101.83 101.8080 49749 199 3 3 1 49750.00000 20.10 89.1520 50000 200 3 3 1 50000.00000 0.00 89.6000 60000 240 3 3 1 60000.00000 0.00 107.5200 64000 256 3 3 1 64000.00000 0.00 114.6880 81000 216 2 3 1 81000.00000 0.00 145.1520 88200 252 3 2 1 88200.00000 0.00 112.8960 96000 256 2 3 1 96000.00000 0.00 172.0320 100000 305 4 2 0 100078.12500 781.25 102.4800 107000 204 2 2 1 107100.00000 934.58 137.0880 110000 314 3 2 1 109900.00000 -909.09 140.6720 120000 274 3 2 0 119875.00000 -1041.67 122.7520 128000 195 2 2 0 127968.75000 -244.14 131.0400 160000 244 2 2 0 160125.00000 781.25 163.9680 168000 256 2 2 0 168000.00000 0.00 172.0320 176400 269 2 2 0 176531.25000 744.05 180.7680 187250 285 2 2 0 187031.25000 -1168.22 191.5200 187500 285 2 2 0 187031.25000 -2500.00 191.5200
(3 月 6 日追記: PLLI2S のリファレンス周波数が 1.34 MHz に上がったことにともなう VCO 出力周波数の上限の制限がプログラムで正しく考慮されていなかったのを修正し、表を差し替え、以下の記述にも変更を加えました。)
1 kHz から 81 kHz までの、1 kHz ステップでの各サンプリング周波数に対して誤差が正確にゼロになり、当然、ディジタル・オーディオで使う 32 kHz、48 kHz、96 kHz も含まれます。 (41 kHz、43 kHz、44 kHz、46 kHz、47 kHz を除きます)
また、ディジタル・オーディオで使う 11.025 kHz、22.05 kHz、44.1 kHz、88.2 kHz に対しても誤差は正確にゼロになります。
FM 音源チップのサンプリング周波数である 49 kHz 台では、誤差ゼロとはなりませんが、20 〜 200 ppm 程度の誤差におさえられています。
44.1 kHz の 4 倍の 176.4 kHz では 750 ppm 程度の誤差が生じます。
また、48 kHz の 4 倍の 192 kHz は、I2SCLK の周波数制限 (192 MHz) のために、実現できません。
PLL のリファレンス周波数を 1 MHz に選んだ場合、実現できる最大サンプリング周波数はスペック上 187.5 kHz となりますが、HSE クロック周波数を 12.096 MHz に選んだ場合は、誤差ゼロで実現できる kHz 単位で切りのいい値の最大サンプリング周波数は、それより低い 168 kHz になります。
HSE を分周したもの (HSE_RTC) を RTC_CLK として使う場合も、分周比が 1/22 および 1/26 以外の 12 以上 30 以下の偶数の場合に対して 12.096 MHz が割り切れ、RTC モジュール内での 1 Hz クロック生成に対して誤差が出ません。
12.096 MHz という周波数の水晶振動子は、たとえば、秋月で扱われるほどメジャーなものではありませんが、非常に特殊というわけではなく、Digi-Key から購入できますし、「サトー電気」で HC49US タイプの物が 1 個 126 円という「普通」の価格で売られています。
ただし、サトー電気では、表面実装型の 12.960 MHz の水晶振動子を安く (単価 53 円) 売っているので間違えないように注意してください。
12.960 MHz でも、11.025 kHz から 96 kHz までのディジタル・オーディオ用サンプリング周波数は誤差ゼロで実現できますが、SYSCLK と USB クロックは都合の良い値になりません。
私の場合は、すでに使用しなくなった DVD 再生用 MPEG2 カードから取り外した 12.096 MHz の水晶振動子を使って試してみようと思っています。
HSE クロック周波数を変えると、当然、スタートアップ・ルーチン内の PLL 設定部分の変更と、ライブラリに対する HSE_VALUE の定義の修正が必要になります。