PIC を利用したミュート回路の製作 (2007/8/7〜8/10)

(Last update:07/09/13)


まずはブレッドボードで動作確認
LED が順に点灯することを確認
基板表。
フォトカプラは秋月で8個100円で
売られているのに何故かソケット付け(笑)
基板裏
回路図
おまけ:動作確認ボード

きっかけ

 以前製作したデジタルアンプのポップノイズを完全に殺そうと試行錯誤し、リレーを使ってアンプからスピーカを切り離すことで一定の効果を得た。しかしこれでも完璧にポップ音を追放できたわけではなかった。

 もともとアンプ IC TA-2020 にはミュート端子とスリープ端子が用意されており、これらのピンや電源を制御することでより完璧なミュートが可能なはずである。そこで PIC を使ったミュート回路を製作することにした。


仕組み

 PIC を使い、スイッチが操作されたら一定の時間をおいて順にアンプや電子ボリュームに電源を制御する。まぁ、ミュート回路というよりも、むしろ「ソフト制御遅延電源」と言うべきか。具体的には、

(1) 電源ON時
 (電気的に)ミュートモードに設定 → 一定時間待つ → 電子ボリューム電源供給 → 一定時間待つ → アンプ電源供給 → ミュート解除

(2) 電源OFF時
 ミュートモードへ → 一定時間待つ → アンプ電源カット → 一定時間待つ → 電子ボリューム電源カット

 という処理を行う。これなら必要なポートは入力 1つ(スイッチ)、出力 3つなので 8pin の 12F629 で実現可能であろう。


管理人のアセンブラのスキル

 実は管理人は、かつてはバリバリのアセンブラ使いであった。古くは Z80 に始まり、SHARP X68000(MC68000) では主にアセンブラでプログラミングを楽しみ、しまいにはマルチタスクウインドウOS (SX-Window) 上で動くいっぱしのアプリケーションまでアセンブラで書いていたぐらいである(爆)。したがって今回は PIC のアーキテクチャと命令体系、アセンブラの仕様さえ勉強すればよい、という状態で開発に着手することに。


PIC アーキテクチャ 1st impression

 で、多少の書籍と Web の製作事例を見ながら早速勉強を開始。ざっと PIC の命令を眺めた印象だが、なんとも貧弱なコード体系に思えた。そもそも RISC 志向と言ってしまえばそれまでなのだが、35個の命令しかないのはとっつき易い反面、ちょっとした機能を実現するにも低級な命令を組み合わせる必要があってコーディングが面倒になることは容易に想像がつく。また条件分岐が弱いため、必然的にスパゲッティなコード(もはや死語?)を予感させる(Z80 ですら条件分岐先は可変だったのに ^^; )。それにスタックメモリが少ないのも案外苦心しそうな気がする。

 また汎用メモリ(ファイルレジスタ)とプログラムメモリが別空間だったり、ページやバンクまであって非常に面倒くさい。MC68000 の豊富な汎用レジスタ群、柔軟なアドレッシングモード、リニアなメモリ空間にとっぶりと慣れてしまっている身としては、どうにもアラばかりが目立つ。(やっぱり CISC な CPU の方が好きだなぁ)

 ま、しかしここはアーキテクチャ云々よりも、極めて安価かつ小型のチップで一通りのプログラミングができることを評価せねばなるまい。制限が多ければ多いほど工夫が必要だが、それも楽しみの1つであろう。ともかく概要は理解できたので、早速プログラミングに入ることに。


