MATHANGSPK BLOG

Chia sẽ các thủ thuật về máy tính, tin học, các kiến thức điện tử cơ bản

Thứ Ba, 2 tháng 7, 2019

Điều khiển độ sáng bóng đèn sợi đốt 220VAC bằng arduino


Chắc hẳn nếu các bạn tìm đọc đến blog này của mình thì cũng đã từng biết cách điều khiển độ sáng của bóng đèn DC, cách điều khiển bóng đèn 12VDC thì cũng đơn giản hơn đôi chút. Và chúng điều có chung một lý thuyết giống nhau, để bóng đèn sáng mạnh thì cấp 1 mức điện áp bằng điện áp định mức, lúc này ta sẽ được kết quả bóng đèn hoạt động tối ưu tại giá trị thiết lập của nhà sản xuất, hay hiểu nôm na là hoạt động hết công suất của bóng đèn. Ví dụ đơn giản để một bóng đèn 60W - 220VAC (thông số này có ghi trên thân bóng đèn sợi đốt) hoạt động hết công suất tối đa của nó thì chúng ta phải cấp 1 điện áp là 220VAC cho nó.

? Vậy nếu chúng ta cấp 1 điện áp lớn hơn hay nhỏ hơn 220VAC thì điều gì sẽ xảy ra?

Trả lời cho trường hợp thứ nhất: Cấp mức điện áp lớn hơn điện áp định mức của bóng đèn, điều các bạn thấy có thể bóng đèn sẽ sáng hơn và điều tồi tệ hơn là nếu điện áp cấp vượt quá cao so với mức điện áp định mức thì bóng đèn sẽ bị đứt. (cái này thì đọc kỹ tài liệu nhà sản xuất chắc có ghi), thường thì mình thấy nếu đâu đó nếu điện áp tăng lên khoảng 10% thì bóng đèn vẫn có thể chịu được nhưng chắc tuổi thọ sẽ không bằng, bạn có quyền thử nghiệm để xem thực tế như thế nào, thử cấp 1 mức điện áp 240VAC cho bóng đèn xem nó có sáng hơn không hay là tối hơn. Tối hơn chỉ là khi nó đã bị hỏng và xin chia buồn với bạn vì điều đó.

Trả lời cho trường hợp thứ hai: Cấp mức điện ấp thấp hơn điện áp định mức của bóng đèn, bóng đèn sẽ sáng yếu đi và nếu thấp quá thì chúng ta sẽ không thấy bóng đèn sáng nữa.

Ở bài này mình sẽ giới thiệu cách bạn có thể điều chỉnh độ sáng của bóng đèn 220VAC bằng Arduino, nghe có vẻ hấp dẫn nhỉ, chúng ta cùng nhau bắt đầu thôi.

Để giải quyết làm sao để cấp 1 điện áp thay đổi được cho bóng đèn để bóng đèn có thể sáng tối khác nhau.

Ta sẽ thay đổi góc kích hình sine cho bóng đèn, được lái bởi con triac.
Khi góc kích con triac thay đổi sẽ thay đổi thời gian dẫn của bóng đèn, nếu trong 1/2 chu kỳ sine 180 độ triac chỉ được kích dẫn 50% thì điện áp chắc chắn sẽ còn 50%. Đó là ý tưởng của việc thay đổi độ sáng bòng đèn.
Để làm được điều này các bạn cần một mạch nữa là zero dectect circuit. Như hình dưới.

Mính sẽ giải thích nguyên lý của mạch trên như sau:
Đầu tiên điện áp 220VAC từ lưới sẽ được hạ dòng xuống khi qua 2 điện trở 33K 1/2W. Sau đó đi vào mạch cầu. Lúc này mạch cầu của chúng ta sẽ làm cho chu kỳ âm của sóng sine lật ngược lên trên hết.

Sau đó tín hiệu ngỏ ra của mạch cầu diode sẽ được điều khiển bởi 1 con octo cách ly, ngõ ra octo cách ly được định thiên bởi nguồn 5VDC và một trở 10KOhm. Đưa vào chân ngắt ngoại của Arduino để phát hiện điểm zero của sóng sine.

Giải thích luôn nguyên lý thay đổi góc kích cho triac, trong chương trình ngắt ngoại sẽ điều khiển thời gian kích dẫn triac.
Nếu Triac được kích ngay điểm zero có phải ngõ ra tải sẽ dường như đủ 360 độ không ạ?
Giờ muốn giảm thời gian thay đổi góc kích thì ta sẽ cho delay thời gian kích triac lại đúng không ạ?
Bây giờ quay qua tính toán một chút. Điện lưới của chúng ta đang dùng là 50Hz nghĩa là thời gian 1 chu kỳ 20ms 1/2 chu kỳ 10ms.

Ở hình trên đường nét cắt là điện áp 220VAC vào, Đường màu xanh dương là điện áp ra, và đường màu đỏ là điện áp kích từ arduino.
Khoảng thời gian t1 là khoảng thời gian cho G của Triac chưa được kích lúc này ngõ ra VAC sẽ là 0V. Khi ngõ ra G được kích thì sẽ có áp như hình trên, sau một khoảng thời gian t2 chân G sẽ được ngắt, nhưng lúc này triac vẫn dẫn cho đến khi chu kỳ sine tới điểm zero thì triac sẽ tự off, đợi tới chu kỳ kế tiếp kích chân G lên và cứ thế tiếp tục.

Và sau đây là code arduino cho chương trình:


int AC_LOAD = 10;    // Output to Opto Triac pin
int dimming = 0;  // Dimming level (0-128)  0 = ON, 128 = OFF
int count = 0;
int dimtime;
char val;
void setup()
{
  Serial.begin(9600);
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  attachInterrupt(1, zero_crosss_int, FALLING);  // Choose the zero cross interrupt # from the table above pin 2
}

//the interrupt function must take no parameters and return nothing
void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) 
  // For 60Hz => 8.33ms (10.000/120)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65

  dimtime = (75*dimming);    // For 60Hz =>65    
  delayMicroseconds(dimtime);    // Wait till firing the TRIAC
  digitalWrite(AC_LOAD, HIGH);   // Fire the TRIAC
  delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // Nzzzzzo longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
  count ++;
  if(count == 100){
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    count = 0;
  }
}

void loop()  {
    for (int i=0; i <= 115; i++){
      dimming=i;
      delay(500);
      Serial.print(dimming);
      Serial.print("\n");
      Serial.print(dimtime);
      Serial.print("\n");
     }
    if (Serial.available()) 
   { // If data is available to read,
     val = Serial.read(); // read it and store it in val
   }

    if(val == '1') dimming = dimming + 20;
    if(val == '2') dimming = dimming - 20;
}

1 nhận xét:

Adbox