ちょっと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が部品箱にありますよ〜という備忘録でした。

(おしまい)