PICマイコンのDACを使ったサイドトーン発振回路

Initial release: 25 Jan. 2025
Update: 26 Jan. 2025

CWトランシーバ(送信機)の付属回路にサイドトーン発振回路があります.キーイング操作に合わせて低周波発振器を動作させ,音声出力からキーイングのモニタをするためのものです(こんなことは言わなくてもここを見に来る人ならご存知のはずですが).

古典的には移相発振回路やTwin-T発振回路,ウィーンブリッジ発振回路等が用いられていましたが,これをマイコンで作ってしまおうというのがこの記事の主題です.

最近のPICマイコンにはDAC(DA変換)がありますので,正弦波のテーブルを読み出してDACに出力してやれば簡単に正弦波信号を得ることができます.DDSの超簡易版といったところでしょうか.

テスト回路です.PICマイコンには12F1571を使いました.PICのDACモジュールはDA用の抵抗が出力端子にむき出しで出ていますので,出力はOPアンプのバッファで受ける必要があります.バッファ後段に1次LPFを挿入して階段状の波形を平滑化しています.12F1571のDACは5bitですし計測用信号源でもありませんので,正弦波テーブルは16点で作成しました(リンクは正弦波テーブルのスプレッドシート:操作する場合はダウンロードしてお使い下さい).

テスト回路

プログラムの主要部は次のとおりです(2025.01.26アップデート):

unsigned char wave[] = {16, 22, 27, 30, 31, 30, 27, 22, 16, 10, 5, 2, 1, 2, 5, 10};
int i = 0;
int main(void)
{    while(1)
    {
        if(RA5){
            DACCON1 = 16;
            i = 0;
        }
        else{
            DACCON1 = wave[i];
            i = (i + 1) % 16;
            __delay_us(51);
        }
    }    
}

キーアップ時に\(\,V_\mathit{DD}/2\,\)の直流電圧を,キーダウン時に\(\,V_\mathit{DD}/2\,\)を中心とした正弦波を出力するようにしています.

4MHzクロックでほぼ800Hzとなるように __delay_us() 関数を使っています.他の周波数にする場合は __delay_us() 関数の引数を調整して下さい.62〜64程度で700Hz近辺になるのではないかと思います(未検証).MPLABXのプロジェクトファイル一式はこちらです(MCCを使いましたので,各レジスタ設定や初期設定があちらこちらのファイルに分散しています).上記主要部のライセンスはCC BY-NC-SA 4.0 Internationalです.

オシロスコープで観測したDAC出力とLPF出力です.見た目きれいな正弦波が得られていることがわかります.

実回路では下図のようにするのが良いでしょう(電源ラインのパスコンは記載を省略していますが,実機ではもちろん配置します):


実際に動作させているサンプル動画です:

動画中のエレキーはesmKeyer222(計画編実機製作編),ブレッドボード右側にはテスト用にNJM2073DのBTLアンプを配置しています.符号は“lorem ipsum”です.


今回は12F1571を使いましたが,OPアンプを2個内蔵した16F1705を使う方法もあります.ただし16F1705のDACは8bitですので,正弦波テーブルを修正する必要があります.正弦波テーブルスプレッドシートをダウンロードして開き,B2セル(bit数)を8に変更して得られたE列の値をソースコードのwave[]に与えます.またif文内キーアップ時のDACCON1の値(16)を128に変更します(2025.01.26アップデート).

関連記事

de JH5ESM VA