文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== 簡易レベルメーター ====== ===== 概要 ===== レベルメーター(LED10点)を作成しました。 今回は、ソフトウエアでの処理に重きを置きました。なのでハードウエアはとても単純になりました。 ===== 動作原理 ===== 通常は、ハードウエアで信号を【増幅】→【平滑】した後でPICでA/D変換しLEDを点灯させるのですが、今回は【平滑】回路を使用せずにソフトウエアで信号のレベルを判定します。 - 信号を30個取り込む - その内から最大値と最小値を求める - 最大値と最小値の差を求める - その差に応じてLEDを点灯させる ===== 回路図 ===== 10kΩのボリュームを廻してコレクタ電圧が約2.5Vになるように調整します。 そうすると信号に応じてコレクタ電圧が2.5Vを中心に変化することになります。 信号は、トランジスタで約10倍に増幅された後PICに入力されます。 {{:imgpaste:202004:htmikan-20200429-162751.png}} ===== ソースコード ===== <code c LevelMeter.c> //********************************************************************** 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); } } //********************************************************************** </code> ===== 動作確認 ===== いつものようにブレッドボードで動作確認です。 先ずは、トランジスタのコレクタ電圧を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}} <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖した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]] </callout> elechobby/picdic/pic16f88/51.txt 最終更新: 2025/10/17 14:29by 127.0.0.1