ちょっとTea Time!? uPD6376を動かしてみる【備忘録】 2025.5.8
パーツケースの中を整理していたら、こんなDACが見つかりました。
NECの16ビットのDACです。
おそらく、面白そうだからかってみたものの、そのまま放置していたのでしょう。
折角なので、調べてみましょう。
こんなDACがありました。
この紙切れが入っていたので、どうやら秋月で購入したもののようです。
すでに、いまでは商品リストからはなくなっています。
データシートを探してみてみると、Resister String Configurationとなっているので、おそらくはいまでは珍しいR-2R型のDACと思われます。
さらにDAC単体であり、ディジタルフィルタもありません。となると、これを単独でうごかすのは恐らくないでしょう。
いまでは珍しいR-2R方式だと思われます。データシート:upd6376.pdf
この素子単体をオーディオ用DACとして使う場合は、右詰め16Bitフォーマットであれば動作しそうです。
いまでは懐かしいNOSDAC(オーバサンプリング無し)として使えるでしょうか。まあ、それも今ではないでしょう。
ただ、デルタΣ方式ではないこともあり、いわゆる汎用のDACとしてはつかえそうです。
それに便利なように、このuPD6376ではパラレル入力というものが用意されています。
これは、L,R信号を時分割で送信するのではなく、同時に送り込むものです。
こうすることによって、より高速に出力を得ることができます。
オーディオ用として使うには、右詰め16Bitフォーマットに限定されてしまいます。
L,Rのパラレル入力もできるのでDACとしてつかうならこちらの方が高速な出力が可能です。
動かしてみましょう!
夜も遅いけど、動作確認程度にうごかすには時間もかからないでしょうから、
早速ブレッドボードに実装です。
簡単にPICにつないで動かしてみることにしました。
動作プログラムは下記のような感じです。太字がDACのアクセスのサブルーチンです。
// // uPD6376動作テスト // #include "18F27Q43.H" #fuses RSTOSC_HFINTRC_64MHZ,PROTECT,NOMCLR,NOLVP #use delay(internal=64MHz) #use fast_io(A) #use fast_io(B) #use fast_io(C) # #define CLK PIN_B0 #define LSI PIN_B1 #define RSI PIN_B2 #define WDCK PIN_B3 void io_select() { output_drive(CLK);output_low(CLK); output_drive(LSI); output_drive(RSI); output_drive(WDCK);output_low(WDCK); } void da_out(int16 ldata,int16 rdata) { int i; int16 j; j=0x8000; for(i=0;i<16;i++){ if(j&ldata) output_high(LSI); else output_low(LSI); if(j&rdata) output_high(RSI); else output_low(RSI); output_high(CLK); output_low(CLK); j = j >> 1; if(i==3) output_high(WDCK); } output_low(WDCK); } void main() { setup_oscillator(OSC_HFINTRC_64MHZ); // slow starf io_select(); while(1){ da_out(0x0000,0x0000); da_out(0x7fff,0x2000); da_out(0x8000,0x4000); da_out(0x0000,0x6000); } } |
問題なく、出力が得られました。64MHzでPICを動かして、およそ40usでDAC出力が得られる感じです。
あまり高速ではありませんが、出力電圧を変えたい用途などにはいいでしょう。
およそ40us程度の間隔でDAC出力ができそうです。
まあ、こういったDACが部品箱にありますよ〜という備忘録でした。
(おしまい)