ステレオレベルメータ(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チャンネルをバー表示します。
回路図
ソースコード
- LevelMeter2.c
//********************************************************************** /* <ステレオレベルメーター(16点)> */ //********************************************************************** 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, ' '); } } } //**********************************************************************




