アフィリエイト広告
アフィリエイト広告

トライアックによる電力調整 − 位相制御

秋月電子通商で購入したソリッドステートリレー (SSR) キットのフォトトライアックを非ゼロクロスタイプ S21ME3 に変更し、位相制御による電力調整をやってみました。

回路図

電力調整を行なう回路は、「トライアックによる電力調整 − SSRを改造」で作った以下の回路と変わりありません。

ブレッドボード

先日、これまで使っていた Arduino UNO が故障してしまいました。「Arduino UNO が壊れた!

なので、ゼロクロス回路を変更したついでに、Arduino NANO に交換してブレッドボードに載っけてあります。
回路図は UNO のままですが、基本的に何も変わりありません。

代わりの UNO もあるんだけど、俺はどうも、NANO の方が使いやすいなぁ (^_^;)
ちなみにこの NANO は互換品です。

スケッチ (位相制御電力調整)

今回やってみた位相制御の概要。
ゼロクロスパルスがはいってきたら、トリガ出力をオフにします。同時に遅延タイマーをスタートさせて、規定の遅延時間が経過したらトリガ出力をオンにします。
これを繰り返すだけです。

本来なら遅延タイマーも割り込みさせるべきなんだろうけど、Arduino での多重割り込みってどうもうまくないらしい、やってみていないけど (^_^;)
なので、遅延時間は micros() で経過時間をみているだけです。そのせいか、わりとフラフラしてますね。だから電球が少しちらつく。
調光器として使って気になるようなら、delayMicroseconds() で遅延させた方がいいかもしれません。

  1. // AC-Dimmer-PhaseControl v.1.0 2020.11.03 by meyon
  2. char inputPin = A0;
  3. int outputPin = 4;
  4. int interruptPin = 2;
  5. int levelTable[11] = {
  6.   8500,5400,4700,4150,3800,3300,2900,2450,2000,1500,500
  7. };
  8. volatile bool zero = false;
  9. volatile bool timer = false;
  10. unsigned long preTime;
  11. void zeroCross() {
  12.   digitalWrite(outputPin, LOW);
  13.   zero = true;
  14.   timer = true;
  15. }
  16. void delayTimer(int level) {
  17.   noInterrupts();
  18.   
  19.   if(zero) {
  20.     preTime = micros();
  21.     zero = false;
  22.   }
  23.   if(micros() - preTime > levelTable[level]) {
  24.     digitalWrite(outputPin, HIGH);
  25.     timer = false;
  26.   }
  27.   interrupts();
  28. }
  29. void setup() {
  30.   pinMode(outputPin, OUTPUT);
  31.   attachInterrupt(digitalPinToInterrupt(interruptPin), zeroCross, RISING);
  32. }
  33. void loop() {
  34.   int inputValue = analogRead(inputPin);
  35.   int dimmerLevel = map (inputValue, 0, 1024, 0, 11);
  36.   if(timer) {
  37.     delayTimer(dimmerLevel);
  38.   }
  39. }

7 ~ 9 行 levelTable[] が入力レベルに対する遅延時間のテーブル、μs 単位です。
ゼロクロスパルスの割り込みから、ここで規定した時間だけ経過したらトリガ出力がオンになります。
60Hz では半サイクルは 8333μs ですから、最初の値 8500μs ではトリガしません。出力オフの状態です。
出力電力がだいたい 10% 刻みになる値を規定してみました。

14 ~ 18 行 zeroCross() はゼロクロスパルスの割り込みハンドラで、出力ピンを LOW にし、フラグをセットしています。

20 ~ 32 行 delayTimer() が遅延タイマーです。ゼロクロスパルスが入るとタイマーをスタートさせ、規定の時間が経過したら出力ピンを HIGH にします。

loop() では入力電圧を読み取って、遅延タイマーが稼働している場合は delayTimer() へ行きます。

交流出力波形

交流電圧の出力を計測しています。

入力のボリュームを回していくと、位相制御された出力が現れていきます。
10 段階の出力制御なので、電球の明るさは段階的です。20 段階ぐらいにすると連続的になるんじゃないでしょうか。

というわけで。
改善の余地はいろいろあるんだけど、市販の SSR キットでわりと簡単に位相制御ができちゃうし、基板も付属しているので、いろいろ利用できるかなぁと思ってます。

タイトルとURLをコピーしました