目次

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

概要

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

動作原理

<信号を増幅する>

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

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

回路図

ソースコード

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, ' ');
		}
	}
}
 
//**********************************************************************

動作確認

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

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

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

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

著作権表示 copyright notice

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