ラベル HSE_SignalGenerator の投稿を表示しています。 すべての投稿を表示
ラベル HSE_SignalGenerator の投稿を表示しています。 すべての投稿を表示

2010年2月1日月曜日

三相信号発信器のLPF変更

CR型のローパスフィルターの定数を変更した。

以前は、10MHzをカットオフ周波数にしていたのだが、これだとSin波にならなかった。FPGAの周波数が50MHzなので、周波数の差が5倍程度。これではD/A変換にならない。

それで、今回はパルスと出力の比が1:100以上の差をつけるため、カットオフを360kHzまで落としてみた。
結果、パルス密度変調(PDM)の効果がはっきりと出た。

まずは、100kHz。
きれいな波形が出ている。
例によって、3つめの波形の振幅が小さいが、オシロスコープと手持ちのプローブの関係でこうなっているだけで、実際は同じ振幅で出力されている。




200kHz。








400kHz。
多少、出力レベルが下がったかな。

それで、これ以上周波数をあげていくとどんどんレベルが下がる。





オシロスコープとプローブの組み合わせをいろいろ変えてみて、見た目の振幅を同じぐらいに設定し、3波を重ね合わせてみた。
プローブの癖がでているらしく、きれいに振幅がそろわない。






周期を変えて、波形を横に拡大してみた。
よく見ると、ギザギザが残っているのがわかる。
実際はこのギザギザが左から右へ移動していた。






テスラコイルの信号源に使うのであれば、この程度の周波数で十分だろう。
これにて完了。

2009年11月19日木曜日

三相信号発生器の改造(その2)


昨日、今日と、仕事から戻ってから信号が出力されない問題を修正して、ようやく出力が得られた。

結果として、出力波形はSin波形には程遠いものだ。LPFの出来が悪いのかもしれない。

信号が出力されなかったのは、ひとつは追加したリセット回路。RCで作った簡易な回路だったため、また調整が不十分なのもあるかもしれないが、リセットが解除されない状態だった。リセットは専用ICにするのがいいのかもしれない。とりあえず、リセットなしでも動くので問題はなさそうだけれど。

もうひとつ問題だったのは、FPGAのデータ入力ピンの指定が間違っていたため、データが伝送されなかった。これはかなり初歩的なミスだった。

以上の問題を解決し、PICから希望する周波数を設定すると、周波数が変わることをオシロスコープにて確認。周波数は正確に測ったわけではなく、波形の周期から大まかな状態を確認した程度。

これで一応基本的な部分は出来たようなので、あとは電子ボリュームの実装とLPFを含めて出力波形の検討だ。PDM方式だと、取り出せる周波数はCLOCKの1/10ぐらいかと思ったが、もっと低くしたほうがいいのかもしれない。これはLPFとの組み合わせなど調整が必要に思う。

それから、PICでつくったI/F部は、他にも流用できるので、次に製作予定のパルスジェネレーターなどにも使おうかと思う。

トップの画像は、1波を表示したもので、この左の画像は2波を重ねたもの。







この3枚目の画像は、3波を重ねたもの。ひとつだけ波が低いのだが、これは、オシロスコープの電圧設定が0.1Vと0.5Vの2つしかなく、しかもプローブの1本が壊れていて、かわりに高圧用の1/100プローブをつないだためにこうなっている。実際は同じ3.3Vの出力レベル。

2009年10月12日月曜日

ModelSimの使い方

ModelSimを使ってみた。以下、自分用の使い方の覚書。


まず、シミュレーション用のVHDLをISEで作成する。

ISEを立ち上げて、左上側のSourceウィンドウの中のデバイスのところでマウスを左クリックしてメニューを出す。メニューの中のNew Source...を選択する。



ウィザードが立ち上がるので、
左が側の"VHDL Test Bench"を選択し、右側のファイル名を入力する。今回は、'3ph_sg_test'とした。右側下のLocation:は、変更せずにNextを押下。




次に、VHDLソースが出てくるので適切なファイルを選択。
ここでは、一番上の'dds_3sg'を選択した。
Nextを押下。





Wizardの最後に確認画面がでるのでFinishを押下。







