当ブログは…
平日の 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が電気街で見つかるかどうかは不明)。