オーディオの回路で、歪を打ち消す回路、というものがたくさん考案されている。

 

確かに、誤差となるものが小さいほど、音が良いのではないかという気になる。

 

それはそうだ。

しかし、シールドケーブルを通しただけで、気になって仕方がないくらいの

音に悪影響があることを考えてほしい。

 

耳は特徴となる歪の大きさが小さいほど良く聞こえる「のではないか」

という仮定から、歪を小さくすることを行っているのだと思う。

 

もし、耳が、歪の大小はあまり関係がなく、特徴的なパターンに反応して

音を認識する、というのであれば。

 

そうすると、余計な作業はしないほうがいいことになる。

 

USB-DAC4のプログラムのうち、UART関連は自分でゼロから書き直しましたのでそこだけ公開

高速ですし、割り込みでも、メイン関数でも、どこから呼んでもバッファさえあれば

安定して動作すると思います。オーバーフローすると、前の文字を上書きしますが、

プログラムの動作のうち問題になるのは、前の文字が消え、一時的に文字の順番が変になるだけです。

それ以外の予期せぬ動作にはならないでしょう。

何が大事かというと__sync_add_and_fetchで、排他的な制御をしています。

CRLFを追加していますが、必要ないかもしれません。

 

ターゲットデバイス

PIC32MZ2048EFH064

 

 

// 2のN乗の数に設定する

#define UART_TXBUF_SIZE  2048

 

// 適当に

#define UART_MAX_LEN 128

 

uint8_t Ring[UART_TXBUF_SIZE] = { 0 };
#define UART_MASK (UART_TXBUF_SIZE - 1)

uint32_t UART_RingRead = 0;
uint32_t UART_RingWrite = 0;


void UART_Task()
{
    uint8_t c = Ring[UART_RingRead];
    if (c != 0)
    {
        if(!(U1STA & _U1STA_UTXBF_MASK))
        {
            // 1Byte送信
            U1TXREG = c;
            Ring[UART_RingRead] = 0;
            UART_RingRead = (UART_RingRead + 1) & UART_MASK;
        }
    }
}

void UART_Print(const char *pFormat, ...)
{
    
    char buf[UART_MAX_LEN];
    
    va_list args = { 0 };
    va_start(args, pFormat);
    
    int nLen = vsnprintf(buf, UART_MAX_LEN, pFormat, args);
    int nLen2 = nLen + 2;
    
    int cur = (__sync_add_and_fetch(&UART_RingWrite, nLen2) - nLen2) & UART_MASK;
    
    for(int i = 0; i < nLen; i++){
        Ring[cur] = buf[i];
        cur = (cur + 1) & UART_MASK;
    }
    Ring[cur] = 13;
    cur = (cur + 1) & UART_MASK;
    Ring[cur] = 10;
    
}

私の最新の取り組みです。

プロジェクト名 USB-DAC4

 

元のHPに置きます。

 

スペック

 

DACIC

BD34301  2個

コントローラ

PIC32MZ2048EFH064

クロック源

KC2520K22.5792等

 

他にもいろいろ工夫しています、

私のやってみたい工夫点を盛り込んだ基板です。

 

回路図と基板データを公開します。KiCAD8です。

オープンソースと同じ扱いにしますので、自由にお使いください。

2基板あって、セットで動くようになっています。

電源や、DAC以外の部分は別途必要です。

(コネクタ類が私のよく使うものになっていますので、編集したほうが便利だとは思います)

この基板の製造に必要なガーバファイルは出力して同梱してあります。パーツリストも入れてあります。

(プログラムは権利関係上自分で加工する必要があります、はんだ付けも基本することに)

 
 

基板製造はJLCPCBを使えば、10枚13ドルくらいで作ってくれるでしょう。

 

マイコンのプログラムは、権利関係上、公開できません。

電子うさぎ様のページのものを編集して使いました。

この基板のことを質問されても困ると思うので、自分で調べてください。

どうしても聞くなら当サイトでどうぞ。答えられる範囲で回答します。

電子うさぎ様に迷惑をかけないようにお願いします。

 

 

はんだ付けができて、プログラムが編集できれば、

できます。たしかにちょっとハードル高いかもしれません。

はんだ付けの難易度も高めですので(DACICのベタが熱容量が大きすぎる)基板製作時に編集しておくと

やりやすくなります。こても良いものを使うと楽です。

PICKit4か5が必要になると思います。

デジタル電源入力は、5Vを想定しています。

 

はんだ付けが困難なら、PCBgogoなどに実装を頼むのもありです。

PCBgogoに依頼する場合、向こうで部品を調達してもらう設定にすると、

指定した銘柄の互換の中国品を付けられてしまうことがあります。

私はその付けられたICが破損し、動作しなかったので、今度からは自分で実装部品を送ろうと思っています。

実装業者に依頼する場合、gogoのほうのファイルを使うとよいでしょう。

JLCPCBで作るときに0.3mmのVIAは樹脂埋めするよう指定しておいてください。

bd34301 はめっちゃ高いので最初は352がおすすめです。

 

データは開発中です。

自己責任でお願いします。

MPLABXで作った、CS8416とPCM1792AをSPIで操作するサンプルを元のページに公開しました。

 

ロータリーエンコーダや、赤外線リモコンのコントロールも入っています。

 

作ったのはだいぶ昔です。