ACS712 อ่านค่า AC Current

Started by suriya22, January 01, 2014, 02:39:49 PM

Previous topic - Next topic

suriya22

สวัสดีครับ ตอนนี้ผมจะทำเครื่องตรวจสอบมอเตอร์ปั้มน้ำ(AC Motor) โดยใช้วิธีตรวจสอบกระแส หากสถานะปกติ(สูบน้ำแล้วมีน้ำออก) จะกินกระประมาณ 5A แต่หากสถานะไม่ปกติ(สูบน้ำแล้วน้ำไม่ไหล) จะกินกระมากกว่า 5A ซึ่งใช้เงื่อนไขนี้ในการตรวจสอบ ผมใช้ PIC16F กับ ACS712-30A เพื่อวัดกระแส AC ต่อเข้ากับ ADC(10 bit) ของ PIC ค่า ADC ที่อ่านเข้ามา หากไม่มีโหลด ที่ขา ACS712 output จะมีแรงดันประมาณ 2.496V แล้วอ่านค่า ADC ได้ 509 step แต่พอต่อโหลด(เตารีด) แล้วอ่านค่า ADC ออกมาค่าจะไม่นิ่ง จะวิ่งไปมา 480-514
ผมจึงอยากทราบว่า มีใครเคยใช้ ACS712 นี้บ้างครับ ว่ามีวิธีการใช้งานมันอย่างไรถึงจะอ่านค่าให้มันถูกต้อง ขอบคุณครับ

รับพัฒนาระบบอัตโนมัติ uC, รับพัฒนาระบบเกี่ยวกับ RFID SMART CARD(NFC,Mifare, Felica,Type B)
สนใจติดต่อ คุณสุริยา suriya22@gmail.com 086-7627224

prakit340

Sampling สัญญาณแล้วเข้าสูตรครับ ตามที่ตอบใน Facebook

JK-FlipFlop

หรือ อีกวิธี หาวงจรแปลง AC เป็น DC หลัง Output ของ ACS712 ก่อนเข้าไมโคร ครับ


RoLRoR

วัดกระแสสลับ ด้วย ACS712  ก็จะมีแรงดันกระแสสลับที่ต่อวัด 50Hz มาอยู่บน Vref 2.5V แบบนี้ครับ
ถ้าเขียนโปรแกรมเดี๋ยวอ่านเดี๋ยวหยุด ก็จะได้ค่ามากบ้างน้อยบ้างตามจุดที่อ่าน


ต้องเขียนโปรแกรม แซมปลิ้ง.ประมาณ 20ครั้ง หรือมากกว่า ให้ครบ.ตลอดรูปคลื่น 20ms
และแยกเป็นข้อมูลมากกว่าหรือน้อยกว่า Vref (Zero) เอาก่อนครับ จากนั้นก็เข้าสมการ

http://www.electoday.com/index.php/topic,10679.msg20934.html#msg20934

tatree_b

ลองเปลี่ยน C filter(แบบเซรามิค) ระหว่างขา 6 กับ 5 ให้ใหญ่ขึ้นไหมครับจากตัวอย่างถ้าใช้ 1 nF จะมีน้อยส์ 40 mV ซึ่งถ้าคุณใช้กับไฟ 5 แอมป์หรือขาออกของไอซีเท่ากับ 500 mV (100mV/A) จะมีน้อยส์ถึง 10 % ทีเดียว ก็พอๆ กับที่ค่าสวิงตามที่เห็น แต่ถ้าเพิ่มเป็น 47 nF น้อยส์จะเหลือ 2..5 %



http://www.es.co.th/Schemetic/PDF/ACS712-ALLEGRO.PDF

suriya22

ขอบคุณครับ ทำได้แล้วตามที่คุณ RoLRoR บอก ทำตามสเต็ปที่คุณRoLRoR ครับ แต่ของผม sampling 50 ครั้ง ครับ

