ASMを使用したAtmel AVRでDDSプロジェクトを完了しましたが、8ビットのルックアップテーブルと8ビットDACが多すぎる量子化を作成するという結論に達しました低周波での歪み。より良い言葉遣いの欠如のために、私はオシロスコープにはしご効果を持つ正弦波を得ています。DDS補間 - 8ビットAtmel AVR ASMから12ビットDAC
明らかに、大きなLPFで波形を平滑化すると、より高い周波数で振幅に問題があります。
理論的には、8ビットDACから12ビットDACにアップグレードし、4つの最下位ビットで補間を使用すると、高い周波数での波形振幅の問題を緩和するのに十分な大きさのフィルタのカットオフポイントを上げることができます。私の問題は、私はこれを行う方法の手がかりを持っていないか、ジッパー効果..おそらく12ビットのルックアップテーブルを削除する簡単な方法がある場合ですか?
これまでは無限ループを作成しました。ループがサイクルを完了するたびに、ルックアップテーブルに関連するポインタの位置に基づいて値がDACに送信されます。ここで私は混乱します。私はこれに関する情報のトンを読んだが、まだ実用的な例が見つかりませんでした。無限ループがある場合、補間値をテーブルルックアップ値の間に埋め込む方法を教えてください。私が考えることができる最も良いことは、(a + b)/ 2です。おそらくこれを実装して512ビットのルックアップテーブルに余分なビットを付け加えることができますが、より良い結果をもたらす可能性のある簡単な方法があると思います。私はCやそれを採用する方法を知らないが、それが賢明であれば試してみる。
現在、私の時計は1MHZです。必要に応じて、おそらく16MHZに行くことができます。ここで
は、私のコードのサンプルです:
。正弦波出力をデフォルトとして設定する
ldi ZH, High(sine*2); setup Z pointer hi
ldi ZL, Low(sine*2) ; setup Z pointer lo
;クリアアキュムレータ
clr r29 ; clear accumulator
;セットアップ加算器は、登録
ldi r24,0x50 ; Fine adder value change register
ldi r25,0x08 ; Middle adder value change register
ldi r26,0x00 ; Coarse adder value change register
LOOP1:
add r28,r24 ; 1 Adder values carry over to higher registers. Higher registers raise freq. in larger steps
adc r29,r25 ; 1
adc r30,r26 ; 1 r30 is database address pointer for Z register
lpm r0, Z ; 3 (Load Program Memory) Reads byte from database into the destination register based on Z pointer
out PORTD,r0
rjmp LOOP1 ; 2 => 9 cycles
ありがとうございます。私はそれを理解していない。なぜ右に8ビットシフトするのですか?方程式の最初の部分は非常に簡単にレジスタをオーバーフローさせる可能性があります。 LUT [r30 + 1]は波形の位相を変更するのではなく、ポインタの次の時間に敏感なステップに進むのではないでしょうか?以前のポインタステップを照会する方が理にかなっていませんか? –