DC Current Sensor By using ACS712 Hall Effect

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

รูปที่ 1 การประยุกต์ใช้งานของไอซีฮอร์เอฟเฟกเซนเซอร์ เราสามารถต่อวงจรได้หลายรูปแบบ โดยในรูปที่ 1 นี้จะแสดงลักษณะการต่อการใช้งานเบื้องต้น ลักษณะการนำอุปกรณ์ภายนอกเพื่อให้ไอซีพร้อมใช้งานทั่วไป

รูปที่ 2 แสดงบล็อกไดอะแกรมของฮอร์เอฟเฟกเซนเซอร์ ช่วยให้เราเข้าใจโครงสร้างภายในของตัวไอซี ซึ่งจะช่วยให้เราสามารถปรับแต่งวงจรได้ตามที่เราต้องการ

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


รูปที่ 3 และตารางที่ 2 แสดงลักษณะตัวถังของไอซี และตำแหน่งขาต่างๆ ช่วยให้เราออกแบบวงจรได้อย่างถูกต้อง รวมทั้งเข้าใจฟังก์ชันการใช้งานของแต่ขา

ในรูปที่ 4 กราฟแสดงความสัมพันธ์ระหว่างกระแสที่ไหลผ่านไอซีและค่าแรงดันเอาต์พุตที่เกิดขึ้น โดยในตัวอย่างจะเป็นไอซีเบอร์ ACS712ELCTR-05B ซึ่งจะให้ค่าแรงดันเอาต์พุตสูงสุดและต่ำสุดช่วง 1.5V-3.5V และไอซีเบอร์อื่นๆ เราสามารถดูในกราฟลักษณะเดียวกันเพื่อให้เราใช้งานได้อย่างถูกต้อง
การอ่านค่ากระแสไฟฟ้าด้วยบอร์ด Arduino UNO
สำหรับการทดลองที่ 1 นี้เราจะทดลองวัดค่ากระแสที่เกิดขึ้นจากเหล็กฮอร์เอฟเฟกเซนเซอร์ โดยใช้ตัวอย่างโค้ดโปรแกรมจากอ้างอิงที่ 3 (Code Porgram Ref[3]) สำหรับในกรณีที่เราต้องการหาค่ากระแสทั่วไปที่เกิดขึ้นกับโหลดและใช้งานปกติ





