Overcurrent protection for DC motor using Analog comparator Module of Arduino UNO
โครงงงานการป้องกันกระแสเกินให้กับมอเตอร์กระแสตรง (DC motor) โดยใช้โมดูลเปรียบเทียบสัญญาณอะนาลอก (Analog comparator Module) ในตัวชิฟ ATmega328P ของบอร์ดควบคุม Arduino UNO เป็นการตรวจจับกระแสอีกรูปแบบหนึ่งนอกจากการใช้โมดูลรับสัญญาณอะนาลอก A0-A5 ทั่วไป ทั้งนี้ การใช้โมดูลเปรียบเทียบสัญญาณอะนาลอก จะช่วยให้การประมวลผลโปรแกรมคำสั่งของบอร์ดควบคุมได้เร็วยิ่งขึ้น
ในรูปที่ 1 แสดงลักษณะการต่อวงจรต้นแบบกับบอร์ดควบคุม Arduino UNO สำหรับใช้ในการควบคุมความเร็วมอเตอร์กระแสตรง โดยต่อบนเบรดบอร์ดเพื่อให้ง่ายและรวดเร็วในการทดลอง ทั้งนี้จะใช้การตรวจจับกระแสเข้ามายังขา D7 ของบอร์ดควบคุม Arduino UNO
รูปที่ 2 แสดงตำแหน่งขาใช้งาน AIN0 และ AIN1 ของบอร์ด Arduino UNO ซึ่งจะตรงกับขา PD6 = AIN0 และ PD7 = AIN1 ตามลำดับ และในรูปที่ 2 จะเป็นบล็อกไดอะแกรมภายในของ Analog Comparator รวมทั้ง ฺBit ควบคุมการทำงานที่สำคัญในแต่ละตำแหน่งให้เข้าใจการทำงานได้ง่ายขึ้น [อ่านรายละเอียดเพิ่ม คลิก]
สำหรับรูปที่ 3 เป็นการต่อวงจรทั้งหมดสำหรับการทดลอง โดยจะใช้มอเตอร์กระแสตรงขนาดเล็ก และใช้แรงดันไฟเลี้ยง 12V จากนั้นจะใช้ดิจิตอลออสซิลซิลโลสโคปวัดสัญญาณพัลซ์วิดธ์มอดูเลตชั่น (PWM Signal) ที่ตำแหน่ง CH1 และที่ตำแหน่ง CH2 จะวัดสัญญาณแรงดันกระแสเกินเมื่อกระแสไหลผ่านตัวมอเตอร์ที่เกิดขึ้นตลอดเวลา
#include "analogComp.h" #include <PWM.h> int PinPWM = 9; int Output_PWM = 0; int32_t frequency = 2000; // frequency (in Hz) void setup() { analogComparator.setOn(AIN0,AIN1); // AIN0 is on D7. As a reference voltage analogComparator.enableInterrupt(Overcurrent); Serial.begin(9600); pinMode(9,OUTPUT); InitTimersSafe(); bool success = SetPinFrequencySafe(PinPWM,frequency); if(success) { } } void loop() { int Vpwm = analogRead(A3); Output_PWM = (Vpwm/4); pwmWrite(PinPWM,Output_PWM); delay(10); } void Overcurrent() { Serial.println("Comparator Interrupt"); Output_PWM=0; pwmWrite(PinPWM,Output_PWM); delay(1000); }
ในส่วนของโปรแกรมการทำงานที่แสดงข้างบนจะแบ่งออกเป็น 3 กลุ่มคือ กลุ่มแรกจะเป็นการประกาศใช้ตัวแปรและเรียกไลบารี่ analogComp.h และ PWM.h ซึ่งจะกำหนดการใช้งานโมดูลเปรียบเทียบสัญญาณอะนาลอก (Analog comparator Module), การสร้างสัญญาณพัลซ์วิดธ์มอดูเลชั่นและการกำหนดค่าความถี่ของสัญญาณ ในกลุ่มที่สองในจะเป็นการกำหนดค่าใน void setup() ซึ่งจะกำหนดการเรียกใช้งานอินเตอร์รัพท์ให้กับโมดูลเปรียบเทียบสัญญาณอะนาลอก กำหนกความเร็วในการสื่อสารข้อมูลพอร์ตอนุกรมและการสร้างสัญญาณพัลซ์วิดธ์มอดูเลชั่น ต่อมากลุ่มสุดท้ายที่สาม void loop() เป็นการรับค่าสัญญาณอะนาลอก A3 เพื่อนำมากำหนดขนาดความกว้างของสัญญาณพัลซ์วิดธ์มอดูเลชั่นและการแสดงข้อความ Comparator Interrupt เมื่ออยู่ในสถานะกระแสเกินขึ้น void Overcurrent()
รูปที่ 4 เป็นสัญญาณขับขาเกตเมื่อมอเตอร์ทำงานในสถานะการทำงานปกติ โดยขนาดความกว้างของสัญญาณพัลซ์วิดธ์มอดูเลชั่นจะกำหนดความเร็วรอบการหมุนให้กับตัวมอเตอร์กระแสตรงอย่างเป็นสัดส่วน ซึ่งในการทดลองจะใช้ความถี่ของสัญญาณพัลซ์วิดธ์มอดูเลชั่นเท่ากับ 2kHz
ในรูปที่ 5 แสดงรูปสัญญาณพัลซ์วิดธ์มอดูเลชั่นในกรณีเมื่อออยู่ในสถานะกระแสเกินขึ้น จะสังเกตเห็นว่าสัญญาณพัลซ์วิดธ์มอดูเลชั่นจะไม่ต่อเนื่อง เพื่อลดความเสียหายที่จะเกิดขึ้นกับตัวมอเตอร์และเพาเวอร์มอสเฟตขับกำลังให้กับตัวมอเตอร์
รูปที่ 6 ในส่วนของการแสดงผลด้วยแอลอีดีก็จะติดสว่างเมื่ออยู่ในสถานะกระแสเกินกระแสเกิน ทั้งนี้เราสามารถนำสัญญาณที่เกิดขึ้นนี้ไปใช้ในการควบคุมวงจรส่วนอื่นๆ ได้อีกหลายรูปแบบ ซึ่งในการทดลองนี้จะให้วงจรโมดูลเปรียบเทียบสัญญาณอะนาลอก (Analog comparator Module) ในตัวชิฟ ATmega328P ตรวจจะบแรงดันที่เกิดขึ้นไปยังขา D7 ในบอร์ดควบคุม Arduino UNO
ต่อมาในรูปที่ 7 เป็นการให้บอร์ดควบคุม Arduino UNO แสดงข้อความขึ้นที่พอร์ตอนุกรมเมื่อกระแสเกิน ซึ่งจะช่วยให้ทราบว่าการทำงานของโปรแกรมเป็นไปอย่าถูกต้อง แต่ในกรณีที่กระแสอยู่ในสถานะปกติก็จะไม่แสดงข้อความใดๆ อีกเลย
สำหรับในรูปสุดท้ายที่ 9 แสดงลักษณะของการทดลองโครงงานทั้งหมด ซึ่งโครงงานนี้เนื้อต่อเนื่องจากบทความ Analog comparator of ATMEGA328P with Library AnalogComp.h ที่เคยนำเสนอก่อนหน้านี้ แต่ในตอนนี้จะเป็นการประยุกต์ใช้งานโมดูลเปรียบเทียบสัญญาณอะนาลอก (Analog comparator Module) กับการควบคุมกระแสให้กับมอเตอร์กระแสตรง ซึ่งคงจะเป็นแนวทางให้ผู้อ่านนำไปประยุกต์ใช้งานในรูปแบบอื่นได้ง่ายขึ้น.
Reference
- https://microcontrollerslab.com/arduino-comparator-tutorial/
- https://github.com/leomil72/analogComp/blob/master/examples/analogComp_enableInterrupt/analogComp_enableInterrupt.ino
- https://forum.arduino.cc/t/analog-comparator-and-hardware-pwm/877417/7
- https://www.ee-diary.com/2021/07/arduino-analog-comparator-with-interrupt.html
- https://www.hackster.io/yeshvanth_muniraj/analog-comparator-module-in-atmega328p-migrating-to-c-7502ea
- https://electronics.stackexchange.com/questions/376906/amplifying-pulse-signal-0-1-0-5v-to-arduino-digital-input
- https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
- https://forum.arduino.cc/t/arduino-uno-pinout-diagram/142856
- https://www.electronicsdna.com/analog-comparator-of-atmega328p-with-library-analogcomp-h/