1. อ่านค่าตอนที่ไม่มีกระแสเก็บเป็นค่าเซ็ตศูนย์ และเก็บค่าไว้ที่ eeprom คืนค่าตอนเปิดเครื่อบใหม่ได้
2. sampling อย่างน้อย 20ครั้ง อ่านค่าทั้งทางฝั่งบวกและฝั่งลบให้ครบ 1รูปคลื่น เก็บไว่ในตัวแปร array
    (เงื่อนไข สัญญาณที่อ่านได้มากกว่า ค่าเซ็ตศูนย์ ก็นำค่าที่อ่านได้ - ค่าเซ็ตศูนย์ = ค่าสัญญาณซีกบวก)
    (และ สัญญาณที่อ่านได้น้อยกว่า ค่าเซ็ตศูนย์ ก็ ค่าเซ็ตศูนย์ - ค่าที่อ่านได้ = ค่าสัญญาณซีกลบ)
3. นำตัวแปร array ที่เก็บค่าแต่ละตัว ไปยกกำลังสอง
4. นำตัวแปร array เก็บค่ายกกำลังสองแล้ว มาบวกรวมกัน
  4.5 นำผลรวมที่ได้มาหาค่าเฉลี่ย
5. นำตัวแปรที่เก็บค่า sum มาถอดแสควรูท 2
6. ก็จะได้ Amp RMS
7. ทำแบบเดียวกัน โดยการอ่านค่าโวลท์ ที่ลดทอนจากหม้อแปลงมาแล้ว และได้ Volt RMS (Sampling จังหวะเดียวกับ กระแส)
8. นำค่ามาคูณกัน ก็จะได้ กำลังงาน VA. (ยังไม่ใช่ Watt. นะ)

ขอบคุณจริงๆครับ
ตัวอย่างโค้ดครับ


void ADCProcessTask(void)
{
/*
ADC 10 bit is 1024 step
Vref = VDD(5V)

5V(Vref) = 1024 step
2V(voltage divider) = (1024/5)x2
= 409 step

*/

unsigned long SumADCValue;
unsigned char i;

switch(gADCTask)
{
case Adcwait:
gADCTask = AdcReadZero;
break;

case AdcReadZero:
gAdcZero = read_adc();
break;

case AdcRead:
gAdcValue = read_adc();
if(gAdcValue > gAdcZero)
gAdcValueTmp = gAdcValue - gAdcZero;
else
gAdcValueTmp = gAdcZero - gAdcValue;

gAdcValueTemp[gAdcCnt] = gAdcValueTmp;
gAdcCnt++;
if(gAdcCnt >=50)
{
gAdcCnt = 0;
gADCTask = AdcAverage;
}
break;

case AdcAverage:
gSumADCValue = 0;
for(i=0;i<50;i++)
{
SumADCValue = gAdcValueTemp[i];
gSumADCValue += (SumADCValue * SumADCValue);
}

gSumADCValue = gSumADCValue/50;
gAdcCurrentValue = (unsigned long)sqrt((double)gSumADCValue);

gADCTask = AdcRead;
gAdcTimer = CLR;
break;

case AdcDelay:
if(gAdcTimer > Time100mS)
{
gADCTask = AdcAverage;
gAdcIntFlag = CLR;
}
break;
}
}


รับพัฒนาระบบอัตโนมัติ uC, รับพัฒนาระบบเกี่ยวกับ RFID SMART CARD(NFC,Mifare, Felica,Type B)
สนใจติดต่อ คุณสุริยา suriya22@gmail.com 086-7627224

tha

อ่านค่ามาหลายๆค่าแต่จับเฉพาะค่า peak แล้วเอามาหารด้วยรูทสอง(คูณด้วย 0.707) จะได็ไหม (Vrms = Vpeak*0.707)

pa_ul

Quote from: tha on February 13, 2014, 10:08:13 AM
อ่านค่ามาหลายๆค่าแต่จับเฉพาะค่า peak แล้วเอามาหารด้วยรูทสอง(คูณด้วย 0.707) จะได็ไหม (Vrms = Vpeak*0.707)

ได้แต่ไม่ค่อยจะดีเท่าไหร่ ถ้า
- มีสัญญาณรบกวนในรูปดลื่น
- รูปคลื่อนกระแสผิดเพี้ยนไปจาก sine wave หรือมีค่า offset เกิดขึ้น
- sampling rate ต่ำเกินไป