相変わらずMEGA164のDDSファンクションジェネレータ。
回路周りは大体よさげとして、ソフト周りで1個残って
いた課題。位相がうまく保たれないって件について
プログラムを弄りなおしてみる。
位相の角度をコマンド入力したら、2ch側の位相を
1ch側に対してオフセットつけるという計算処理。
んで、しばらく考える。指定した角度を、プログラム中
で使用している内部変数(もしくはレジスタ)で扱って
いる情報フォーマットに変換する計算処理をモヤモヤと。
最初、入力した角度から角速度に、角速度から位相情報
にと換算していかないといかんのだろうとか思って、
落書き帳であれこれ式書いたり、あーじゃないこーじゃない
と考えていた。
また割り算が必要になるんじゃね?とか考え始めちゃって、
クロック数的に厳しいんだよな…とか。
だけど、よく考えたら角速度(の積分値)じゃなくて
角度そのままが位相なんジャン!とかマヌケな自分の
脳みそを改めて認識して一安心。
内部では、1波形360度を1024点で表現し、これに
小数部20ビットを付加した情報で扱っているので、
1024を360で割った値を整数部12ビット、小数部
20ビットの計32ビット(4バイト)でテーブル化
すればok。
まぁテーブル化しなくても、掛け算ライブラリ使って
「1度」に相当する位相角(定数値)に入力値を
掛ければ求まるんだけど、メモリはいっぱい余ってるし、
処理クロックも少なくて済むから、定数テーブルで
済ますことに。
とりあえずこんな感じでプログラムは直した。
アセンブルしてみたら、8KBにも至らない状態。
MEGA164でも50%使ってない。
さて、IDEのソフトウェアシミュレータで想定どおり
動くかどうか見てみよう。
|