電音の工場ブログ

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

当ブログは…

平日の 8pin AVR LFO

昨日から勢いがついて、平日も帰宅後にいじっていた。

昨日までに、

  • timer0でそれっぽい動作をさせてみた
  • A/D変換を動かしてパラメータ算出部の動作確認

ができていたので、さらに、

  • PWMを実際に動かしてみた
    • ポートの波形で見て、パルス幅(16μsec周期)がみょんもにょん と変化することを確認
  • 周波数ツマミを動かしてみよんもにょんの変化速度が変わることを確認

というところまで完成。PWMは2出力あって、ch.1はch.0の位相をずらしたものを出力しているのだけれど、その位相差が変化するかどうかは未確認。まぁ大丈夫だろう。

ということで、当初に想定していた仕様でのソフトは完成した模様。SVNのレポジトリに突っ込んでおこう。

回路図を描いて実基板に組み込まなくっちゃ。今度の週末かなぁ…

以下ツレヅレ。

はまったポイント
最初どうやっても波形が出なかった
ポートを出力に設定していなかった。出力に設定したらPWMが出た。
波形の変化の様子がおかしい
2's complement表現をそのままPWMレジスタに突っ込んでいた。テーブルを替えるか内部演算で変換するかしてオフセットバイナリにしないといかん。波形の補間をする気があるなら演算で。
VRで周波数を変化させると遅い側でPWM出力がスタックする
AD値から周波数パラメータを算出するところに漏れがあった。修正してスタックしなくなった。

またICEでハマったら面倒なので、内蔵8MHzクロックでPWMが動くところまでICEを使って動作を見ながらデバッグを終えておいた上で、debugWIRE off、PLL on して実機検分。そもそもちゃんとPLLが発振しているんかいな、とクロックを外部出力してみたら16MHz弱が出てきた。偉いじゃん。

昨日の記事で呟いていた件

プログラムROMが余りそうなので、LFO波形のテーブルを複数そっちに持つという手もあるけれど、

(以下プログラムROM→PROG MEM)

現状で 256アドレスのテーブルと64アドレスのテーブルを持っている。前者は正弦波のテーブル(EEPROM上)で、後者はAD値からアンチログっぽく周波数パラメータを得るためのもの(PROG MEM上)。

64-テーブルをEEPROMへ持っていって、256-テーブルをPROG MEMへ持って行きつつ複数持って、波形テーブルを変えられるようにしましょしましょ。

ひとつADCポートが余っているので、そいつで波形を切り替えればよろしいかな。

これ以外でもアイディア

DDSな構成にしてもいいなぁと妄想が頭をもたげてきた。アルゴリズム今回のものとは大きく違ってしまうので、別プロジェクトにブランチさせるとして、DDSでやればDCOへの布石となるかなと。

ATtiny2313

ところで本器は tiny2313への移植は想定しておりません。ていうか、

  • A/D コンバータ
  • 内蔵PLLによる 16MHzクロック
  • timer1による 1/1~1/16384 分周

といった、 ATtiny25/45/85にはあるけれど ATtiny2313には無い機能を使っているので… プログラム容量的には、波形をたくさん持つということを考えなければ ATtiny25 で十分(tiny25が電気街で見つかるかどうかは不明)。

8pin AVR LFO 仕様

作ってみるといろいろとわかるもので、256ポイントの波形データを8個ぐらい持てそうな 8pin AVR LFO。どういうテーブルを持つのが良いでしょう。ご意見をお寄せください。波形ワード語長は8bitです。

コーラスを揺らすのに良いと言われる双曲線というのは三角波アンチログと等価でせうか?

ちなみに出力電圧レンジは PWMのキャリア抑圧LPF後で 0-5V で考えています。プラスマイナスで振らせたかったりレンジ拡大したい場合はLPF後にアナログ処理で。