プログラム
ここでは、DA変換機能を利用して正弦波を出力します。まず、wav[65] の配列に1周期分の正弦波の値を記録しておきます。関数の sin()
を利用しますから、#include <math.h> で関数定義を読み込んでおきます。
sin()の値を127倍すると、-127〜+127 になります。これに、128を加えると、0〜255 の範囲の整数になります。実際には次のようなプログラムになります。
for(i=0;i<=64;i++){
wav[i]=(int)(127.0*sin(2.0*3.14*i/64.0)+128.0);
}
この値は、予め、計算して配列に記録しておく必要があります。PIC873は、整数の掛け算回路もソフトで計算します。少数やsin()の計算もすべてプログラム処理になります。したがって、sin()
の計算を行うには ミリ秒程度の計算時間がかかってしまいます。複雑な計算は予め行い、配列に記憶しておけば、実際の処理では配列の値を読むだけで値を取得できます。
while() ループの中の for の繰り返しで予め計算した配列 wav[] の値を ポートB に出力します。この値は、ポートBni接続された
AD557 でアナログ電圧に変換され正弦波として出力されます。正弦波の周期は、for() ループの中の遅延関数 delay_us(35) で決定されます。これは、35マイクロ秒の遅延で、64回の繰り返しで1周期ですから、2.24m秒
の周期です。これは周波数にすると、約440Hz(Hzはヘルツ:周波数の単位)になります。これは、音程ではラの音で時報の音の高さになります。
//AD557 8bits DAConverter
//PB7>D1 .. PB0>D0 注意:DACのBIT8をPB0へ
//PA1>CE,PA2>CS,
//Vout>VoutSemceA>VoutSenceB
//Vout 0..2.5V
#include <16F873A.h>
#include <math.h>
#fuses HS,NOWDT,NOLVP,BROWNOUT,PUT
#use delay(CLOCK = 20000000)
#use fast_io(B)
#use fast_io(A)
int i;
int wav[65];
void main()
{
set_tris_b(0x00);
set_tris_a(0xfe);
for(i=0;i<=64;i++){
wav[i]=(int)(127.0*sin(2.0*3.14*i/64.0)+128.0);
}
while(1){
output_high(PIN_A0);
for(i=0;i<=64;i++){
output_b(wav[i]);
delay_us(35);
}
output_low(PIN_A0);
}
}