====== ステレオレベルメータV3(片チャンネル80ドット) ======
===== 概要 =====
以前にも、LED10ドット表示の簡易レベルメータ、LCD16ドット表示のステレオレベルメータ(LCD)等を製作しました。
今回は、更に分解能を80ドットまで上げてみました。
<仕様>
* ステレオ対応(Lチャネル、Rチャネル)
* 分解能は、80ドット
* 表示周期は、約0.1秒(1秒間に10回)
* 周波数帯域は、約10Hz~100kHz
===== 動作原理 =====
通常、よく使われLCDは、16文字×2行、1文字の構造は、5ドット×8ドットなので、工夫すれば、片チャンネル80ドットのレベルメータが出来ます。
その工夫とは、CGRAMを使用し、1文字で、5段階を表示させるようにすることにより、5段階×16文字で80ドットを表示させることです。
※CGRAMの詳細な使い方については、CGRAM活用(キャラクタ表示LCD)を参照してください。
{{:imgpaste:202004:htmikan-20200430-090945.png?500}}
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200430-091012.png}}
===== ソースコード =====
//**********************************************************************
/*
『ステレオレベルメータV3(80ドット)』
*/
//**********************************************************************
#define LED PORTB.F0
#define ON 1
#define OFF 0
//**********************************************************************
const char character1[] = {16,16,16,16,16,16,16,16};
const char character2[] = {24,24,24,24,24,24,24,24};
const char character3[] = {28,28,28,28,28,28,28,28};
const char character4[] = {30,30,30,30,30,30,30,30};
const char character5[] = {31,31,31,31,31,31,31,31};
void RegistCustomChar()
{
char i;
//
LCD_Cmd(64);
for (i = 0; i<=7; i++) {
LCD_Chr_Cp(character1[i]);
}
for (i = 0; i<=7; i++) {
LCD_Chr_Cp(character2[i]);
}
for (i = 0; i<=7; i++) {
LCD_Chr_Cp(character3[i]);
}
for (i = 0; i<=7; i++) {
LCD_Chr_Cp(character4[i]);
}
for (i = 0; i<=7; i++) {
LCD_Chr_Cp(character5[i]);
}
LCD_Cmd(LCD_RETURN_HOME);
}
//**********************************************************************
void BarDisp(char index, unsigned int dat)
{
short i, j, k, cnt;
//
i = (dat * 10) / 128;
j = i / 5;
k = i - (j * 5);
//
if (index == 1)
Lcd_Cmd(LCD_FIRST_ROW);
else
Lcd_Cmd(LCD_SECOND_ROW);
//
for (cnt = 1; cnt <= j; cnt++) {
Lcd_Chr_Cp(4);
}
Lcd_Chr_Cp(k);
for (cnt++; cnt <= 16; cnt++) {
Lcd_Chr_Cp(' ');
}
}
//**********************************************************************
unsigned int adR, adL;
void measurement()
{
unsigned int maxR, minR, maxL, minL;
unsigned int cnt;
//
maxR = 0;
minR = 1024;
maxL = 0;
minL = 1024;
for (cnt = 0; cnt < 300; cnt++) {
adR = Adc_Read(0);
adL = Adc_Read(1);
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()
{
char buf[6];
//
OSCCON = 0b01110000; // クロックは8Mhz
CMCON = 0b00000111; // コンパレータは使用しない。
ANSEL = 0b00000011; // A/D変換を使用する。
TRISA = 0b11111111;
TRISB = 0b00000000;
//LCDの初期化
Lcd_Config(&PORTB, 3, 1, 2, 7, 6, 5, 4);
RegistCustomChar();
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Cmd(LCD_CLEAR);
//
while (1) {
LED = ON;
measurement();
LED = OFF;
//
BarDisp(1, adR);
BarDisp(2, adL);
}
}//~!
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200430-091125.png?500}}
左側から、LM386、LM386、PIC16F88、LCDです。
{{:imgpaste:202004:htmikan-20200430-091139.png?500}}
左側:10Hz、右側:100Hz
{{:imgpaste:202004:htmikan-20200430-091210.png}}{{:imgpaste:202004:htmikan-20200430-091213.png}}
左側:1kHz、右側:10kHz
{{:imgpaste:202004:htmikan-20200430-091218.png}}{{:imgpaste:202004:htmikan-20200430-091221.png}}
左側:100kHz、右側:200kHz→この辺までなら、実用上問題なさそうですね。
{{:imgpaste:202004:htmikan-20200430-091227.png}}{{:imgpaste:202004:htmikan-20200430-091231.png}}
左側:300kHz、右側:400kHz→この辺になると、レベルがかなり低下してしまいます。
{{:imgpaste:202004:htmikan-20200430-091238.png}}{{:imgpaste:202004:htmikan-20200430-091241.png}}
入力にMDプレーヤを接続してみました。
{{:imgpaste:202004:htmikan-20200430-091249.png}}
如何ですか?
80ドットなので、かなり滑らかに変化します。中々宜しいようで。。。^_^
このページは稲崎様の閉鎖した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]]