จากผลการทดลองทั้ง 2 ครั้งจะเห็นว่า เราสามารถวัดกระแสที่ไหลผ่านโหลด โดยกำหนดให้กระแสไหลระหว่างขา 1 ขา 2 ไปยังขา 3 และขา 4 โดยในทิศทางนี้จะทำให้กระแสเป็นบวก และเราสามารถนำผลที่ได้นี้ไปบันทึกหรือใช้ในข้อมูลที่เราต้องการ สำหรับในส่วนโปรแกรมด้านล่างจะใช้ในการทดลองอ่านค่ากระแสไฟฟ้าด้วย Arduino UNO
/* Measuring DC Current Using ACS712 Code Program by : http://www.energiazero.org/arduino_sensori/acs712%2030a%20range%20current%20sensor.pdf */ const int analogIn = A0; int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module int RawValue= 0; int ACSoffset = 2500; double Voltage = 0; double Amps = 0; void setup(){ Serial.begin(9600); } void loop(){ RawValue = analogRead(analogIn); Voltage = (RawValue / 1024.0) * 5000; // Gets you mV Amps = ((Voltage - ACSoffset)/mVperAmp); Serial.print("Raw Value = " ); // shows pre-scaled value Serial.print(RawValue); Serial.print("\t mV = "); // shows the voltage measured Serial.print(Voltage,2); // the '3' after voltage allows you to display 3 digits after decimal point Serial.print("\t Amps = "); // shows the voltage measured Serial.println(Amps,2); // the '3' after voltage allows you to display 3 digits after decimal point delay(1000); }
การป้องกันกระแสเกินด้วยฮอร์เอฟเฟกเซนเซอร์ ACS712
สำหรับการทดลองวงจรป้องกันกระแสเกิน เราจะยังคงใช้โปรแกรมรูปแบบเดิมแต่มีปรับปรุงเล็กน้อย โดยเราจะเพิ่มคำสั่งเมื่อมีกระแสเกินจะให้แอลอีดีติดและแสดงข้อความ Over Current ให้เราทราบ ในกรณีที่กระแสไม่เกินการแสดงผลจากเป็นภาวะปกติ ซึ่งในช่วงที่กระแสเกินเราสามารถที่จะนำคำสั่งอื่นๆเข้ามาใช้ เพื่อให้ไมโครคอนโทรลเลอร์ Arduino UNO ทำงานได้ตามที่ต้องการ เช่น การแจ้งเตือนกระแสเกินหรือหยุดการทำงานของระบบบางส่วนเป็นต้น




จากตัวอย่างการทดลองครั้งนี้เราจะทดสอบการตรวจจับกระแสเกิน โดยกำหนดค่ากระแสเกินที่ 1.2A และเราสามารถเปลี่ยนค่ากระแสเกินนี้ได้ แต่ไม่เกินขนาดสเปกฮอร์เอฟเฟกเซนเซอร์ที่เราเลือกใช้ สำหรับโปรแกรมด้านล่างใช้ในการการทดสอบกระแสเกินครั้งนี้
/* Measuring DC Current Using ACS712 Code Program by : http://www.energiazero.org/arduino_sensori/acs712%2030a%20range%20current%20sensor.pdf */ const int analogIn = A0; int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module int RawValue= 0; int ACSoffset = 2500; double Voltage = 0; double Amps = 0; void setup(){ Serial.begin(9600); pinMode(13,OUTPUT); digitalWrite(13,LOW); } void loop(){ RawValue = analogRead(analogIn); Voltage = (RawValue / 1024.0) * 5000; // Gets you mV Amps = ((Voltage - ACSoffset)/mVperAmp); Serial.print("Raw Value = " ); // shows pre-scaled value Serial.print(RawValue); Serial.print("\t mV = "); // shows the voltage measured Serial.print(Voltage,2); Serial.print("\t Amps = "); // shows the voltage measured Serial.println(Amps,2); //-------- SET Current Limt ------------ if (Amps>1.2) { digitalWrite(13,HIGH); Serial.print(" Over Current "); delay(1000); } digitalWrite(13,LOW); delay(1000); }
การตรวจสอบทิศทางการไหลของกระแสไฟฟ้าด้วยฮอร์เอฟเฟกเซนเซอร์ ACS712
การตรวจสอบทิศทางการไหลของกระแสด้วยฮอร์เอฟเฟกเซนเซอร์ จะทดลองโดยการตรวจสอบกระแสชาร์จให้กับแบตเตอรี่ชนิดลิเทียมไอออนฟอสเฟต (LiFePO4) เป็นทิศทางที่ 1 และทิศทางที่ 2 จะเป็นการตรวจสอบการจ่ายพลังงานจากตัวแบตเตอรี่ลิเทียมไอออนฟอสเฟตไปยังโหลดต่างๆ ทั้งนี้จะทำให้เราสามารถประยุกต์การใช้งานฮอร์เอฟเฟกเซนเซอร์ได้อีกรูปแบบหนึ่งในการจัดการพลังงานไฟฟ้า (Power management) ให้กับแบตเตอรี่

ในรูปที่ 14 เมื่อเราให้วงจรชาร์จแบตเตอรี่ทำงาน และการแสดงข้อความของการชาร์จแบตเตอรี่ จะสังเกตเห็นว่าข้อความจะแสดงปริมาณกระแสที่ใช้ในการชาร์จเป็นปกติตามในกรอบสีแดง

รูปที่ 15 ลักษณะของการต่อวงจรเพื่อให้เพาเวอร์ซัพพลายจ่ายกระแสชาร์จให้กับแบตเตอรี่ ในรูปกระแสชาร์จจะมีค่าประมาณ 600mA

สำหรับรูปที่ 16 จะเป็นการแสดงข้อความในขณะที่แบตเตอรี่จ่ายกระแสให้โหลด โดยใช้ตัวฮอร์เอฟเฟกเซนเซอร์เดิม แต่ทิศทางตรงข้าม จะสังเกคุเห็นว่าข้อความ “RawValue” จะมีเครื่องหมายลบเพิ่มขึ้นเพื่อบอกทิศทาง โดยค่าปริมาณกระแสที่เแบตเตอรี่จ่ายให้โหลดถูกกำหนดให้เป็นค่าบวกเช่นเดิมเพื่อให้เข้าใจง่าย

รูปที่ 17 แสดงลักษณะของวงจรเมื่อแบตเตอรี่จ่ายกระแสให้โหลด โดยในสถานะนี้แอลอีดีจะติดเพื่อแสดงให้ทราบ สำหรับการนำไปใช้งานเราควรพิจารณากระแสโหลดและตัวฮอร์เอฟเฟกเซนเซอร์ให้เหมาะสม
/* Measuring DC Current Using ACS712 Code Program by : http://www.energiazero.org/arduino_sensori/acs712%2030a%20range%20current%20sensor.pdf */ const int analogIn = A0; int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module int RawValue= 0; int ACSoffset = 2500; double Voltage = 0; double Amps = 0; void setup(){ Serial.begin(9600); pinMode(13,OUTPUT); digitalWrite(13,LOW); } void loop(){RawValue = analogRead(analogIn);
if (RawValue>500) {Voltage = (RawValue / 1024.0) * 5000; // Gets you mV
Amps = ((Voltage - ACSoffset)/mVperAmp);
Serial.print("Raw Value = " ); // shows pre-scaled value
Serial.print(RawValue);
Serial.print("\t mV = "); // shows the voltage measured Serial.print(Voltage,2);
Serial.print("\t Amps = "); // shows the voltage measured Serial.println(Amps,2);
digitalWrite(13,LOW);
delay(1000); }
else {RawValue = (1024-RawValue);
Voltage = (RawValue / 1024.0) * 5000; // Gets you mV
Amps = ((Voltage - ACSoffset)/mVperAmp);
Serial.print("--- Raw Value = " ); // shows pre-scaled value
Serial.print(RawValue);
Serial.print("\t mV = "); // shows the voltage measured
Serial.print(Voltage,2);
Serial.print("\t Amps = "); // shows the voltage measured Serial.println(Amps,2);
digitalWrite(13,HIGH);
delay(1000); }
}
จากตัวอย่างโปรแกรมที่เห็นข้างบนนั้น จะแบ่งออกเป็น 2 ส่วนคือ ส่วนแรกเมื่อค่าแรงดันฮอร์เอฟเฟกเซนเซอร์มีค่ามากกว่า 500 โปรแกรมจะทำงานในลูป if และในสถานะนี้เราจะเรียกว่าการชาร์จแบตเตอรี่ ซึ่งหมายถึงกระแสจากเพาเวอร์ซัพพลายจะไหลผ่านจากขา 1 และ 2 ไปยังขา 3 และขา 4 ของฮอร์เอฟเฟกเซนเซอร์ แต่ในทางตรงข้ามเมื่อเปลี่ยนสถานะให้แบตเตอรี่จ่ายกระแสที่โหลดกระแสจะไหลจากขา 3 และ 4 ไปยังขา 1 และขา 2 ซึ่งจะทำให้ค่าแรงดันฮอร์เอฟเฟกเซนเซอร์มีค่าน้อยกว่า 500 ลูปคำสั่งจะลงมาทำงานที่ else นั้นเอง
สำหรับบทความนี้เป็นการประยุกต์ใช้งานฮอร์เอฟเฟกเซนเซอร์ สำหรับตรวจวัดกระแส, การป้องกันกระแสเกินและการตรวจสอบทิศทางการไหลของกระแส โดยใช้บอร์ดควบคุม Arduino UNO ซึ่งตัวอย่างโปรแกรมที่ใช้ในการทดลอง ยังคงเป็นแนวทางเบื้องต้นให้ท่านนำมาประยุกต์ใช้งานต่างๆ เช่น การบันทึกการใช้กำลังไฟฟ้าด้วยฮอร์เอฟเฟกเซนเซอร์ให้กับระบบโซล่าร์เซลล์ ออกแบบระบบป้องกันกระแสเกินโดยไม่ใช้รีเลย์และการวัดค่าการใช้พลังงานไฟฟ้าเป็นต้น
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://github.com/RobTillaart/ACS712