elechobby:picdic:pic16f88:51

簡易レベルメーター

レベルメーター(LED10点)を作成しました。
今回は、ソフトウエアでの処理に重きを置きました。なのでハードウエアはとても単純になりました。

通常は、ハードウエアで信号を【増幅】→【平滑】した後でPICでA/D変換しLEDを点灯させるのですが、今回は【平滑】回路を使用せずにソフトウエアで信号のレベルを判定します。

  1. 信号を30個取り込む
  2. その内から最大値と最小値を求める
  3. 最大値と最小値の差を求める
  4. その差に応じてLEDを点灯させる

10kΩのボリュームを廻してコレクタ電圧が約2.5Vになるように調整します。
そうすると信号に応じてコレクタ電圧が2.5Vを中心に変化することになります。
信号は、トランジスタで約10倍に増幅された後PICに入力されます。

LevelMeter.c
//********************************************************************** 
 
void	main()
{
	static	unsigned	int		ad, adbuf[30], cnt, max, min;
	//
	CMCON = 0b00000111;
	ANSEL = 0b00000100;
	TRISA = 0b00111111;
	TRISB = 0b00000000;
	OSCCON = 0b01110000;
	//
	for (cnt = 0; cnt < 10; cnt++) {
		PORTB = 0b00000000;
		PORTA = 0b00000000;
		Delay_ms(100);
		PORTB = 0b11111111;
		PORTA = 0b11000000;
		Delay_ms(100);
	}
	while (1) {
		// アナログデータを30個読み込む
		for (cnt = 0; cnt < 30; cnt++)
			adbuf[cnt] = Adc_Read(2);
		// その30個のデータから最大値と最小値を求める
		max = 0;
		min = 1024;
		for (cnt = 0; cnt < 30; cnt++) {
			max = (max < adbuf[cnt]) ? adbuf[cnt] : max;
			min = (min > adbuf[cnt]) ? adbuf[cnt] : min;
		}
		// 最大値と最小値の差を求める 
		ad = (max - min) / 100;
		// 
		switch (ad) {
		case 0:
			PORTB = 0b11111110;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 1:
			PORTB = 0b11111100;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 2:
			PORTB = 0b11111000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 3:
			PORTB = 0b11110000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 4:
			PORTB = 0b11100000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 5:
			PORTB = 0b11000000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 6:
			PORTB = 0b10000000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 7:
			PORTB = 0b00000000;
			PORTA.F6 = 1;
			PORTA.F7 = 1;
			break;
		case 8:
			PORTB = 0b00000000;
			PORTA.F6 = 0;
			PORTA.F7 = 1;
			break;
		case 9:
			PORTB = 0b00000000;
			PORTA.F6 = 0;
			PORTA.F7 = 0;
			break;
		}
		Delay_ms(10);
	}
}
 
//**********************************************************************

いつものようにブレッドボードで動作確認です。
先ずは、トランジスタのコレクタ電圧を10kΩのボリュームを廻して2.5Vに調整します。
下の輝線がGND(0V)レベルです。上の輝線がコレクタ電圧です。(1V/DIV)

小さな信号を入力しました。2.5Vを中心に振幅しますね。

大きな信号を入力しました。

更に大きな信号を入力しました。上下がつぶれました。

PICにこの電圧を入力し、LEDを点灯させます。
LEDは秋月電子で購入した10点セットのものを利用しました。

CDプレイヤーを接続し、音楽信号を入力してみました。中々宜しいようで… ^_^

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/pic16f88/51.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1