これまでに、秋月電子通商で購入したソリッドステートリレー (SSR) キットを使って、ゼロクロス制御 (サイクル制御) での電力調整をやってきました。
SSRで電力調整をやってみた (回路図)
SSRで電力調整をやってみた (スケッチ)
さて、じつは最終的に位相制御による電力調整をやってみたいので、フォトトライアックを非ゼロクロスタイプに変更しようと考えています。これまでに作ってきた電力調整回路はゼロクロスパルスを利用して制御しているので、フォトトライアックは非ゼロクロスタイプでも問題はないはずです。
まずは、フォトトライアックを非ゼロクロスタイプに交換してみましょう。
フォトトライアックを非ゼロクロスタイプに交換してみた
SSR キットに付属しているフォトトライアックは東芝の TLP561J です。同等の非ゼロクロスタイプのもので、秋月電子通商にあったのはシャープの S21ME3 でしたので、これを購入。
このときのために (^_^;) IC ソケットに載っけておいたフォトトライアックを取り外して、非ゼロクロスタイプを取り付け。それだけで、回路もスケッチも変更ありません。
電源入れます。結果 ……
動きました。
が、ちょっと問題があるようです
ぱっと見は正常に動いているのですが、電球の点滅のしかたが微妙に違っています。
交流出力の波形を確認すると、転流失敗しているような波形でした。トリガ出力は 0xc8c0 というパターンですが、出力波形は 0xece0 、つまり、オンの次のオフになるべきサイクルがオンしてしまっている。
でも、負荷は電球です。転流失敗はふつう誘導負荷のときに発生するもので、抵抗負荷である電球で発生するとは考えられません。
ということは、トライアックをオンさせているトリガパルスが、次のサイクルにまではみだしているのではないかと。
実際に確認してみると、入力であるゼロクロスパルスの立ち上がりに対して、出力のトリガパルスの立ち上がりは 100μs ほど遅れていました。同様にトリガパルスの立ち下がりも遅れてしまっています。
トライアックは 100μs のパルスで十分にオンされますから、これが波形を意図しない形にしている原因だと思われます。
スケッチにちょいと追加
スケッチを見直してみます。
問題は出力がオフになるタイミングが遅れていること。ならば、ゼロクロスパルスの割り込みが入ったらすぐに、とりあえず出力をオフにする。そのあとで制御データを判断してオンオフを決めればよいでしょう。
ってことで、割り込みハンドラに一行追加しました。
- void zeroCross() {
- digitalWrite(outputPin, LOW); // 追加した行
- zero = true;
- }
これで、ほぼ問題はなくなりました。
ちなみに、トライアックは 100μs のパルスを与えれば十分オンします。ならば、次のゼロクロスパルスが割り込むまで待たずに、もっと短い時間で出力をオフにしてしまうという方法も考えられます。
ただ、トリガパルスの幅を短くすると、抵抗負荷は問題ないのですが、誘導負荷ではトライアックがオンしなくなってしまいます。誘導負荷では、電圧がゼロクロスしてから実際に電流が流れ始めるのが 1/4 サイクル遅れるためですね。
これを回避するために、トリガパルスは次のゼロクロスまで与え続けるほうが良いのです。
ついでに回路も変更
えーとですねぇ、コンパレータを使ってゼロクロスパルスを作ってみたのですが、実際にやってみるとあまり良くありませんでした。どうも、電圧のゼロクロスとパルスのタイミングがうまく合わないみたいです。
そのために、特に小さな負荷のときに転流失敗したような波形が現れてしまいます。
300W ほどの電熱器をつなぐと、トライアックはとてもきれいにオンオフしてくれます。十分な保持電流が得られるからでしょう。でも、数 W の小さなヒーターをつなぐと波形が乱れます。
そこで、シンプルイズビューティフル (^_^;) なフォトカプラを利用した回路に変更してみました。
フォトカプラは FAIRCHILD の FOD814A300W (両極性入力) です。秋月電子通商で購入しました。
LED に流す電流は 10mA 程度でよいでしょう。コレクタ電流は 1mA も流しておけば十分だと思います。
で、これが調子がいいです。やっぱり先人の知恵に逆らっちゃいけません (^_^;)
回路図
前回からの変更点は、
- フォトトライアックを非ゼロクロスタイプに交換
- トライアックの G-T1 間に抵抗を取付け
- ゼロクロスパルス発生回路にフォトカプラを使用
の 3 点です。
メイントライアックの G-T1 間の抵抗はノイズ対策用です。ゼロクロス制御をしている場合は特に問題ないのですが、位相制御をやるとなると必要になりますので、今回取り付けておきました。
抵抗値は小さいほどノイズに強くなりますが、感度が悪くなります。まぁ一般的に 100Ω 程度なので、それにならいました。
スケッチ (ゼロクロス制御電力調整)
- // AC-Dimmer-SSR v.1.2 2020.10.30 by meyon
- int interruptPin = 2;
- int outputPin = 4;
- volatile bool zero = false;
- int cycle = 0;
- int trigger = 0;
- unsigned int pattern[11] = {
- 0x0, // 0%
- 0xc8c0, // 31%
- 0xccc8, // 44%
- 0xeccc, // 56%
- 0xecec, // 63%
- 0xeeec, // 69%
- 0xeeee, // 75%
- 0xfeee, // 81%
- 0xfefe, // 88%
- 0xfffe, // 94%
- 0xffff //100%
- };
- void zeroCross() {
- digitalWrite(outputPin, LOW);
- zero = true;
- }
- void cycleControl(int level) {
- noInterrupts();
-
- if(zero) {
- trigger = bitRead(pattern[level], 15-cycle);
- digitalWrite(outputPin, trigger);
- digitalWrite(LED_BUILTIN, trigger);
- cycle++;
- if(cycle > 15) {
- cycle = 0;
- }
- zero = false;
- }
- interrupts();
- }
- void setup() {
- pinMode(LED_BUILTIN, OUTPUT);
- pinMode(outputPin, OUTPUT);
- attachInterrupt(digitalPinToInterrupt(interruptPin), zeroCross, RISING);
- }
- void loop() {
- int inputValue = analogRead(A0);
- int dimmerLevel = map(inputValue, 0, 1024, 0, 11);
-
- cycleControl(dimmerLevel);
- }
変更点は以下の通りです。
25 行で、ゼロクロスパルスの割り込みが入ったときに、すぐに出力をオフにしています。
34 – 35 行は、loop() にあった出力ピンの制御を、triggerControl() の中へ移動したものです。どちらでも大差ないのですが、まぁ、気分です。ちなみにこの場合 trigger はローカル変数でよいですね、変更してませんけど。
以上で、ゼロクロス制御 (サイクル制御) による電力調整は完成です。
次回は、スケッチを書き換えて、位相制御による電力調整を行なっていきましょう。