公開日:2025/12/13
title.png

37th Season


#37-5 SSCGを作る(ふう)

 ATtiny85を使って作成した可変周波数クロック発振器を更に一歩先へ進めるため、SSCG機能を追加している最中です。前回、基本方針〜検討を経て、詳細設計の途中まで終了しましたので、ここから設計を閉じて、機能評価まで走り抜けたい🏃と思います。

プログラム

 可変周波数クロック発振器にSSCG機能を追加したプログラムを以下にリンクします。

  完成プログラム:ti85_vclkgen.ino

 コンパイルしてATtiny85へ書き込んでください。コンパイル&書き込み方法はこちらです。こちらで言及した通り、「millis()/micros():Disabled」を選択しておかないと、コンパイルを失敗します。

OSCCAL−周波数対応表

 今回のSSCGでは、目標周波数を中心として上下に周波数を変動させるため、可変周波数クロック発振器を作った時に生成したOSCCAL−周波数対応表を使います。ところが、この対応表は、OSCCAL=128を境に、不連続な特性です(下図)。

a294_osccal.png

 周波数を上下に変動させる時、この不連続点を跨いでしまうと、周波数の変動特性が歪んだりする影響が考えられます。
 回避不能なので、注意して使ってみてください。

変動させる実験

 今回もATtiny85、Arduino UNO、328duinoを使って実験します。書き込むプログラムも含めて、こちらの実験と同じ装置を組み立ててください(下図)。

a373_expr.jpg

周波数変動の確認

 まず、目標仕様通り、周波数が変動しているかどうか、確かめたいと思います。

  実験サンプル:【 】内はUNOシリアルモニタからの送信データ
  【swr1,2,40,80,02,00】
  OK+ swr1.0c[0x02]=0x40 ……OSCFRQ=8MHz(0x40=(8MHz−4MHz)×16)
  OK+ swr1.0c[0x03]=0x80 ……PLLCSR=÷2分周×8逓倍
  OK+ swr1.0c[0x04]=0x02 ……TCCR1=PCK/2
  OK+ swr1.0c[0x05]=0x00 ……OCR1C=0x00(PWM周期=(0x00+1)×2)
  OK: swr1 4

 クロックCLKO周波数を8MHz÷2分周×8逓倍÷2分周÷(1×2)周期=8MHzに設定しました。

  【swr1,6,64,80】
  OK+ swr1.0c[0x06]=0x64 ……SSDEV=0x64=100=10.0%
  OK+ swr1.0c[0x07]=0x80 ……SSPRD=0x80=128
  OK: swr1 2

  【swr1,0,03】……CMNDID=SSENコマンド
  OK: swr1.0c[0x00]=0x03

 続いて、SSCGを設定して、有効化しました。この設定で、周波数データを取得してみます。

  【eval】
  7804
  7744
  7696
  7655
  :
  : (中略)
  :
  8217
  8255
  8285
  8333
  OK: eval

 取得したデータをExcelで取り込んでグラフ化したのが以下図となります。

a375_8M6480.png

  考察:

 なお当方には、肝心なEMIノイズの評価環境は無いので、EMIノイズについては未評価です。

実践的に変動周期を短くする

 前節の実験では、周波数変動が期待通りに実行されている事を確かめたくて、変動幅や変動周期を極端な(大き目な)数値に設定していました。続いては、より実践的な設定で評価してみたいと思います。

  【swr1,0,04】……CMNDID=SSDEコマンド
  OK: swr1.0c[0x00]=0x04

 SSCG設定を更新するためには、一旦SSCG機能を無効化する必要があります。SSDEコマンド(0x04)を書き込んで、SSCGを無効化しました。

  【swr1,2,c0,80,02,00,28,30】
  OK+ swr1.0c[0x02]=0xc0 ……OSCFRQ=16MHz(0xc0=(16MHz−4MHz)×16)
  OK+ swr1.0c[0x03]=0x80 ……PLLCSR=÷2分周×8逓倍
  OK+ swr1.0c[0x04]=0x02 ……TCCR1=PCK/2
  OK+ swr1.0c[0x05]=0x00 ……OCR1C=0x00(PWM周期=(0x00+1)×2)
  OK+ swr1.0c[0x06]=0x28 ……SSDEV=0x28=40=4.0%
  OK+ swr1.0c[0x07]=0x30 ……SSPRD=0x30=48
  OK: swr1 6

  【swr1,0,03】……CMNDID=SSENコマンド
  OK: swr1.0c[0x00]=0x03

 出力クロックCLKO周波数を16MHz÷2分周×8逓倍÷2分周÷(1×2)周期=16MHz、SSCGを変動幅=4%、変動周期=48に設定しました。
 【eval】コマンドで取得したデータをグラフ化すると、以下図となりました。

a375_16M2830.png

  考察:

UART通信は破綻しないか?

 前節の16MHz&SSCGクロック駆動の状態で、328duinoにUSB⇔UART変換モジュール(FTDI、下図)を接続して、問題なくUART通信が実行できる事を確認済みです。

ar41_ftdi.jpg

 8N1形式のUARTが失敗しないギリギリの変動幅≒10%に対して、SSDEV=4%、実測値=約3.5%の余裕があり、この程度は問題なく通信できてくれないと駄目なのですけどね。実物の動作で確認できましたので、想定外の事態は発生していない様です。Good。


 自作したSSCGの動作を確認できました。完成です。手元にEMIノイズを評価可能な装置が無いので、肝心なEMIノイズの評価はできませんが、設計通りの周波数変動を確認することができました。個人の実験としてはこれが限界でしょうね……。やり切りました。


btn_arduino.png

btn_prev.png btn_next.png

home