簡易歪率計アダプタ

概要

オシロスコープや発信器は、メーカー製品を持っているのですが、歪率計は持っていません。 そこで今回は簡易的に歪率を測定するアダプタを作成してみました。

動作原理

増幅器の歪には、

周波数歪(frequency distortion)

位相歪(phase distortion)

非直線歪(nonlinear distortion)

の3種類がありますが、今回は非直線歪を簡易的に測定します。

歪率計の基本的な構成は、下図のようになっています。

今回は簡易的に済ませるために、発振器部分は作成せずに、手持ちのメーカー製の発信器を使いました。 従って、実際に作成した部分はノッチフィルタ(ツインT型)とPICによるACミリボルト計です。 精度は、信号源電圧が1Vの時に、≒0.24%になります。

A/D変換のVref=2.5V

A/D変換の分解能力=1024

0.24%≒((2.5V÷1024)÷1V)×100

回路図

ノッチフィルタ部分の抵抗とコンデンサを替えることにより、ノッチ周波数を変更できます。 詳しくは、ノッチフィルタ(NotchFilter)を参照してください。

ソースコード

//********************************************************************** /* ＜歪率計＞ */ //********************************************************************** unsigned int measurement(unsigned short channel) { unsigned int ad, max, min; unsigned char cnt; // ad = 0; max = 0; min = 1024; for (cnt = 0; cnt < 100; cnt++) { ad = Adc_Read(channel); max = ad > max ? ad : max; min = ad < min ? ad : min; } return (max - min); } //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void main() { unsigned int ad2, ad3; unsigned long ad2l, ad3l, tmp; double ad2d, ad3d; unsigned char buf[20], cnt, len; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00001100; // AD2,3を使用する。 TRISA = 0b00111100; TRISB = 0b00001111; OPTION_REG.F7 = 0; ADCON1.VCFG0 = 0; ADCON1.VCFG1 = 1; // Lcd_Custom_Config(&PORTA, 1, 0, 7, 6, &PORTB, 4, 5, 6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); // Lcd_Custom_Out(1, 1, "DistortionAnalyz"); // Lcd_Custom_Out(2, 1, " JF3SFB 2008.1"); Delay_ms(100); Lcd_Custom_Cmd(LCD_CLEAR); // Pwm_Init(10000); // 10kHz Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); // while (1) { if (PORTB.F3 == 0) { // ad2 = measurement(2); WordToStr((ad2 * 25) / 10, buf); Lcd_Custom_Out(1, 1, buf); Lcd_Custom_Out(1, 6, "mV"); // ad3 = measurement(4); WordToStr((ad3 * 25) / 10, buf); Lcd_Custom_Out(1, 9, buf); Lcd_Custom_Out(1, 14, "mV"); // for (cnt = 0; cnt < 16; cnt++) { if (ad3 > cnt) buf[cnt] = 0xFF; else buf[cnt] = ' '; } buf[16] = 0x00; Lcd_Custom_Out(2, 1, buf); continue; } ad2 = 0; for (cnt = 0; cnt < 25; cnt++) { ad2 += measurement(2); } // ad2 = (ad2 / 25) * 2.5; ad2 = ad2 / 10; // ad3 = 0; for (cnt = 0; cnt < 25; cnt++) { ad3 += measurement(4); } // ad3 = (ad3 / 25) * 2.5; ad3 = ad3 / 10; // Lcd_Custom_Cmd(LCD_CLEAR); // WordToStr(ad2, buf); Lcd_Custom_Out(1, 1, buf); Lcd_Custom_Out(1, 6, "mV"); // WordToStr(ad3, buf); Lcd_Custom_Out(1, 9, buf); Lcd_Custom_Out(1, 14, "mV"); // ad2l = ad2; ad3l = ad3; tmp = (ad3l * 10000) / ad2l; WordToStr((unsigned int)tmp, buf); buf[5] = buf[4]; buf[4] = buf[3]; buf[3] = '.'; buf[6] = 0x00; Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 7, "%"); } } //**********************************************************************

動作確認

蛇の目基板3枚を使って組み立てました。

PICによる電圧の測定と歪率の計算部分(左)

オペアンプによるツインT型ノッチフィルタ部分(右下)

三端子レギュレータの7805と7905による±5Vの電源部分(右上)

調整は至って簡単です。

ノッチ周波数の数倍程度の信号を入力し、V2(右側の電圧)が約1Vになるように発信器の出力を調整する。

次に10kΩのボリュームを回して、V1をV2と同じにする(つまり歪率100%)。

発振器の周波数をノッチ周波数に合わせる。

これで完了です。

ツインT型ノッチフィルタ部分を拡大したところです。 今回は、手持ちの抵抗やコンデンサを利用したので精度があまり良くありません。 出来れば、抵抗もコンデンサも精度が±1%のものを使用してください。

PIC部分を拡大したところです。 8ピンのソケットにダイオードをさしています。当初、ダイオードを使わずにLM386で増幅した電圧をA/D変換 するつもりでしたが、利得が20倍とありすぎたのでダイオードによる半波整流に変更しました。

電源部分を拡大したところです。三端子レギュレータ(7805,7905)を利用した±5Vの電源です。

メーカー製の発振器より信号を入力してみました。 流石に歪率は低いですね。

ノッチ周波数に発信器の周波数を合わせる場合には、微妙な調整が必要となりますので2.5mV単位の バー表示機能を搭載しました。黄色のスイッチを押すとバー表示モードになり合わせやすくなります。

如何ですか? 自作のオーディオアンプの性能が気になる方は、このように簡易な物ですが、手元にあれば宜しいかと。。。