電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

BBDドライバ w/ LFO さらに

BBDドライバ w/ LFO さらに

ATtiny25/45/85内蔵のTimer1を使い、分周器のついた8bitのカウンタをPLLクロック(64MHz)で動かして、15Hz~16MHzまで矩形波生成できることがわかった( はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど)。さらに検討を進める。

前回こんな図面を出した。

とりあえずPCKの分周比とトグルモードのPWMにしてBBDドライブ用のパルスを生成するとこんな感じの周波数になりそうですよ、と。

f:id:Chuck:20110125160403p:image 大きいサイズはこちら はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど

これは分周比をパラメータ(1, 2, 4, 8, 16)にしてOCR1C値(0~255)に対応するクロックパルスの発振周波数をグラフ化したものだ。logスケールで線形となっている。ちなみに分周比はさらに32, 64, ..., 16384 とすることができて、最も分周すると15Hzまで作ることができる(分周比16384)。

グラフの一本化

パラメータ化されたままでは逆関数の定義ができないし扱いづらいので、定義域をひとつに、グラフを一本化した。

入力を 0~4095 の 12bit に範囲拡張して以下のとおり定義域を場合分けしている。

入力範囲 IN 分周比 OCR1C値
0~255 (IN[11:8]=b0000) 1 0~255 = IN[7:0]
256~511 (IN[11:8]=b0001) 2 128~255 = IN[8:1]
512~1023 (IN[11:9]=b001) 4 128~255 = IN[9:2]
1024~2047 (IN[11:10]=b01) 8 128~255 = IN[10:3]
2048~4095 (IN[11]=b1) 16 128~255 = IN[11:4]

これで散布図を描くと以下のようになる。

f:id:Chuck:20110131073422p:image 大きいサイズ

実機でも16MHzまでの発振を確認したが、まぁ、実際使う発振域は 10kHz~1MHz ぐらいでしょう。

ディジタル設定なので得られる値は離散的なものになります。16MHzの次は10.7MHz とか 1MHzの次は969.7kHzとかですね。ある程度OCR1C設定値が大きいほうが値間隔が細かくなります。分周比が1以外のところでは、入力範囲が分周比に応じて飛び飛びになる。例えば1024の次は、ここは分周比が8の領域であり、1032になる。入力範囲は表中のルールで丸められる(510も511も、分周比2、OCR1C値255となる)。

ところで当初使えると思っていたトグルは ATtny25/45/85 の Timer1 の CTC な PWM では使うことが出来ないとわかった。ということで、Fast PWM にせざるを得ないが、これにともなって duty 50% が保証できなくなる。ざっと10kHz~1MHzの範囲で 50%~50.77% になります(duty 最悪値は分周比1、OCR1C=64、OCR1A=32とした984kHz)。これもあまり問題にならないでしょう。CP1 と CP2 が同時にONして、アナログスイッチが筒抜けになることのほうが(音的に)イマイチでしょう。

入力設定値 対 得られる遅延量

クロックパルスの周波数で考えてもピンと来ないので、実際にBBDに適用したときの遅延量(単位 秒)を表してみた。

f:id:Chuck:20110131073424p:image大きいサイズ

入力設定値と得られる遅延量の関係は線形となっていることがわかる。

グラフ中で入力設定値の定義域は16~4095とした。入力設定値16はCPでは2MHzにあたる(その時の遅延量は1.024msec)。入力設定値4095では約260msecの遅延量が得られる。

入力設定値の分解能が最も細かい(分周比が1だから)定義域を16~255とした部分を拡大表示してみると、次の図のとおりとなる。入力設定値255では遅延量は16.32msec となっている。

f:id:Chuck:20110131073423p:image大きいサイズ

得られたグラフの逆写像を利用して、どれだけの遅延量が欲しい時の設定値はいくつにすれば良いか、ということがわかる。

今後は、実際のエフェクトで必要な遅延時間とその変化の度合いを調べ、マイコンで生成できるようマッピングアルゴリズムを考えていく。

ところで精度の話

今回のクロックパルスの生成は ATtiny85 の内蔵PLLに依っている。内部RC発振したものをPLLで逓倍して64MHzが出ているので、温特やら電圧特性やら影響を受けて発振周波数は変化するものと思われる。

ついでに電流値

ICEを接続した debug可能の状態、CPU停止、PLL/PWM系が動いている状況で実測 消費電流は12mAだった。debug可能状態では電流が多めに出るらしいとは聞いているが、現状こんなものということで。いずれ debug wire disabled の状態でも測ってみる。