PICマイコン(12F509)にR-2R DACを外付けしたサイドトーン発振回路

Initial release: 26 Jan. 2025
Revised: 27 Jan. 2027

昨日12F1571の内蔵DACを利用したサイドトーン発振回路を記事にしましたが,入出力レールtoレールのOPアンプが必要でその分コストがかかります.この記事ではDACを内蔵しない旧式のPICマイコンで正弦波サイドトーン発振回路を作ってみることにします.DAコンバータは外付けのR-2R抵抗ラダーで構成し,キャパシタ1個を付加してLPFも構成することにします.

部品箱にはPIC12F509-I/Pがありましたので,GP3を除いたGPIO 5bit分(GP5/4/2/1/0)を使うことにしました.

テスト回路とブレッドボード試作状況(LPF用キャパシタ未実装:ブレッドボード外に置いている)です.R-2Rは10kΩ/20kオームを使いました.LPFはR-2Rの出力インピーダンス(10kΩになります)と0.018μFとで構成します.この定数で遮断周波数は885Hzになります.

プログラムのソースコードです(ライセンスはCC BY-NC-SA 4.0 International):

/*
 * File:   sidetone509.c
 * Author: JH5ESM, Cosy MUTO
 * CC BY-NC-SA 4.0 International
 * https://creativecommons.org/licenses/by-nc-sa/4.0/
 *
 * Created on 2025/01/26, 9:37
 */

// PIC12F509 Configuration Bit Settings
 
// 'C' source line config statements
 
// CONFIG
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
#pragma config WDT = 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 input, 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
 
unsigned char wave[] = {
    32, 38, 51, 54, 55, 54, 51, 38, 32, 18,  5,  2,  1,  2,  5, 18
};
 
void main(void) {
    OSCCAL = 0b00000000; //
    OPTION = 0b10000000; // Weak pull-up enabled on GP3, GP1 & GP0 / GP2 as GPIO
    TRIS   = 0b00001000; // Input setting for GP3
    GPIO   = 0b00101000; // Initial output
 
    int i = 0;
 
    while(1)
    {
        if(GP3){
            GPIO = 40; // 0b00101000
            i = 0;
        }else{
            GPIO = wave[i];
            i = (i + 1) % 16;
            __delay_us(40);
        }
    }    
}

配列 wave[] に設定する値は,本来の5ビット波形データの上位2ビット(b4, b3)をそれぞれ1ビット左シフトし,空いたb3に0を設定して6ビットデータ化したものを10進数に戻したものです.これはGP3が入力端子になっているためです.キーアップ時は\(V_{DD}/2\)を出力します.発振周波数は__delay_us()の引数で調整します.上記は800Hzの場合です.700Hzがお好みでしたら,__delay_us(52) とします(要調整).

上記のhexファイルはこちら

出力波形です.上段がキャパシタなしの場合,下段が0.018μFでLPFを構成した場合です.

実際に使用する場合は,下図のようにすればよいでしょう:

 

上段はR-2Rラダーを個別部品で構成する場合,下段はBOURNSのR-2R集合抵抗4610X-R2R-103LF(マルツやDigi-Key,Mouserで入手可能)を用いる場合です.4610X-R2R-103LFは8bit用ですのでデータは上位5ビットに入力し,下位3ビットは接地します.出力は50kΩ半固定抵抗でレベル調整するようにしていますが,もし10kΩ半固定抵抗を使うのでしたらLPF構成用のキャパシタは0.022μFではなく0.033μFにします.

関連記事


AR de JH5ESM VA