ステレオレベルメータ(LCD)

概要

以前に10点LEDの簡易レベルメータを作成しましたが、今回はステレオに対応し、表示はLCD(16文字2行)を使用しました。

動作原理

<信号を増幅する>

入力される信号(交流:AC)をトランジスタで増幅(約5倍)します。

この時、コレクタ電圧は、約2.5Vを中心に±と振幅します。

<信号の大きさを求める>

PICのA/D変換機能を利用して、増幅されたRチャンネルとLチャンネルの信号を各々100回取り込みます。

その間の最大値と最小値を求めます。

そして最大値と最小値の差より信号の大きさを求めます。

<信号の大きさをLCDにバー表示する>

求めたRチャンネルおよびLチャンネルの信号を16段階に階調します。

LCDの1行目にRチャンネル、2行目にLチャンネルをバー表示します。

回路図

ソースコード

//********************************************************************** /* ＜ステレオレベルメーター（１６点）＞ */ //********************************************************************** unsigned int adR, adL; void measurement() { unsigned int maxR, minR, maxL, minL; unsigned char cnt; // maxR = 0; minR = 1024; maxL = 0; minL = 1024; for (cnt = 0; cnt < 100; cnt++) { adR = Adc_Read(1); adL = Adc_Read(2); maxR = maxR < adR ? adR : maxR; minR = minR > adR ? adR : minR; maxL = maxL < adL ? adL : maxL; minL = minL > adL ? adL : minL; } adR = maxR - minR; adL = maxL - minL; } //********************************************************************** void main() { unsigned char buf[10], cnt, tmpR, tmpL; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000110; // AD1,2を使用する。 TRISA = 0b00111110; TRISB = 0b00001111; // Lcd_Custom_Config(&PORTB, 4, 5, 6, 7, &PORTA, 0, 7, 6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Out(1, 1, "LevelMeterV2 "); Lcd_Custom_Out(2, 1, " JF3SFB 2007.12"); Delay_ms(1000); Lcd_Custom_Cmd(LCD_CLEAR); // while (1) { measurement(); // tmpR = adR / 54; tmpL = adL / 54; for (cnt = 0; cnt < 16; cnt++) { if (tmpR > cnt) Lcd_Custom_Chr(1, cnt + 1, 0xFF); else Lcd_Custom_Chr(1, cnt + 1, ' '); // if (tmpL > cnt) Lcd_Custom_Chr(2, cnt + 1, 0xFF); else Lcd_Custom_Chr(2, cnt + 1, ' '); } } } //**********************************************************************

動作確認

いつものブレッドボードで動作確認しました。

PICとLCD周りの配線です。制御信号は7本だけです。

トランジスタによるアンプ周りの配線です。

実際にMDウォークマンから信号を入力してみました。

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細 This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details