JA1QVM

アマチュア無線機とアンテナを作ることそして温泉が大好き。

33FJ64GP802/アナログ変換

前回は ADCで入力信号をデジタルに変換して、怪しげな処理をしました。
今回は其の後の2系統アナログ出力(90度位相差2信号用)を考えてみます。
元々此のデバイスは低周波ステレオ信号用に作られていて、ピッタリのアナログ変換器(DAC)が2個、モジュールとして内蔵されてます。
色々試行錯誤をしてたどり着いたプログラムを関数形で・・・

イメージ 1


そして此れも・・・

イメージ 2

上記は DACの左右 (RL)の割込みです。
割り込んだだけで何もしない命令ですが、省くとダメです。
理由は解りませんが、同じ事を研究してる人に参考になれば・・・と。
そして DACの入力は左右あります。
右(R)・・・DAC1RDAT
左(L)・・・DAC1LDAT
実際の命令は下記になります。

asm("mov Wn,DAC1RDAT");   //R出力
asm("mov Wn,DAC1LDAT");   //L出力

前回のブログで書いた [asm("push W0");]  と上記の間に、思う存分好き勝手なデジタル操作のプログラムがアセンブラで入ります。
因みに何も細工しないでアナログ信号に戻すプログラムは・・・

asm("pop W0");   //W0のシャドウを戻す
asm("mov W0,DAC1RDAT");   //R出力

になります。
此れにより ADCに入力された低周波アナログ信号が、そのままの波形で DACより出力されます。
折角デジタルに変換して、何もせずアナログに戻すのは意味が無いような気がしますが、実は此れが凄く大事なことで各動作の確認になります。
つまり、入力信号が歪無く出力側に取り出せて、初めて DSP処理の入口に辿り着けた訳です。
綺麗な出力波形をオシロで見たときは感激しました。
1週間ほどビートルズ・ナンバー(私はビートルズ・エイジ)を ADCに入力して聴いていましたね!

さて独りよがり爺さんの 「DSPお遊び」が、PSN/SSBジェネレータとしてマトモに通用するのか・・・次回も宜しく。
by    JA1QVM

この記事に

開く コメント(5)[NEW]

開く トラックバック(0)

前回まででデジタル変換(ADC)モジュールの基本設定は終っています。
サンプリング周波数用のタイマ3も設定は終っています。
後は現実にトリーガを掛ける方法ですが、此れは「割込み」を使います。
下にプログラムを・・・

イメージ 1
1行目がタイマ3の割込み命令です。
何やら長ったらしい文ですが・・・問題は其の下から始まる怪しげな命令文です。
結論を先に云うと「インライン・アセンブラ/簡易型」です。
前回でも指摘しましたが、サンプリング周波数の周期でどんどんデジタル化された信号が取り込まれてきます。
其の時間は 1/Fs=約 50μ秒程ですね。
つまり「もたもた」出来な〜い・・・
結果的にアセンブラ言語を使わざるをえないです。
他の主要部分をC言語で書いておきながら、速い演算を必要とする時だけアセンブラを使うと云う、虫の良い方法です。
メーカでも此れを用意してあるので使ってみました。

詳しい内容は省きますが、結論は上記のワーキング・レジスタ [W0]のシャドウ側に 12bit/ADCの結果が 50μ秒毎に書き込まれます。
当然もたもたしてると上書きされます。
後は W0の内容で DSP処理をするのですが、其の部分は膨大な量で微妙な問題も含み、私の力量ではブログで発表するのは無理の様です。
実際に一冊の解説本が出来るくらいのレベルで、趣味として研究するのは楽しいですが残念です。
興味がありファイト満々な人は専門書を読み、自力で進んで下さい。
私の様な素人の爺さんでも、充分に SSBジェネレータとして使える FIRフィルタが設計できました。

次回は折角デジタル化した信号を、元のアナログ信号に戻す事を考えます。
結構それも S/N比を考慮すると難しいですが、宜しく。
by    JA1QVM

PS:上記の簡易アセンブラで長い命令文を使うのはメーカで推奨されません。
パクる人は自己責任でお願いします。


この記事に

開く コメント(12)

開く トラックバック(0)

クロック周波数が安定している様なので次へ進みます。

待ちに待ったデジタル変換(ADC)です。
当たり前ですが、マイクで拾った音声はアナログ信号で、其れをマイコンで処理出来る様にデジタル信号に変換しなくてはいけません。
この dsPICには其れ用の ADCがモジュールとして内蔵されてます。
今回は MAX分解能の 12bit/1チャンネルを使いました。
S/N比を含めたダイナミックレンジは 70db前後になると思います。
色々、試行錯誤を繰り返して組上げたプログラムを関数の形にして・・・

イメージ 1
一見して簡単そうに見えますが、此処へ到達するのに2週間程かかりました。
コロンブスの卵と同じで、出来てしまえば「当たり前」ごとです。
詳しい内容はメーカで出しているマニアルを参照して下さい。
因みに、凄〜く難しいです。

