PICマイコン(12F509)にR-2R DACを外付けしたサイドトーン発振回路
昨日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
#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)
// Use project enums instead of #define for ON and OFF.
32, 38, 51, 54, 55, 54, 51, 38, 32, 18, 5, 2, 1, 2, 5, 18
};
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
{
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