すると、VHDLのテスト用ソースが生成される。

80行目~102行目の部分を目的にあわせて修正する。









テスト用の信号をVHDLで記述するのだが、今回は左のような感じにしてみた。












ここまで出来たら、これらのVHDLソースを使って、ModelSimでシミュレーションを実行してみることになる。

これ以降のシミュレーションを実行するまでの手順は、
Help>PDF Documentation>tutorial
を参考にした。




チュートリアルには、「Create working Library」とある。
まず、ModelSimを立ち上げる。


プロジェクトがないとWizardが立ち上がるようなので、Create Projectをする。

ここでは、プロジェクト名を'dds_3sg_test'とした。




この後、Add items to the Projectというダイアローグが出てくる。

ここで、右上のAdd Existing Fileを選択する。






次のようなダイアローグが出てくるので、Browseボタンを押下する。





ファイル選択ダイアローグが出てくるので、ISEで作成したVHDLソースファイルを選択する。

複数のファイルが同時に選択可能だ。
選択したら、開くボタンを押下する。

Add items to the Projectというダイアローグがまだ残っているので右下のCloseボタンを押下。


画面右上のWorkspaceウィンドウに先ほど選択した4つのファイルが入っていることに気づく。








「Compile the Design」

この状態でコンパイルを実行
Complile>Compile All





あれれ、、、エラーが出ている。



赤くなったエラー行をダブルクリックすると詳細が表示される。




テスト用のVHDLの3行目がおかしいと言っている。
ここでも赤くなった行をダブルクリックする。


すると、ソースが表示された。オレンジ色で問題の箇所がマーキングされている。

うーん、このツールよく出来ているな~と関心。

ところで、3ph_sg_testというキーワードが重なってしまったのが原因??。よくわからないが、とにかく修正してみることにする。修正は、ModelSimから出来ないので、いったんISEに戻ことになる。

ところで、ちょっと、この状態でライブラリを作成してみた。

File>New>Library...









ライブラリ名を入力








すると、4つのファイルのうち、コンパイルが正常に終了した3つのファイルが、workspaceウィンドウのLibraryタブのリストの一番上にあるworkの中に入っていた。

どうやらコンパイルが出来たものだけライブラリとして登録されるようだ。

では、プログラムを作りなおしてみる。

ISEに戻って、上記と同じ要領でVHDLを生成。

ファイル名が数字で始まっているのが問題かもしれないので、今度は'dds_3sg_test.vhd'としてみた。

生成されたものを先ほどと同じ修正を加えて保存。

ModelSimに戻って、画面右上のWorkspaceウィンドウのProjectタブを選択。余白部分でマウスを右クリックしてメニューを表示
Add to Project>Existing File
でダイアローグを出して、Browsボタンを押下。
ファイル選択ダイアローグが出てくるので、先ほど作り直した'dds_3sg_test.vhd'ファイルを選択して開くボタンを押下。

WorkspaceウィンドウのProjectタブ内にファイルが追加されたことを確認。4ファイルになっている。




このあと、先ほどやったようにCompile Allを実行する。





WorkspeceウィンドウのLibraryタブに切り替える。

リスト一番上のwork左の+マークをマウスで押すとライブラリとして登録されたエンティティが表示される。ちゃんと4つ入っていることがわかる。

「Load the Design」

次にこの4つのうち、シミュレーションのターゲットとなるエンティティをダブルクリックして、Loadを行う。このLoadを行うことで、ModelSimに最新のファイル状態が取り込まれるようである。


「Run the Simulation」

ここまできてようやくシミュレーションがスタートできる状態になる。

<<画面の表示が変わった。

左上のWorkspaceウィンドウには、Sim, Files, memories, Capacityといったタブが増えている。
右上にはdds_3sg_test.vhdソースが表示されている。

ここでいったんwaveウィンドウを開いてみる。
View>Wave

すると、右上のソース表示ウィンドウがタブ表示になり、waveがタブとして表示された。

しかし、このままではシミュレーションを開始しても肝心の表示したい信号が登録されていないので見ることができない。

次に、右上のWorkspaceウィンドウのsimタブ中のリスト一番上のdds_3sg_testの上でマウスの右クリック、メニューを出す。そして

