「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



色々あったものの、とりあえず期待したような信号
を出力できるDDSファンクションジェネレータが出来た
みたい。

100hzと200hzのsin波を出力して、位相を90度にした
もの。



拡大図。



んで、この周波数比1:2の波形のまま位相を45度に
設定してリサージュ図形を描かせてみたのがこれ。



http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B5%E3%82%B8%E3%83%A5%E3%83%BC%E5%9B%B3%E5%BD%A2
合ってるみたい。ok。


ココに辿り着くまでに、色々紆余曲折。

位相の設定は、入力値に掛け算使って処理させるか、
それとも定数テーブルにしようかと迷って結局
定数テーブルにしたんだけど、いざ位相の角度を
入力してみると、なぜか指定値の4倍の位相ずれ
が生じちゃう。

AVRでプログラムメモリ(.cseg)上の定数データに
アクセスするときにズレが起こるときっていうと、
大体SRAM(アドレス値そのまま)とFLASH(word単位
なので2倍したアドレス値)あたりが絡んでいる
だろうと思ってそっちから見ていったら、全然
原因がわからない…

改めてソフトウェアシミュレーションをじっくりと
やり直してみる。

緻密にソフトウェアシミュレーションをやり直して
みると、各変数も考えたとおりの値を示しているし、
テーブルからの読み出し値も間違えない。

じゃぁシミュレータと実機で計算結果が異なってる
ってことか?と思って、わかんなくなったので食事
をかねて外出。

自転車漕ぎながらアレコレ考えてると、ふと思いついた。
定数テーブルに仕込んであるデータの値(レンジ)が
間違ってるんじゃない?と。

んで、改めてそっち系から調べなおしてみたら、
サクッと見つかった。角度の指定レンジが2ビット
ズレてた。なんだ…なんだよ…。

つまんない間違えでハマルと、「あそこは大丈夫なはず、
こっちも大丈夫なはず…」みたいに思い込みでなかなか
先に進まなかったりするんだよな。


MEGA644用で動いたんだけど、メモリは8KBちょっとしか
使ってないので、MEGA164に鋳直して(タグを少々修正)
MEGA164チップに載せ換えしておこう。

あと、波だけでなく「任意の図」も表示出来るように
図データ作成ツールが作ってあるので、x-y表示で
図を描いてみよう。


とりあえず一段落。買ったままの本をちょっとずつ
消化しよう。



コメント ( 0 )




相変わらずMEGA164のDDSファンクションジェネレータ。

回路周りは大体よさげとして、ソフト周りで1個残って
いた課題。位相がうまく保たれないって件について
プログラムを弄りなおしてみる。

位相の角度をコマンド入力したら、2ch側の位相を
1ch側に対してオフセットつけるという計算処理。

んで、しばらく考える。指定した角度を、プログラム中
で使用している内部変数(もしくはレジスタ)で扱って
いる情報フォーマットに変換する計算処理をモヤモヤと。


最初、入力した角度から角速度に、角速度から位相情報
にと換算していかないといかんのだろうとか思って、
落書き帳であれこれ式書いたり、あーじゃないこーじゃない
と考えていた。
また割り算が必要になるんじゃね?とか考え始めちゃって、
クロック数的に厳しいんだよな…とか。

だけど、よく考えたら角速度(の積分値)じゃなくて
角度そのままが位相なんジャン!とかマヌケな自分の
脳みそを改めて認識して一安心。


内部では、1波形360度を1024点で表現し、これに
小数部20ビットを付加した情報で扱っているので、
1024を360で割った値を整数部12ビット、小数部
20ビットの計32ビット(4バイト)でテーブル化
すればok。

まぁテーブル化しなくても、掛け算ライブラリ使って
「1度」に相当する位相角(定数値)に入力値を
掛ければ求まるんだけど、メモリはいっぱい余ってるし、
処理クロックも少なくて済むから、定数テーブルで
済ますことに。


とりあえずこんな感じでプログラムは直した。
アセンブルしてみたら、8KBにも至らない状態。
MEGA164でも50%使ってない。

さて、IDEのソフトウェアシミュレータで想定どおり
動くかどうか見てみよう。



コメント ( 0 )