10F222 + 3bit R-2R DACによる正弦波サイドトーン発振回路

45円のPIC10F222-I/Pを使った正弦波サイドトーン発振回路を検討してみました.出力に使えるGPIOは3本しかありませんので,3bitです.

回路図

回路図です.GP2〜GP0の3bitで正弦波データを出力してR-2R DACを通し,遮断周波数800Hzの2次LPFで正弦波を復元するものです.LPF先頭の抵抗は,設計上の値は36kΩですが,DACの出力インピーダンスが10kΩありますので,これを差し引いて27kΩとしました.ブレッドボード試作では,出力段の1μFと10kΩ半固定抵抗を省略しています.

ソースコード(ライセンス:CC BY-NC-SA 4.0 International)は以下のとおりです:

/*
 * File:   sidetone222.c
 * Author: JH5ESM, Cosy MUTO
 * License: CC BY-NC-SA 4.0 International
 * Copyright (c) 2025, Cosy MUTO (aka JH5ESM)
 *
 */

// PIC10F222 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config IOSCFS = 4MHZ    // Internal Oscillator Frequency Select bit (4 MHz)
#pragma config MCPU = ON        // Master Clear Pull-up Enable bit (Pull-up enabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code protection bit (Code protection off)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

const unsigned char wave[] = {4, 6, 7, 6, 4, 2, 1, 2};

void main(void) {
    int i = 0;
    
    OSCCAL = 0b00000000; // GP2 as GPIO
    OPTION = 0b10000000; // Weak pull-up enabled on GP3, GP1 & GP0 / GP2 as GPIO
    ADCON0 = 0b00001100; // AD off, GP0 & GP1 as GPIO
    TRIS   = 0b00001000; // Input setting for GP3
    GPIO   = 0b00001100; // Initial output

    while(1)
    {
        if(GP3){
            GPIO = 12; // 0b00001100 キーアップ時はVDD/2を出力
            i = 0;     // キーダウン時はwave[0]からスタート
        }else{
            GPIO = wave[i];
            i = (i + 1) % 8;
            __delay_us(100);
        }
    }    
}

hexファイルはこちらからダウンロード可能です.

トーン周波数700Hzの場合は,__delay_us()の引数を130程度にして下さい(要調整).

DAC出力波形

DAC出力波形です(LPFとの接続を外して測定).3bit 8ポイントですので,正弦波というより三角波の方が近いかも.事実,DAC出力に0.018μFを付けて平滑化してもピーククリップした三角波しか得られませんでした.

LPF出力波形

LPF出力波形です.見てわかるような歪のない正弦波が得られました.DAC出力端子の波形は元の階段状波形から歪んでいますが,実際はDAC出力波形ではなくLPF先頭の抵抗設計値(36kΩ)を10kΩ:27kΩで分割した点の電圧を見ているためです.余っているOPアンプでバッファを作って間に挟めば(この場合27kΩは設計値どおりの36kオームに変更),きれいな階段状のままになります.バッファを間に置くかどうかは趣味の問題ですね.

LPF出力のFFT結果

LPF出力のFFT結果です.高調波,スプリアスとも45dB程度以上抑圧できていて,ちょっとビックリしました.

3種類のサイドトーン発振回路を検討しましたが,実機ではどれを使いましょうかね?この記事をご覧の皆さんはどうしますか?

関連記事

 

AR de JH5ESM VA