====== 簡易レベルメータ(LED×12個) ====== ===== 概要 ===== 8ピンのPIC(PIC12F683等)は、ポート数が少ないため多くのLEDを接続点灯させることが出来ません。 従って、多数のLEDを点灯させるようなレベルメータには、あまり向いていません。 そこで、少ないポート数で、より多くのLEDを点灯させる方法はないものかと調べてみますと、“先人の知恵"を発見しました。 マイクロチップ社のアプリケーションノート「TB029」では、4個のポートで、12個のLEDを点灯させる方法が掲載されていました。 早速、これを応用した、簡易レベルメータを製作してみました。 <仕様> * 入力チャネルは、1チャネルとします。 * 点灯させるLEDは、12個とします。 * 入力電圧範囲は、0~5Vとします。 ===== 動作原理(ハードウェア) ===== LEDの接続 下図のように、4個のポートに12個のLEDを接続します。 {{:imgpaste:202004:htmikan-20200429-141521.png}} LED1~LED12までを点灯させる時の、各ポートの設定は、下表のようになります。 |<400px>| ^ ^ ポート1 ^ ポート2 ^ ポート3 ^ ポート4 ^ ^ LED1 | 1 | 0 | - | - | ^ LED2 | 0 | 1 | - | - | ^ LED3 | 1 | - | 0 | - | ^ LED4 | 0 | - | 1 | - | ^ LED5 | 1 | - | - | 0 | ^ LED6 | 0 | - | - | 1 | ^ LED7 | - | 1 | 0 | - | ^ LED8 | - | 0 | 1 | - | ^ LED9 | - | 1 | - | 0 | ^ LED10 | - | 0 | - | 1 | ^ LED11 | - | - | 1 | 0 | ^ LED12 | - | - | 0 | 1 | ※“-"は、ポートを入力モードにします。 ===== 動作原理(ソフトウェア) ===== * アナログデータ変換処理\\ 1チャネル(AN2使用)を、A/D変換(10ビット)します。 * LED点灯処理\\ A/D変換した値(0~1023)を、79で割って、0~12の値に変換します。\\ 変換した値に応じて、LEDをダイナミック点灯(周期≒1msec)させます。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-141916.png}} ===== ソースコード ===== //********************************************************************** char table_io[13] = { 0b00000000, //Led non 0b00000001, //Led 1 0b00000010, //Led 2 0b00000001, //Led 3 0b00010000, //Led 4 0b00000001, //Led 5 0b00100000, //Led 6 0b00000010, //Led 7 0b00010000, //Led 8 0b00000010, //Led 9 0b00100000, //Led 10 0b00010000, //Led 11 0b00100000 //Led 12 }; char table_tris[13] = { 0b00111111, //Led non 0b00111100, //Led 1 0b00111100, //Led 2 0b00101110, //Led 3 0b00101110, //Led 4 0b00011110, //Led 5 0b00011110, //Led 6 0b00101101, //Led 7 0b00101101, //Led 8 0b00011101, //Led 9 0b00011101, //Led 10 0b00001111, //Led 11 0b00001111 //Led 12 }; //********************************************************************** //■■■メイン関数■■■ void main() { int cnt, ad; // OSCCON = 0b01110000; CMCON0 = 0b00000111; ANSEL = 0b00000100; TRISIO = 0b00001001; // for (cnt = 0; cnt <= 12; cnt++) { TRISIO = table_tris[cnt]; GPIO = table_io[cnt]; Delay_ms(100); } // while (1) { ad = Adc_Read(2); ad /= 79; for (cnt = 0; cnt <= ad; cnt++) { TRISIO = table_tris[cnt]; GPIO = table_io[cnt]; Delay_ms(1); } } } //********************************************************************** ===== 動作確認 ===== ※配線がLEDを跨っているので少し分かりずらいです {{:imgpaste:202004:htmikan-20200429-142025.png?500}} 10バーLEDアレイを2個使用しました。(8個のバーは使用しません) {{:imgpaste:202004:htmikan-20200429-142053.png}}{{:imgpaste:202004:htmikan-20200429-142057.png}} 12バーを全てを点灯させてみました。 アナログ入力端子に信号を入れるとLEDの点灯数が信号の強弱に合わせて変化します。 {{:imgpaste:202004:htmikan-20200429-142105.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]]