//********************************************************************** void Vdelay_us(unsigned char us) { unsigned char i; for (i = 0; i < us; i++) { Delay_us(1); } } //********************************************************************** void main() { unsigned char cnt, tm, v; unsigned int tmp, max; OSCCON = 0b01110000; // クロックは8Mhz CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000001; // A/D変換を使用する。 TRISIO = 0b00000001; GPIO = 0b00001000; v = 0; max = 0; while(1) { // 周波数を変化(約500Hz~40KHz)させながら電圧を測定し、MAX地点を調べる。 for (tm = 200; tm > 1; tm--) { tmp = 0; for (cnt = 0; cnt < 50; cnt++) { GPIO.F1 = 1; GPIO.F2 = 0; Vdelay_us(tm); GPIO.F1 = 0; GPIO.F2 = 1; Vdelay_us(tm); tmp += Adc_Read(0); } tmp = tmp / 50; if (max < tmp) { max = tmp; v = tm; } } // MAX地点の周波数で以降は発振させる。 while(1) { GPIO.F1 = 1; GPIO.F2 = 0; Vdelay_us(v); GPIO.F1 = 0; GPIO.F2 = 1; Vdelay_us(v); } } } //**********************************************************************