AC Current Sensor By using ACS712 Hall Effect

สำหรับในบทความที่ผ่านมาได้นำเสนอเกี่ยวกับการใช้ฮอร์เอฟเฟกเซนเซอร์ (ACS712 Hall Effect) ในการวัดค่ากระแสไฟฟ้าแบบกระแสตรง (DC Current Sensor By using ACS712 Hall Effect) ไปแล้วนั้น บทความนี้เป็นการวัดค่ากระแสและการตรวจจับกระแสไฟฟ้าแบบกระแสสลับ กันต่อด้วยฮอร์เอฟเฟกเซนเซอร์ตัวเดิม และนำผลของค่ากระแสที่ได้มาแสดงให้ทราบ โดยส่วนหนึ่งเราสามารถนำค่ากระแสที่วัดได้มาป้องกันกระแสเกินในรูปแบบต่างๆ โดยในบทความจะต่อการใช้งานร่วมกับบอร์ดประมวลผล Arduino UNO

รูปที่ 1 แสดงลักษณะการต่อวงจรเพื่อทดลองวัดค่ากระแส โดยการวัดกระแสโหลดเทียบกับแคมป์มิเตอร์และผลที่ได้จากการประมวลผลด้วยบอร์ด Arduino UNO ซึ่งจะส่งข้อความมาแสดงผล และในการทดลองจะใช้ตัวต้านทานเป็นโหลดขนาด 10 โอห์ม 20 วัตต์ 2 ตัว, แหล่งจ่ายไฟฟ้ากระแสสลับประมาณ 24 โวลต์

รูปที่ 2 ลักษณะการวัดสัญญาณที่เกิดขึ้นจากฮอร์เอฟเฟกเซนเซอร์ ที่เกิดขึ้นทางด้านเอาต์พุตเป็นลักษณะสัญญาณอะนาลอก ซึ่งจะทำให้เราเห็นขนาดของสัญญาณที่เกิดขึ้นและความถี่ของแหล่งจ่ายกำลังไฟฟ้า

ในรูปที่ 3 การแสดงข้อความในสถานะวงจรสแตนบาย (Standby mode) โดยจากการทดลองจะมีค่ากระแสแสดงขึ้นเองบ้างเล็กน้อย โดยเราสามารถแก้ไขได้ด้วยการเพิ่มโปรแกรมในการตรวจสอบและให้การแสดงผลเป็นไปอย่างถูกต้อง
การทดลองวัดค่ากระแสไฟฟ้าที่จ่ายให้โหลดประมาณ 1.2A และ 2.2A


ในรูปที่ 5 ลักษณะสัญญาณที่เกิดขึ้นจากฮอร์เอฟเฟกเซนเซอร์ จะมีค่าประมาณ 800mVp-p และความถี่ 50Hz

ในรูปที่ 6 จะเห็นว่าค่าที่ได้จากการทดลองมีค่าใกล้เคียงกับค่าที่วัดได้ ทั้งนี้ในกรณีที่ผลการทดลองมีความผิดพลาดมาก เราสามารถปรับแต่งค่าที่แสดงผลในโปรแกรมเพื่อให้ได้ค่าที่ถูกต้อง สำหรับการทดลองถัดไปจะให้กระแสไหลผ่านโหลดประมาณ 2.36A ดังแสดงในรูปที่ 7


ในรูปที่ 8 ลักษณะสัญญาณที่เกิดขึ้นจากฮอร์เอฟเฟกเซนเซอร์ จะมีค่าประมาณ 1.36Vp-p และความถี่ 50Hz เราจะสังเกตเห็นว่าขนาดแอมปริจูดจะมีค่าเป็นสัดส่วนกับกระแสที่ไหลผ่านฮอร์เอฟเฟกเซนเซอร์

สำหรับในรูปที่ 6 และ 9 นั้นเป็นการทดลองวัดค่ากระแสแบบเบื้องต้น เราจะเห็นลักษณะการแสดงผลที่เกิดขึ้นจากบอร์ดควบคุม Arduino UNO ซึ่งเราสามารถนำค่าที่ได้ไปใช้ประโยชน์ต่างๆ เช่น การบันทึกข้อมูลการใชัพลังงานไฟฟ้า เป็นต้น ในรูปที่ 5 และ 8 เป็นสัญญาณอะนาลอกที่เกิดขึ้นจากฮอร์เอฟเฟกเซนเซอร์
 /*
  AC current sensor using ACS712  [Lab1]
  Source Program : www.circuitschools.com
*/
 const int sensorIn = A0;      // pin where the OUT pin from sensor is connected on Arduino
 int mVperAmp = 185;         // this the 5A version of the ACS712 -use 100 for 20A Module and 66 for 30A Module
 int Watt = 0;
 double Voltage = 0;
 double VRMS = 0;
 double AmpsRMS = 0; 
 void setup() {
 Serial.begin (9600); 
 Serial.println ("ACS712 current sensor");      
 }
 void loop() {
 Serial.println ("");
 Voltage = getVPP();  
 VRMS = (Voltage/2.0)0.707;    //root 2 is 0.707   
 AmpsRMS = (VRMS950)/mVperAmp; // 950 calibration factor AmpsRMS
 Serial.print(AmpsRMS);
 Serial.print(" Amps RMS  ---  ");
 Watt = (AmpsRMS*24/1.3);      // 1.3 is an empirical calibration factor
 Serial.print(Watt);
 Serial.print(" W");  
 } 
 float getVPP()
 {
   float result;
   int readValue;                // value read from the sensor
   int maxValue = 0;             // store max value here
   int minValue = 1024;          // store min value here
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
    {
        readValue = analogRead(sensorIn);
    // see if you have a new maxValue
    if (readValue > maxValue) {
    /*record the maximum sensor value*/ 
    maxValue = readValue;
    } 
    if (readValue < minValue){  
    /*record the minimum sensor value*/  
    minValue = readValue;
   }
 }
     // Subtract min from max
        result = (maxValue - minValue);
     //   Serial.println(result);
  if (result < 20) {
     result = 0.01;
     } 
 else { 
      result = ((maxValue - minValue) * 5.0)/1024.0;
      }        
 return result;
  }