プログラミング

 電源の制御といっても最終的にはパワー MOS FET を ON/OFF できればいいので、結局はキー入力を待って、ポートの出力を適宜変化させるだけ。PIC プログラミングの観点から言えば基本中の基本、LED 点灯制御とやることは同じ ^^;。あとはスイッチのチャタリング防止と適当な時間待ちルーチンさえ揃えば出来上がるはず。

 そこで Web でサンプルとなるコードを探し、@こちらとAこちらで今回の目的にぴったりのサンプルを発見(作者さんに感謝)。2つのソースを融合させつつ、MPLAB の使い方や MPASM の書式を体得。おかげでまったくのゼロから始めて3時間程度でβバージョンが焼けた。

 早速ブレッドボード上にテスト用の回路を組んだのだが、ここでハプニング発生。電源を入れるとあの特有の焦げ臭い匂いが・・・。そう、ついつい通常の IC 感覚で 8 pin に Vcc を繋いでしまい(お約束 ? )、いきなり PIC を焼き殺してしまったのだ(南無・・)。まぁ、予備は買ってあったし、安いからよしとする(殴)

 それはともかく、若干のデバッグを経て動作確認が完了。見事に順にポートが制御されていく。あぁ、なんて簡単なんだ・・・ アセンブラでの開発自体も懐かさを感じる。チマチマとコードをチップに焼かなければならないのが面倒ではあるが、100円程度の、しかも電池でも動くちっぽけなコンピュータにしばし感動。(完全にハマりそうな予感・・・)


回路設計


 ポートの状態に応じて負荷を制御するだけだが、今回は FET 側が 12V と PIC 側よりも電圧が高いので、ドライブするにはどのみち一段クッションを入れるのが望ましい。またアンプ側と PIC 側は極力電気的にアイソレートしておきたかったので、フォトカプラを使って FET を制御することにした。またミュートは、TA-2020 のデータシートによればミュート端子を H にするかオープンにすればよい、とのことなので、オープンにする方向で設計。

 電源の制御はお約束の pチャンネルパワー MOS FET を使うわけだが、アンプには最大 4A 流れる可能性があるので、手持ちで極力 ON 抵抗の低い 2SJ471 を選択。対して電子ボリュームと LED レベルメータは 300mA もあれば十分なので手持ちの豊富な FX20ASJ-03 を使用することにした。

 ちなみに今回は3端子レギュレーターに 78L05 を使用したのだが、78M05 や 7805 とは IN と OUT のピン配置が逆という悪質なトラップ(笑)があることを、半田付け直前までスッカリ忘れていた。10年ぶりぐらいに使ったので、危うく間違えるところであった。アブナイアブナイ ^^;


動作検証

 というわけで早速アンプに組み込んでみた。電源 OFF はほぼ完璧なミュートが実現。電子ボリュームより先に確実にアンプの電源が切れるので、電子ボリュームの最後っ屁(汗)は確実に抑えることができた。

 対して電源 ON は・・・・ あまり解決せず(爆)。TA-2020 はミュートを使おうがスリープを使おうが「本気モード」に入る際にお構いなしにポップ音を出してしまう模様。管理人的には電源ON時のこのポップノイズは全然気にしていないのでよいのだが、どうしても消したいならスピーカを一定時間切り離すしかなさそうな雰囲気。下記にソースを公開しておくので、各自工夫していただきたい。


応用例

 要はポート出力をどう料理するかだけなので、例えば
 ・ソリッドステートリレー (SSR) を使って AV 機器の電源制御(例えばプリアンプ→メインアンプの順に電源を入れ、電源 OFF 時は逆順に消す。ハナからリモコンなんかに対応していない真空管アンプ等の制御が可能) → 参考例
 ・リレーを使ったスピーカーの切り離しで電源ON時のポップノイズ撲滅
などが鉄板の応用例か。


プログラム:

 タイマや割り込み、スリープなどのオイシイ機能は一切使用していない原始的なものだが、改変自由とするので各自工夫していただきたい。

 なお、使用するスイッチのタイプに合わせて2種類を用意した。

ソースファイル(改変自由) HEXファイル
オルタナティブスイッチ版
(トグルスイッチ用)
Mute_A.asm Mute_A.HEX
モメンタリースイッチ版
(プッシュスイッチ用)
Mute_M.asm Mute_M.HEX

 管理人宅では、追加でケース加工するのが面倒なので、従来の電源スイッチを転用することとしてオルタナティブ版を使用している。新たにこれからアンプを製作するならモメンタリー版の方がマイコン制御をしている感じがしていいかも(笑)


2007.9.13 追記

 その後、電源 OFF の状態でしばらく放置すると SLEEP に入るよう改良。もっとも電池駆動ではないので、有り難味は殆どないのだが・・・ ^^;



 [電子工作のページへ]