自分自身のための ものづくり / 自分自身のためのものづくりメモ

* てきとーな、DDSっぽい波形発生器

 PICとR-2Rラダー回路でDDSっぽいのを組んでみた。





 プログラムはこんなの。
lp
	movlf	d'255',	PORTB
	movlf	d'255',	PORTB
(略)
	movlf	d'252',	PORTB
	movlf	d'251',	PORTB
	movlf	d'251',	PORTB
(略)
	movlf	d'255',	PORTB
	movlf	d'255',	PORTB
	goto	lp
	end
 データはRubyスクリプトにて作成。
 とりあえず1kHzの正弦波を出してみたが、当然、波形は自由自在だ。

 手持ちのPIC16F648Aを内蔵オシレータにて4MHz駆動。サンプリングレートは音声帯域なら無駄に高い500kHz。更に、手持ちの12MHzのオシレータをつけて1.5MHzになった。
 16MHzを越えると、1kHzの波形を出力するコードが4kwordを越えてしまうので、今の手持ちの石では対応できなくなる。ぎりぎり16MHzの場合のサンプリングレートは2MHzとなる。

 なにしろ処理が単純(面倒なことはパソコンで済ませてあるだけだが)なので、サンプリングレートは(CPUの能力の割には)高い。
 高いサンプリングレートを生かして、PDMっぽい処理(誤差拡散?)で低いbit数を補ってやるといいかも。

 PIC16F88なら内蔵オシレータの周波数を変えられるから、それで出力波形の周波数を変えられるだろう。
 また、プログラムエリアの自己書き換えができる石であれば、動的にプログラムを生成してやることもできるだろう。この場合、発生波形の形状や周期の自由度は極めて高い。周波数などの変更に時間がかかるであろうのが難点。(PIC16F648Aの4Kwordのプログラムエリアを秋月ライタで書き換えるのに1分かかるぐらいだ)


今後の課題
・データ作成ルーチンで誤差拡散を行えるようにする。少数部分を積み上げればいいか?→やってみた
・同、量子化bit数を故意に落とせるようにする→やってみた
・簡単なローパスフィルタをつける

参考資料メモ
ディザ信号付加によるADコンバータの性能改善
http://www.national.com/JPN/an/AN/AN-804.pdf
D-Aコンバータの高域特性を改善する高域特性劣化のメカニズムと3つの対応策
http://www.ednjapan.com/content/issue/2006/07/content04.html



#電子工作 #途中経過

create : 2006/08/31 (Thu)
update : 2006/09/01 (Fri)