การทดลองป้องกันกระแสเกินด้วยฮอร์เอฟเฟกเซนเซอร์
สำหรับการทดลองป้องกันกระแสเกินด้วยฮอร์เอฟเฟกเซนเซอร์ เราจะทำการปรับปรุงโปรแกรมเพื่อตรวจจับกระแสตามที่เรากำหนดและแสดงผลที่เกิดขึ้นเมื่อเกิดกระแสเกิน โดยในตัวอย่างการทดลองข้างล่างนี้เมื่อเกิดกระแสเกินขึ้นจะแสดงข้อความกระแสเกิน รวมทั้งตัวแอลอีดีจะติดเพื่่อแสดงผลให้เราทราบอีกส่วนหนึ่ง

ในรูปที่ 10 แสดงผลการทดลองขึ้นเมื่อกระแสเกินมากกว่าค่าที่กำหนด โดยในตัวอย่างโปรแกรมจะกำหนดกระแสเกินไว้ที่ 2A ซึ่งผลจากการทดลองกระแสเกินไปที่ 2.36A และแอลอีดีก็จะติดแสดงผลให้ทราบ

ในรูปที่ 11 จะเห็นว่าส่วนของโปรแกรมที่ปรับปรุงเพิ่มจะแสดงในกรอบสีเขียว โดยจะกำหนดค่ากระแสเกินไว้ที่ 2A และในส่วนกรอบสีแดงจะการแสดงข้อความเมื่อเกิดสถานะกระแสเกินขึ้น สำหรับโปรแกรมด้านล่างนี้จะเป็นโปรแกรมที่ใช้ในการทดลองข้างต้น
 /*
  AC current sensor using ACS712 [Lab2]
  Source Program : www.circuitschools.com
*/
 const int sensorIn = A0;      // pin where the OUT pin from sensor is connected on Arduino
 int mVperAmp = 185;         // this the 5A version of the ACS712 -use 100 for 20A Module and 66 for 30A Module
 int Watt = 0;
 double Voltage = 0;
 double VRMS = 0;
 double AmpsRMS = 0; 
 void setup() {
   Serial.begin (9600); 
   Serial.println ("ACS712 current sensor"); 
   pinMode(13,OUTPUT);
   digitalWrite(13,LOW);     
 }
 void loop() {
 Serial.println ("");
 Voltage = getVPP();  
 VRMS = (Voltage/2.0)0.707;    //root 2 is 0.707   
 AmpsRMS = (VRMS950)/mVperAmp; // 950 calibration factor AmpsRMS
 Serial.print(AmpsRMS);
 Serial.print(" Amps RMS  ---  ");
 Watt = (AmpsRMS*24/1.3);      // 1.3 is an empirical calibration factor
 Serial.print(Watt);
 Serial.print(" W");
 //-------- SET Current Limt ------------ 
 if ( AmpsRMS > 2.0){          // Current Limt 2.0A 
        digitalWrite(13,HIGH); 
        Serial.print(" Over Current ");
        delay(1000);
      }
        digitalWrite(13,LOW); 
 } 
 float getVPP()
 {
   float result;
   int readValue;                // value read from the sensor
   int maxValue = 0;             // store max value here
   int minValue = 1024;          // store min value here
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
    {
        readValue = analogRead(sensorIn);  
    // see if you have a new maxValue 
   if (readValue > maxValue){  
      /*record the maximum sensor value*/
        maxValue = readValue;
    } 
   if (readValue < minValue){
      /*record the minimum sensor value*/ 
       minValue = readValue; 
    }
 }
     // Subtract min from max
        result = (maxValue - minValue);
     //   Serial.println(result);
  if (result < 20) {
      result = 0.01;
      }  
    else {
     result = ((maxValue - minValue) * 5.0)/1024.0; 
    }        
 return result;
  }

สำหรับบทความนี้เป็นการนำฮอร์เอฟเฟกเซนเซอร์ประยุกต์ใช้งาน ซึ่งเป็นตอนต่อเนื่องจากบทความที่ผ่านมา จะเป็นการประยุกต์ในลักษณะการวัดค่ากระแสตรง ทั้งนี้ฮอร์เอฟเฟกเซนเซอร์สามารถหาซื้อได้ง่ายตามร้านค้าออนไลน์ทั่วไป รวมทั้งมีตัวอย่างโค้ดโปรแกรมที่ใช้ร่วมกับบอร์ด Arduino UNO สุดท้ายนี้บทความที่นำเสนอทั้ง 2 ตอนที่ผ่านมา คงจะช่วยให้ผู้อ่านเข้าใจได้ง่ายขึ้น และสามารถนำไปประยุกต์ใช้ในรูปแบบต่างๆ ตามที่ต้องการครับ.
Reference
- https://www.allegromicro.com/en/products/sense/current-sensor-ics/zero-to-fifty-amp-integrated-conductor-sensor-ics/acs712
- https://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf
- http://www.energiazero.org/arduino_sensori/acs712%2030a%20range%20current%20sensor.pdf
- https://github.com/rkoptev/ACS712-arduino
- https://www.circuitschools.com/measure-ac-current-by-interfacing-acs712-sensor-with-arduino/
- https://github.com/RobTillaart/ACS712