====== 簡易レベルメーター ======
===== 概要 =====
レベルメーター(LED10点)を作成しました。
今回は、ソフトウエアでの処理に重きを置きました。なのでハードウエアはとても単純になりました。
===== 動作原理 =====
通常は、ハードウエアで信号を【増幅】→【平滑】した後でPICでA/D変換しLEDを点灯させるのですが、今回は【平滑】回路を使用せずにソフトウエアで信号のレベルを判定します。
- 信号を30個取り込む
- その内から最大値と最小値を求める
- 最大値と最小値の差を求める
- その差に応じてLEDを点灯させる
===== 回路図 =====
10kΩのボリュームを廻してコレクタ電圧が約2.5Vになるように調整します。
そうすると信号に応じてコレクタ電圧が2.5Vを中心に変化することになります。
信号は、トランジスタで約10倍に増幅された後PICに入力されます。
{{:imgpaste:202004:htmikan-20200429-162751.png}}
===== ソースコード =====
//**********************************************************************
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)
{{:imgpaste:202004:htmikan-20200429-162937.png?500}}
小さな信号を入力しました。2.5Vを中心に振幅しますね。
{{:imgpaste:202004:htmikan-20200429-163006.png?500}}
大きな信号を入力しました。
{{:imgpaste:202004:htmikan-20200429-163020.png?500}}
更に大きな信号を入力しました。上下がつぶれました。
{{:imgpaste:202004:htmikan-20200429-163035.png?500}}
PICにこの電圧を入力し、LEDを点灯させます。
LEDは秋月電子で購入した10点セットのものを利用しました。
{{:imgpaste:202004:htmikan-20200429-163050.png?500}}
CDプレイヤーを接続し、音楽信号を入力してみました。中々宜しいようで... ^_^
{{:imgpaste:202004:htmikan-20200429-163105.png?500}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]