PICマイコンのDACを使ったサイドトーン発振回路
CWトランシーバ(送信機)の付属回路にサイドトーン発振回路があります.キーイング操作に合わせて低周波発振器を動作させ,音声出力からキーイングのモニタをするためのものです(こんなことは言わなくてもここを見に来る人ならご存知のはずですが).
古典的には移相発振回路やTwin-T発振回路,ウィーンブリッジ発振回路等が用いられていましたが,これをマイコンで作ってしまおうというのがこの記事の主題です.
最近のPICマイコンにはDAC(DA変換)がありますので,正弦波のテーブルを読み出してDACに出力してやれば簡単に正弦波信号を得ることができます.DDSの超簡易版といったところでしょうか.
![]() |
テスト回路 |
プログラムの主要部は次のとおりです(2025.01.26アップデート):
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です.
実回路では下図のようにするのが良いでしょう(電源ラインのパスコンは記載を省略していますが,実機ではもちろん配置します):
実際に動作させているサンプル動画です:
動画中のエレキーは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