ACS712 -20A Current Sensor ค่าที่ได้ไม่คงที่ครับ

Started by atommicmass, November 15, 2013, 12:32:28 AM

Previous topic - Next topic

atommicmass

ตอนนี้ผมทำโปรเจ็ควัดไฟบ้าน โดยใช้ ACS712 -20A ส่งข้อมูลเข้า ขา Analog ของ Aduino Mega2560
แต่ค่าที่ได้ในช่วงมีการโหลดไม่มาก ค่าที่ได้มีความกล้เคียง แต่ไม่ค่อยคงที่คงที่สักเท่าไหร่ และยิ่งต่อโหลดสูงขึ้น ค่าที่ได้ยิ่งดร๊อปลง คือ ค่าไม่ใกล้เคียงเรยคับ (ใช้ multimiter วัด กระแส)

นี่เป็นโค้ดที่ผมใช้คับ
::) มีวิธีทำให้ค่าที่ออกมาแม่นยำไม๊คับ

# include "math.h"
double Isamp;
double Isamp2;
double Irms;
double Irms2;
void setup() {
  Serial.begin(9600);
}
void loop() {
  double Isum2= 0.0;
  for(int i=0;i<20;i++) //20
  {
    Isamp = analogRead(0);
    Isamp = 512 - Isamp;
    Isamp2 = pow(Isamp, 2);
    Isum2 += Isamp2;
    delay(1);
  }
  Isum2 = Isum2/20; //20
  Irms = sqrt(Isum2);
  Irms *= 20; //20
  Irms /= 512;
  for(int i=0;i<20;i++) //20
  {
    Irms2 +=Irms;
  }
  Irms2 =Irms2 / 20; //20
  Serial.println(Irms2); 
 
  delay(250);
}


ช่วยที่คับลองหลายวิธีแล้ว




RoLRoR

sampling ตลอดรูปคลื่น สัญญาณมีทั้งซีกบวกและลบบน vref 2.5v
โค้ดใช้ 512 ลบค่าที่อ่านได้อย่างเดียวจะไม่ได้ค่าที่ถูกต้องนะครับ



สัญญาณเป็น sine แบบนี้
ถ้าค่าที่อ่านได้มากกว่า vref ก็ให้เอาค่าที่อ่านได้ลบค่า vref
และถ้าค่าที่อ่านได้น้อยกว่า vref ถึงใช้ vref ลบค่าที่อ่านได้

คล้ายกันอีกแล้ว  ;D
http://www.electoday.com/index.php/topic,10364.0.html

:::เพิ่มเติม::: จะได้ความแม่นยำมากขึ้น เพิ่มจำนวน sampling ให้ละเอียดขึ้นครับ

atommicmass

นี่เป้นโค้ดที่ผมลองแก้แล้ว ค่าตอนไม่มีกระแส จะขึ้น 0 1  สลับไปมาคับ
ตอนมีกระแส 0.30A ใส่เข้าไป ค่าที่แสดงมันขึ้นค่า 8  เองคับ  ไม่รู้ว่าถูกต้องรึยัง ช่วยดูให้ทีน่ะคับ
# include "math.h"
int Isamp[80];
void setup() {
  Serial.begin(9600);
}
void loop() {
 
  int zero = analogRead(0);
 
  while(1)
  {
 
  //--------------------------sampling------------------------
 
  for(int i=0;i<80;i++) //20
  {
    delay(1); //today
    Isamp = analogRead(0);
    if(Isamp > zero)
    Isamp -= zero;
    else
    Isamp = zero - Isamp;
  }
 
  int Isum = 0;
 
  for(int i=0;i<80;i++)
  {
    Isum += pow(Isamp, 2);
  }
    Isum /=80;
    Isum = sqrt(Isum);
    Serial.println(Isum);
    delay(500);
}
  }





RoLRoR

ถ้ามั่นใจว่าลำดับวิธีขั้นตอนน่าจะถูกแล้ว
หลังจากจ่ายกระแสไป 0.30A แล้ว ก็ลองจ่าย 0.60A , 0.90A , 1.20A ,... ,20A เป็นลำดับทดสอบดูเลยครับ
ถ้าค่าที่อ่านได้ขึ้นเป็นลำดับขั้นเหมือนกัน ก็ลองคูณ/หาร กับตัวแปร เพื่อ calibrate ดู ให้ค่าใกล้เคียงตลอดย่านที่ต้องการครับ.

OoAMDoO

อาจจะเกิดจากสัญญาณรบกวนนะครับ ทำให้ค่าเกิดการแกว่งขึ้นได้
คุณลองให้ RC low pass filter ดูครับกรองที่ย่านสัญญาณต่ำๆ ประมาณ100Hz
ถ้าอาการดีขึ้น ก็คงเกิดจากสัญญาณรบกวน เดียวคุณไปลองดูก่อนนะครับถ้าเป็นดังที่ผมบอก
และอยากจะออกแบบ filter ระดับที่ีประสิทธิภาพมากขึ้นก็มาปรึกษาได้ครับ

crackfileme

สวัสดีคับ ของผมก็คล้ายๆ เคสนี้น่ะคับค่าที่ออกมาไม่ค่อยตรง  เลยไม่อยากสร้างกระทุ้ใหม่    ปล ผมเทสกับ  หลอด 8W 
ของผม -5 ถึง 5 A   Vio  = 1.5 ถึง 3.5   
code ผม

  zero = 511.5   //  ค่า ที่ 2.5   || 0A
aread = analogRead(A0);
  Serial.println(aread);         
  if(aread > zero )
    Amp = ((analogRead(A0) - zero ) /40.92) / 1000;    เเนวคิดผม  อ่านค่าจาก  analog  -  511.5    / ค่าต่อ 1 A   /  ค่าเพื่อให้เป็น mA
  if (Amp > -0)   //  check ถ้าค่า ที่สูงกว่า 0 ให้ เเสดงออกมา
  {
    Serial.println(Amp,5);
    delay(400);
  }

ส่วนสูตรที่ใส่ไป ผิดถูกยังไง เเนะนำผมด้วยครับ   

RoLRoR



คุณ crackfileme อ่านค่า analogRead(A0) จากจุดใดมาแสดงผลน่ะครับ?
อ่านค่าแล้ว print เพื่อแสดงผล ใช้เวลาไปเท่าใด
แล้วอ่านค่าใหม่เพื่อเปรียบเทียบ จุดที่อ่านก็จะเลื่อนไปเรื่อยๆ นะครับ

ให้ sampling ทุกจุด อ่านค่าให้ครบ 1 cycle แล้วเข้าสมการ rms
http://th.wikipedia.org/wiki/ค่าเฉลี่ยกำลังสอง


Arduitronics.com

ลองเข้าไปดูที่ http://openenergymonitor.org นะครับ  มี Library ให้ download ชื่อ emon

https://github.com/openenergymonitor/EmonLib

ทฤษฎีการวัดก็ตามนี้ครับ

http://openenergymonitor.org/emon/buildingblocks