====== 簡易レベルメータ(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]]