「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 )




やっぱ、半田吸取り線で半田取っちゃったところが
原因だったみたい。半田付けしたら綺麗な波形に
なった。

んで、ついでにISP端子への5Vラインも外部給電に
切り替えできるようにジャンパーを増やしてみた。

pcbeの回路図も修正。pcbeの回路の方はジャンパー
使わずに、USB変換コネクタだけでなく外部5Vからも
ISP端子へ供給出来る配線に変更しておいた。


この間クイックポジ12Kのストックを使い果たしたのと、
MEGA164はストックが全然無いので補充に秋葉原に。

先に御徒町に寄って、Big Issueの200号を入手。
Raspberry Pi User Guideも早速届いてるんだけど、
じっくり読む前にまずDDSファンクションジェネレータ
を仕上げるのが先決だな。

千石と秋月に寄ってそれぞれを補充。ヒットアンド
アウェイで秋葉原を離脱。ちょこっと谷中に寄って
お友達の顔を拝んでから帰る。


行き帰りの道を歩きながら、残った課題
  「なんで位相が揃わないんだろう?」
っていうのことを考えていたんだけど、ふと思い
ついた。あぁ判った!

単に「位相を揃えてないから揃わないんだ」という
当たり前のことに気付いた。リセット直後は1ch、2ch
ともに角速度0(つまり直流)なので揃ってるん
だけど、片方だけ先に周波数指定した時点で
角速度が設定されて動き出すから、以降位相は
バラバラになっちゃうんだな。その後もう片方の
チャンネルの周波数を指定しても、位相はずれた
ままになる…と。


というわけで、2つの位相をそろえるための仕様
を考えながら帰ってきた。

早速コードを練り始める。位相をそろえるだけなら
簡単なのでサクッと済ます。コードは書き終わった。
新しいコマンドを増やして、指定された周波数に
したがって角速度を両チャンネルいっぺんに設定し、
1ch側の角度を2ch側にも強制的にセットするように。
テストは未済。


ただ、これだと2つの位相をそろえようとすると
両方同じ周波数(角速度)にしか設定できないし、
今はsin波とcos波で90度の位相差しか作れない。

「度」単位で位相差を指定できるようにしたい
なぁとか欲が出てきた。0度から359度で指定。
そうすると、折角cos波の波形データも増やした
のが意味なくなっちゃうなぁ。まぁいいか。


とりあえず、ココまで仕様を盛り込んだらテスト
だな。んで、それが出来たらX-Y指定でお絵かき
出来るようにデータ入れ替えしてみてみよう。

見えてきた。




コメント ( 0 )




MEGA164のデータシートを改めて眺めてみた。やっぱり
片方チャンネルだけ波形に妙なノイズが載ってたのは、
JTAG信号が出荷時にデフォルトで有効になってたから
だった。

とりあえずこれを無効に設定して再度波形を眺めてみる。



10000Hzの波形。細部を見てみる。



毎秒125000サンプルなので、1波形あたり12.5サンプル。
それをLPF通したのがこの波形。ちゃんとギザギザが
とれて「波」の形。LPFはだいたい考えたとおりに
動いているっぽい。

次に周波数を落としていってみる。100Hz。


まだ何か変なノイズが載ってるなぁ。JTAG以外の
ペリフェラルが邪魔してるのか、それともソフト側
の問題なのか…


両方のチャンネルはほぼ同じロジックで波形生成して
いるから、ソフト側のバグって言うのはあまり考え
にくいんだけど…
周波数をちょっと弄ってみても似たような感じで
ノイズが載るので、周波数に連動しているみたい。
タイマーモジュールか?

どこか1ビットだけ化けている感じなんだけどな。
下から数ビット目のところが。


データシートを読み返す。JTAG関係はやっぱり
無効化されているはずで、それ以外の機能が悪さ
するような原因は考えにくいな。

基板を改めて眺めてみる。ん?



半田吸取り線で吸取ったままほったらかしてあった
らしい…バカらしすぎるミスだな。多分これだ…
下から4ビット目なので、なんんと無く事象と符号する。


これ直すのは直すとして、あともう一つ変なところが
残ってるんだよな。波形の位相が思ったように出てない。
2つの波はsinとcosで90度位相がずれてるはずなのに、
綺麗に90度にならない。信号がおかしいのか、オシロ
側がおかしいのか…

なんだろうな。



コメント ( 0 )




ようやくMEGA164にアセンブルしたhexファイルを
書き込んで動かしてみることに。

AVRstudioからAVRISPmkIIで書き込み、ok。
ベリファイ、ok。fuseビットもちょこちょこ
直して、いざ実行。

USB-シリアル変換ケーブル(いつものFTDI-BASIC
breakout)を繋いで、tera termからコマンドを
打ってみる。
オシロで信号を拾ってみると…波形が出てこない…

オペアンプを通す前のMEGA164の出力ピンを
当たってみる… 出てない。


どうやら動いて無いっぽいなぁ。


USB給電でチョッパ回路2つも動かすのはきついのか?
電源不足なのか?と思って電源回路を見直してみる。
確かに元々の配線時のアレコレで、USB給電でしか
ISPできないようになっちゃってて電力的にキビシイ
ところはあるんだけど、電圧が足りなくて厳しいって
ほどじゃないなぁ。

PCからのコマンドを、AVR基板からエコーバック
させてみようという作戦に。配線自体は元々シリアル
出力をちゃんと敷いておいたので、プログラム修正
だけでうまく行くはず。

修正してアップロード…

ISPモードに入れない!エラーになっちゃう。なんで?
さっき書けたのに…


色々調べてみたんだけど、どうやらfuseか何か変な
設定になっちゃったっぽいなぁ。

配線を全体的に見直してみる。


…発見!この間のベタGNDの太さを変えたときに、
どうやらGNDとRESETをくっつけてしまったらしい。
常時リセットボタン押下状態。なんじゃこりゃ?


とりあえず気を取り直して、リセットボタンの
ショート部分をルーターでカット。

再度書き込みしてみる…


書けない。どうやら、最初に書き込みできたのは
リセット端子がGNDレベルだからISPモードに
入れただけで、その後ISPモードから出られてない
中途半端な状態になっちゃってると考えるのが
良さそう。あぁ、MEGA164のスペアは無いんだよな。


至急MEGA644の買い置きで代替することに。

ソース中の変数やコメント、インクルードファイル
とかを644がらみの名称に変えてアセンブル。
書き込み…。とりあえず動いた。ふぅ。


さて、オシロあてながら可変抵抗のツマミをグルグル。

1チャンネル側は想定どおりに動く。イイカンジ。

2チャンネル側は…まともな波形が出てこない…
こっちだけまともに出てこない理由が良くわかんない
んだけどな…なんだろう?


微妙な波形が出たかと思えば、途中でフリーズしちゃう。

波形の形から考えると、上位ビットと下位ビットは
微妙に生きてる感じ。中間のビットが化けてるとしたら、
なにか重畳している他のペリフェラルの信号がそのピン
だけ生きてるってことか?

なんとなくJTAG信号が怪しいな。JTAG信号って、意図的に
無効化しないと生きちゃうの?

そう考えると、微妙なノイズ入りの波形がたまたま
意味のあるJTAG信号になったときにフリーズする
とか考えると合点が行く気もする…

MEGA164シリーズって、DebugWire対応なんだっけ?
JTAGだけだと、でかいメモリ積んでるのにデバッグ
のためだけにこの配線をしないといけないジャン。
うーーーん。

もうちょっとデータシート読んでからだな。



コメント ( 0 )



« 前ページ 次ページ »