Add>To Wave>All items in region

を選択。

すると青い色のマークがついた信号名が追加される。

(もしもこれを行わずにRunしたら、本当になにも表示されないのだ)




このままだと、小さくて見づらいので、ウィンドウの右上端の
+マークとXマークの間にあるUnlockを押して、独立したウィンドウにすると都合が良い。




さあ、いよいよシミュレーションの開始だ。

その前に、ツールバーの中のシミュレーションバーで、実行したい時間を設定しておく。

今回は、おおよそ2000μsec必要なので、2000usをセットする。このツールバーは独立する前のウィンドウにも、独立して表示したwaveウィンドウの上にもある。

ツールバーの数字をセットしたすぐ右横のアイコンがRunボタン。これをクリックするとシミュレーションが実行され、2000usに達したらstopしてくれる。


画像は、ツールバーの虫眼鏡のマイナス記号がついたZoom Outを使って、結果の時間軸を圧縮した状態のもの。

テスト用の入力信号が上の3段に表示されている。

その下の緑色が50MHzのベースクロック。細かすぎて緑色につぶれている。さらにその下の白っぽい緑のライン3本が出力されている3相の周波数だ。これもつぶれてしまっている。でも、Zoom Inして時間軸を引き伸ばせば見えるようになる。

あと、便利な機能はカーソルだ。
黄色い色のカーソルを使うと、カーソル間の時間が詳細に表示される。マーキングしておくとスクロールで移動させたときもポイントがすぐにわかる。

それから、表示されたデータをアナログ表示することもできる。

信号をマウスで選択して、右クリックしてメニューを出す。
Format>Analog(automatic)
で波形となって表示される。

多少待たされる。その間、CPUファンがうなっている。

1本出来上がり。しかし、これもよく出来ている機能だ。。。素晴らしい。


3本完成。
画像の左側が100kHzの波形で、きれいな三相波形が見える。右は数十MHzの波形だが、周波数が高すぎて白くつぶれてしまっている。

2本の黄色いマーカーに注目。
FQLOAD信号がLOWに落ちてから5us後に周波数が切り替わっている。設計どおりだ。


こちらは同じポイントで時間軸を変えたところ。
右側の波を見た感想は、Sinカーブとはいえないが、周期のずれ方から一応3相にはなっているようだ。1サイクルが3クロックだから周波数は16.67MHzぐらいか。





はじめ、信号をアナログにしたときに波形がプラス側とマイナス側が逆転して凹型の組み合わせたもののような形になっていたので、VHDLのソースに問題があるのか・・・と思ったが、ModelSimが信号を符号付きとして扱っていたようだった。
それで、上記と同様に信号をマウスの右クリックでメニューを出して、
radix>unsigned
にした。すると画像のようなキレイな波形となって表示された。ホッと一安心。

【問題の解決】

さて、このModelSimを使っていて、先日の信号が0.01Hzに落ちてしまう現象を再現してみた。

シミュレーションから得られた結論は、外部であるPICから与えるENABLE信号のHIGHTレベルの時間が短かったということだった。PICでは2μsecに設定してあったのだが、テスト波形をこの2μsecにすると、見事に周波数が出てこなくなった。2μsecだとぎりぎり時間が足りなかったようだ。これを3μsecにしてやると上の画像のようにきちんと周波数の切り替えが出来た。

原因がわかって一安心。あとは、PICの時間を3μsecに修正して、実機で確認だ。

※しかし、今日は随分と長文になってしまったなぁ。。。


参考サイト:電子回路の豆知識

2009年10月4日日曜日

VHDLの修正とModelSim



外部から与える信号が認識できていなかったので、FPGAのVHDLソースを修正した。

問題だった部分を別のファイルに書き出してモジュール化した。そして、外部信号をそのまま拾わずに、いったんタイマーで一定時間経ってからワンショットの信号を生成して、内部のラッチレジスタに取り込むような形にした。

それと同時に、PIC側の送信タイミングも若干変更した。

いざ、ボードの電源を入れて確認。初期化は正常に機能しているので、立ち上がった直後は信号がキレイに出ている。。。