実は其のマニアルを解読していく内に、サンプリング周波数の重要性に気付きます。
世の中には ADCのサンプリング理論と云うのが有り、扱うアナログ信号周波数の2倍以上あれば事は足りると・・・
でも其れは単純な理論値で有り、S/N比を考慮すると高いに越したことはない(高すぎてもダメ?)様です。
そして今回の様に、ADC後に DSP処理をする場合、其の演算時間は各サンプリング間に終わらせなくてはいけません。
つまりサンプリング周波数が高過ぎると、満足な DSP演算時間が採れない--->DSP処理が追いつかない結果になります。
其の他、後に続くアナログ変換(DAC)との兼ね合いも有ります。
等々考慮して「サンプリング周波数(Fs)」は、クロック設定に出てきた「X周波数=5000kHz」の 256分の1にします。

ADCサンプリング周波数:Fs=5000/256=19.53125kHz

現実に此の周波数でサンプリングさせる為に ADCのトリーガ機能を使います。
此れはタイマ3でやるしか無い様で、其のプログラムを関数形にして下に・・・

イメージ 2
今回は私のアタマが此処までで限界です。
次回は無事に ADCが組み上がり「嬉しいよ〜」の展開になります。
パクる人は自己責任で宜しく・・・

by    JA1QVM

この記事に

開く コメント(2)

開く トラックバック(0)

前回で一応 dsPICの基本初期設定は出来たツモリですが・・・
最終目標の各種オーディオ・フィルタ動作に向って、また前進あるのみです。

今回はマイコンの骨格になる「クロック周波数」を勉強しました。
PIC12F683の様に簡単に片付くと思ったら大間違いです。
色々考えた?結果を関数の形にして・・・

イメージ 1

欲しいのは此のデバイス上限である 40MHzです。
単純に水晶発振周波数 20MHzを2倍すれば事は足りると思うのですが、何やら難しい計算式が必要の様です。

PLLPRE=2:  20/(N+2)=5MHz・・・(折角 20MHzの水晶を奮発したのに、イキナリ 1/4かよ)

PLLDIV=30:  5*(N+2)=160MHz・・・(えっ今度は32倍して 160MHzにするんだ)
 
PLLPOST=0:  160/(N+2)=80MHz・・・(2ではなく4で割れば 40MHzになるじゃん)

SELACLK=0:  80/(N+2)=40MHz・・・やっと 40MHzになりました。(回りくどいよ〜)

実は途中に出てくる周波数・・・ 160/80MHzは特別な意味を持ちます。
160MHz=[Fvco]
80MHz=[Fosc]
40MHz=[Fcy]・・・此れがクロック周波数です。
そして最後の [APSTSCLR=2]は X=Fvco/32=5MHzにする命令です。
此の X=5MHzは後に出てくる ADC/DACに関係する重要な周波数で、しっかり憶えておきましょう。

さて無事にクロックの 40MHzが作り出せた様ですが自信が有りません。
特に関数として作って大丈夫なのか?(当然、その関数プログラムを動作させる為のクロックが必要な訳で・・・)
其処で簡単なLチカのプログラムを組んで点滅周期を測り、其処から逆算して(クロック周波数により点滅周期が決まる)確認する方法があります。
その為に最初から LEDを付けておきました。
下の写真では黄丸です。
イメージ 2

配線図には載せていませんが、チェック機能として(プログラムもその時だけ書く)便利です。
今回のクロック周波数も LEDで動作確認をしました。

最終目標のヒルベルト変換(アナログでは APF)まで道は遠いですが、一歩一歩進みます・・・パクる人は自己責任で宜しく。

by    JA1QVM

この記事に

開く コメント(2)

開く トラックバック(0)

楽し〜いプログラム作りになると思ったのですが、難しいです。

取りあえず、プログラムを作れる環境を整備しなくてはイケマセン。
其処で、例のメーカが無料提供している???をダウンロード/インストールしました。
イメージ 1

バージョンは何故か [v4.05]です。(v4.10も有ります)
コンパイル用の此れも一緒に・・・
イメージ 2
此方は [v1.33]です。

使い方が解らず右往左往しましたが(PIC12F683とはマルで違う)、持ち前の「しつこさ」でカバーして、下記の所まで無事到着〜。

イメージ 3
いきなり前ふりプログラムを書いていますが、此処まで来るのに1週間は要しています。
そして内容については、私の独断と偏見で作っていますので、もっと解りやすいマトモな物が有ると思います。
詳しい事は 33FJ64のマニアルを参照して下さい。
でも一応は動作するので、此の下にメインプログラムを作って行きます。

次回からプログラムの真髄に迫ります、宜しく。 ・・・難しいぞ〜〜
by    JA1QVM  (パクる人はくれぐれも自己責任で)

この記事に

開く コメント(0)

開く トラックバック(0)

[ すべて表示 ]


.


みんなの更新記事