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

  • 12 Replies
  • 5576 Views
*

Offline pa_ul

  • ***
  • 247
    • View Profile
โค้ดแรกถูกแล้ว ถ้า
- delay(1) คือประมาณ 1 mS
- analogRead() รีเทอร์นค่าสูงสุด 1023 เมื่อมีแรงดัน 5 โวลท์ ที่ขา Analog

ส่วนโค้ดที่แก้มาใหม่ผิดครับ
- for loop อันแรก เมื่อทำจบแล้ว ได้ค่าสุดท้ายของ Isamp เท่านั้น
- ค่าที่ได้ข้างต้นถูกนำไปคำนวณใน for loop ที่สอง จึงได้ผลลัพธ์ที่ผิด

ปล. น่าจะสั่งแสดงค่า Isamp ทั้ง 20 ค่าที่อ่านได้ออกมา เพื่อวิเคราะห์ว่าการอ่านค่ามีความผิดพลาดอย่างไรบ้าง

*

Offline RoLRoR

  • *****
  • 334
    • View Profile
โค้ดแรกน่าจะผิดตรงที่ ใช้ 512-ค่าที่แซมปลิ้งมาทุกค่า
  - ต้องมีเข้าเงื่อนไขมากหรือน้อยกว่าค่าเซ็ตศูนย์ ด้วยก่อน ลบออกหรือถูกลบออก
  - และไฟไม่ได้ที่ตรง 5โวลท์ จริงๆ ค่าเซตศูนย์ก็จะขยับไป มากหรือน้อยกว่า 512 ด้วยครับ

โค้ดที่สอง ตามคุณ paul เลยครับ ประกาศตัวแปรเป็น array 80 ตัว แล้ว ไม่ได้ใช้
:::แก้ไข:::
คุณ atommicmass โค้ด 2 น่าจะทำถูกแล้ว แต่โพสลงกระทู้ array วงเล็บสี่เหลี่ยม ไม่แสดง  ;D

*

Offline skytec

  • *****
  • 1030
  • "จินตนาการสำคัญกว่าความรู้ " --อัลเบิรต ไอสไตน์
    • View Profile
    • R&D , Technical Consultants , Sensor Developer  , Engineering consultants
ลองดูตัวอย่างตามนี้อาจมีประโยชน์ครับ
https://forum.sparkfun.com/viewtopic.php?f=6&t=33605

int VQ;
int ACSPin = A2;

void setup() {
  Serial.begin(9600);
  VQ = determineVQ(ACSPin); //Quiscent output voltage - the average voltage ACS712 shows with no load (0 A)
  delay(1000);
}

void loop() {
  Serial.print("ACS712@A2:");Serial.print(readCurrent(ACSPin),3);Serial.println(" mA");
  delay(150);
}

int determineVQ(int PIN) {
  Serial.print("estimating avg. quiscent voltage:");
  long VQ = 0;
  //read 5000 samples to stabilise value
  for (int i=0; i<5000; i++) {
    VQ += analogRead(PIN);
    delay(1);//depends on sampling (on filter capacitor), can be 1/80000 (80kHz) max.
  }
  VQ /= 5000;
  Serial.print(map(VQ, 0, 1023, 0, 5000));Serial.println(" mV");
  return int(VQ);
}

float readCurrent(int PIN) {
  int current = 0;
  int sensitivity = 185.0;//change this to 100 for ACS712-20A or to 66 for ACS712-30A
  //read 5 samples to stabilise value
  for (int i=0; i<5; i++) {
    current += analogRead(PIN) - VQ;
    delay(1);
  }
  current = map(current/5, 0, 1023, 0, 5000);
  return float(current)/sensitivity;
}


"จินตนาการสำคัญกว่าความรู้ ความรู้มีข้อจำกัด จิตนาการไร้ขอบเขต " --อัลเบิร์ต ไอสไตน์

*

Offline prakit340

  • **
  • 75
  • https://www.facebook.com/prakit340
    • View Profile
    • 12Com
ลองดูของผมบ้าง อิอิ สูตร ผมคิดคำนวน ตัดสูตรสมการ ในการดาษ แล้วเอาสูตรมาใช้เลย

for (int i=0; i<2000; i++)
    {
        Vin = Vin + analogRead(ACSPin);
        delay(0.1);
    }
Vin = Vin/2000;
if(Vin <= 512) Vin = 512;
Iamp = (0.02639*Vin)-13.5135;    *

Vin คือ ค่าที่เข้ามาทางขา Analog ของ Arduino ซึ่งมาจากเซ็นเซอร์

ปล. * คือสูตร ในที่นี้คือ ACS712   5.0A  แต่ละย่าน สูตรไม่เท่ากัน สูตรก็ คิดสมการ แล้วย้ายข้างไปมา อิอิ

คือ หากเราได้ค่า Irms มาแล้ว เราสามารถนำค่านี้ไปคิดเป็นค่าไฟฟ้าเรยได้ไหมครับ....