ところが、先週確認したときは正常に動作していたと思っていた、DAコンバータのアンプ、3つあるうちのひとつが死んでいた。とりあえず、アンプの入力まで信号がきちんと来ているので、ICを交換すれば直るだろうから後回し。

つぎに、PIC側の周波数をデフォルトの100kHzから60kHzに下げて設定してみた。すると、FPGA側で信号はなんとか受け取っているようだが、出力波形が、ほとんどDCに近い。いや、よく見ると少しずつ動いている。一分以上かけて、上下を繰り返している。どうやら、周波数の下限である0.01Hzが出力されているようだ。

ここで問題なのは、PICの送り側なのか、FPGAの受信側なのか、良くわからなくなってきた。PICをデバッグモードで動かして確認したら、一応想定どおりの動きはしているように見える。

FPGAは???

どうすれば良いかまったく検討もつかない。
それで、いろいろ調べたところ、ModelSimというシミュレータが存在することを知った。
シミュレータでどのような挙動をしているのかを調べてみることにした。

まずは、ModelSimのインストールから。

kaki03ノート×組込×FPGA によると、普通はISEを入れたあとに、このModelSimを入れるようだ。まったくの素人なので、そんなこと知らずにいた。
インストールガイド を見ながら作業をすすめる。

・・・ファイルのサイズが大きくて、とても時間がかかるなぁ・・・

やっとのことで、ModelSimを立ち上げるところまでこぎつけた。
記念にスプラッシュ画面をUP。

2009年9月27日日曜日

FPGA外部信号の同期

今日は、前回FPGAが動かなかった原因を探していた。

一度完全に動いていたヴァージョン(周波数固定)に戻してみたら、正常動作していた。
ということは、後から追加したロジックが適切じゃないということだ。

周波数を可変にするために、外部から3つの信号を取り込むようにしたのだが、これがどうやらバグっているようだ。
もう一度VHDLの本を読んだりしていたら、追加した外部からの信号が、クロックと同期がまったく取れていないためだろうなと思い始めた。単純に信号を入れただけ、タイミングなんか全然考えていない。だから、当然といえば当然かもしれない。

信号を内部のクロックと同期させるために、フリップフロップを入れる必要がある。また、取り込むタイミングが曖昧な状態だったので、何クロックで処理を完了するのかなど、きちんと定義する必要があるようだ。

いつも仕事でやっているプログラムとは随分違いがあるなぁ。。。
良くわからないことだらけ。

2009年9月23日水曜日

インターフェース部の暫定版と三相信号発生器


とりあえず、PIC24に切り替えて無事動くようになった。メモリー不足でリリースすらできなかったのが、今は順調に動くようになった。

タクトスイッチの上のボタンを押すと周波数の変更モードに切り替わり、左右のスイッチで希望する位置にカーソルを移動して、エンコーダーを回すとその部分の数字がUP/DOWNする。希望する周波数を入力したら、下のボタンで設定完了する。このような簡単なものなのに、かなり時間がかかってしまった。16bitのPICは初挑戦だったから仕方ないか。。。

あと、設定周波数をFLASHメモリーに記録する部分だとか、シリアルインターフェースなどまだやることがのこっているが、とりあえず暫定版としてリリースすることにした。

もともと、このインターフェース部分は、FPGA(Spartan-3A)で作った三相高周波信号発生器の周波数を変更するためのものだった。

なので、すでに半年ほど前に出来上がっていたはずの、三相信号発生器に接続して、動作確認をしてみた。

ところがである、予想通り出力が出てこない。

FPGAの書き込みをもう一度やり直してみたがだめで、Xilinxのシミュレーターを使ってみると、出力が出ないことが判明した。レジスタの初期値が設定されていなかったり、32ビット信号から上位11ビットを取り出すところで、下位ビットを拾っていたため出力が変化しなかったりといろいろ問題が見つかった。

これらを修正したのだが、それでも信号が出てこない。。。
出力段のDAコンバータにオシロのプローブを当てて調べていたら、レギュレーターから100Hz程度の信号が出ているようだし、まだまだ完成するまで先は長そうだ。