CH32V003 には 24MHz の RC 発振器が内蔵されています。とある作品を作っている中で、この周波数が結構揺れる(短時間で上下する)のではないかと思う現象に出会ったため、確かめてみました。
私の当初の認識では、内蔵 RC 発振器の周波数には個体差があるけれども、特定の個体に関して動作中にゆらゆらと周波数が変わるとは思っていませんでした。しかし、今回の実験を通して、かなり頻繁に周波数が揺れ動くことを知りました。周波数の安定が求められる用途では、外付けの水晶振動子などを使う方が良さそうです。
周波数安定度を測る方法を考えます。一番安直なのは、クロックをそのままロジックアナライザで記録し、パルス幅の変化を見る方法です。ただ、これは手元のロジックアナライザの最大サンプリングレートが 400MHz なので、うまく測れません。24MHz のクロックのデューティ比を 50% とするとパルス幅は 20.83ns です。一方、400Mhz でサンプリングすると分解能は 2.5ns となります。20.83ns のパルスの微小な変化を捉えるのに、分解能が 2.5ns では粗すぎます。
そこで、マイコンからある程度長い幅のパルスを何度も出力し、そのパルスの幅を測って比べることにしました。理想的にはすべてのパルスが同じ幅になるはずですが、周波数が揺れ動くとパルス幅が変わるはずです。
この方法は RC 発振器の不安定さをより良く観測できる可能性があります。なぜなら、マイコン内蔵 RC 発振器の周波数が揺れる原因がマイコン自身の発熱だとすれば、それには時間的局所性があると考えられるからです。温度というものはサイコロの出目のようにランダムに変わるのではなく、ある程度滑らかに変化します。あるクロックパルスの直後のクロックパルスはほとんど周期が変わらず、そこから時間が経つにつれてだんだんと周期が変化するということです。したがって、1 クロックごとにパルス幅を測定するより、ある程度の時間幅で測定することで、影響が積算され、観測しやすくなると思いました。
TIM1 を PWM モードに設定し、周期 2000、パルス幅 1000 で動かします。クロックが 24MHz で、PLL で 2 倍にしたものを TIM1 に供給しているため、次のような計算になります。
TIM1 の CH4(PD3)にパルスを出力し、ロジックアナライザで観測します。ロジックアナライザのサンプリングレートは最大の 400MHz に設定します。サンプリング期間は 671ms です。これは 400MHz 設定時の最長期間です。計算上、サンプリング期間中に 16104 個のパルスが発生します。
実験には CH32V003F4P6 の評価ボード「CH32V003F4P6-EVT-R0」を使いました。以前 AliExpress で購入した 評価ボード、書き込み器、マイコン単品のセット に含まれている評価ボードです。
この評価ボードには、マイコン外付けの 24MHz 水晶振動子も付いていて、今回はそちらも使って比較実験を行いました。内蔵 RC 発振器に比べてどれだけ精度が良いか、実験結果をご覧ください。
内蔵 RC 発振器での実験結果を次に示します。
グラフの横軸は経過時間です。サンプリング時間が 671ms なので、0.7 秒手前までのグラフになっています。
グラフの縦軸はパルス幅です。理想値 20.833μs に対し、20.69μs 程度と、少し短いです。これはクロックが 24MHz より速いことを意味します。パルス幅の比較ですが、理想値に対し 0.69% 程度短い計算になります。クロック周波数の範囲が -1.2%~+1.6% ですから、この範囲には収まっています。
グラフが横の縞模様になっています。これは、ロジックアナライザの分解能に起因します。分解能が 2.5ns のため、グラフの縦軸 1 目盛り 0.01μs=10ns は 4 段階でしか測れないのです。したがって、1 目盛あたり 4 本の縞模様になるわけです。
グラフの全体的な形を見ると、ごく短い時間では特定のパルス幅を中心として ±0.015μs に収まる範囲で揺れ動いており、さらに長い周期ではパルス幅の平均値が大きく変動していることが分かります。特に測定開始 0.2 秒程度経ったところでガクッと平均値が下がっているのが特徴的ですね。
さらに 2 回測定してみました。それぞれの結果を示します。縦軸の範囲は先ほどのグラフと同じにしてあります。
20.63μs から 20.72μs の範囲で変動するとすれば、変動幅は 0.09μs です。これは、パルス幅の理想値 20.833μs に対して 0.432% です。クロック数でいえば 4.32 クロック分に相当します。
この変動がどれほど問題になるかはアプリケーションに依存します。L チカ(適当な間隔で LED を点滅させる)であれば全く問題ないでしょう。筆者が作っている作品では、この変動は大変に問題がある値でした。
評価ボード CH32V003F4P6-EVT-R0 に搭載されている 24MHz の水晶振動子を使うように設定し、同様に測定してみました。どのくらい周波数が安定するでしょうか。
いやあ、安定してますね!理想のパルス幅 20.833μs に対し、結果は 20.8350μs と 20.8375μs になりました。少しだけ 24MHz よりも遅いようです。しかし、RC 発振器のような時間経過による周波数の揺れは観測されませんでした。
グラフを見ると 2 本の線のようになっています。これは例によってロジックアナライザの分解能 2.5ns に起因します。線の間隔がまさに 2.5ns になっていますよね。つまり、この測定では水晶振動子の実力が見えてないことになります。きちんと実力を見るには、もっとサンプリングレートの高いロジックアナライザが必要です。
水晶振動子を用いた測定も何度かやったのですが、全部同じグラフになりましたので、割愛します。