====== ステレオレベルメータ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]]