PIC 12F615


デジタル調光器に挑戦 (1)

何はともあれデジタルでしょう!

秋月電子通商さんには組み立てキットが多数あります。その中にトライアック調光器キットと言うものがいくつかあります。
残念ながらこれらの商品はボリュームで通電時間をコントロールするものです。そのため通電時間を、0~100%まで自動で変化させるという機能を実装することが簡単ではありません。
そこで、マイコンを使って通電時間を制御する仕組みを作れないものかと思ったところ、秋月電子通商さんより発売されているリレーキット・SSRキットと組み合わせて実現できそうなことがわかりました。
PICの勉強もかねて、デジタル調光器(?)を作ってみたいと思います。

基本仕様

・AC100Vを制御するユニットとしてソリッド・ステート・リレー(SSR)キット 25A (20A) タイプを使います。
・制御信号を作成するユニットをPIC 12F615で構築する。
・1分程度かけて、0~100%(または100~0%)まで通電時間を段階的に変化させる。
・On/Offのシグナルを外部から受け取る。
・ディップスイッチで設定することにより、安定状態の通電時間を8段階で指定できるようにする。

段階的に通電時間を変化させる方法

まず検討しなければいけないことは、「どうやって通電時間を段階的に変化させるか」ということでしょう。
単純な方法としては、ある単位時間(例えば0.02秒)を連続して、On/Offすることです。1%なら0.02秒Onにして、1.98秒Offにします。10%なら0.2秒Onにして、1.8秒Offにします。25%なら0.5秒Onにして、1.5秒Offにします。50%なら1秒Onにして、1秒Offにします。
しかしこの方法では、OnとOffの間隔が広がってしまうために点滅が目に見えてわかってしまいます。つまり、現実的ではありません。
ではどのようにすると好いのでしょうか。1%なら0.02秒Onにして、1.98秒Offにします。ここは変わりませんが、10%なら0.02秒Onにして、0.18秒Offにします。25%なら0.02秒Onにして、0.06秒Offにします。50%なら0.02秒Onにして、0.02秒Offにします。
つまり50%までは、Onの時間は単位時間で変わりませんが、Offの時間が次第に短くなっています。50%を超えるとOnとOffが入れ替わって、Onの時間が長くなり、Offの時間が単位時間で一定になります。そして100%の時に、Offの時間が無くなります。
このようなOn/Offの時間を数段階用意して、順次変更していくことで実現させようと思います。

次に単位時間に関する制限ですが、ソリッド・ステート・リレーの仕様に起因するところがあります。今回用いるソリッド・ステート・リレーは、ゼロクロス動作です。そのため、On/Offのタイミングは、AC電源の周期に合わされてしまいます。東日本の場合は50Hzですので、1周期が0.02秒となり、単位時間はこれより短くできません。0~100%まで変化させるのに100ステップで200秒(3分20秒)かかります。50ステップで100秒(1分40秒)、25ステップでも50秒です。

もう一つ考慮しなければいけないことがあります。それはプログラムのサイズです。
今回使用するマイコンは、PIC 12F615です。クロックは8MHz、プログラム容量は1kワード。データに至っては64バイトしかありません。複雑な処理はできないと覚悟を決める必要がありそうです。

まずは正攻法で考えましょう。
タイミングは、ACの周期に合わせてトリガーがかかるようにします。これで単位時間の0.02秒が作れます。
次に、0、4、8、12、16...88、92、96、100%と4%刻みでOnとOffの時間を計算します。このOnとOffの時間を2秒間(100単位時間)繰り返すようにします。
もう少し具体的にしましょう。
周期カウンタを用意します。このカウンタは0~25まで2秒(100単位時間)ごとにカウントアップするようにします。
カウンタが1~12の時は50%以下の通電時間なので、
(100 - カウンタ × 4)÷(カウンタ × 4)
で求められる単位時間だけ通電をOffするようにします。
カウンタが13~24の時は50%以上の通電時間なので、
(100 -(25 - カウンタ)× 4)÷((25 - カウンタ)× 4)
で求められる単位時間だけ通電をOnするようにします。
そしてカウンタが0の場合は常時Off、カウンタが25の場合は常時Onになるようにします。
この条件で通電と停電の時間間隔を一覧にしてみます。

 On時間Off時間
0 0.00
1 0.020.48
2 0.020.22
3 0.020.14
4 0.020.10
5 0.020.08
6 0.020.06
7 0.020.04
8 0.020.04
9 0.020.02
100.020.02
110.020.02
120.020.02
130.020.02
140.020.02
150.020.02
160.020.02
170.040.02
180.040.02
190.060.02
200.080.02
210.100.02
220.140.02
230.220.02
240.480.02
25 0.00
(単位:秒)

9~16が同じになってしまいました。これは端数が切り捨てられるデジタルな世界ではよくある現象です。
しかし、これでは好ましい通電時間の変化とは言えません。
別の方法を考える必要がありそうです。

計算でうまくいかないのなら、データを用意するのはどうでしょうか?
処理能力の低いマイコンで疑似計算をする際によく用いられる方法です。
先の処理のデータを用意することを考えてみます。
100単位時間で1周期です。1ビットで1単位時間のOn/Offを表すことが出来ます。従って1周期で100ビット(12.5バイト)必要です。
さらに1~24の周期を表す必要がありますので、300バイトが必要になります。
今回使用するマイコンのデータ容量は64バイトしかありませんので、単純にデータ化することはできないようです。

もう少し検討してみましょう。
デジタルの世界では、等間隔にOn/Offすること事態が困難です。ならば、多少のことは目をつむって、概ね等間隔になるように工夫することはできないでしょうか。
100ビットあるうち、1周期ごとに4ビットが変化するようなデータを作成します。その際に、On/Offの間隔が出来るだけ均等になるようにします。

00000000...00000000
00010000...00010000
00010001...00010001

この方法なら、データのために必要なサイズは13バイトで済みます。
データのほかにプログラムも必要ですが、プログラムのサイズはたいして大きくないと思われますので、現実的な解ではないでしょうか。