Nội Dung Bài Viết
Giới thiệu module ACS712
Module ACS712 sử dụng IC cảm biến dòng ACS712. ACS 712 là một IC cảm biến dòng tuyến tính dựa trên hiệu ứng Hall. ACS xuất ra 1 tín hiệu analog, Vout biến đổi tuyến tính theo sự thay đổi của dòng điện Ip được lấy mẫu thứ cấp DC (hoặc AC), trong phạm vi đã cho.
Ưu điểm của ACS 712
- Đường tín hiệu analog có độ nhiễu thấp.
- Thời gian tăng của đầu ra để đáp ứng với đầu vào là 5µs.
- Điện trở dây dẫn trong là 1.2mΩ.
- Nguồn vận hành đơn là 5V.
- Độ nhạy đầu ra từ 63-190mV/A.
- Điện áp ra cực kỳ ổn định.
- ACS 712 5A (x05B).
- Ip: -5A – 5A.
- Độ nhạy: 180 – 190 mV/A.
Module ACS712 có loại
- ACS 712-05B (5Ampe): 180 – 190 mV/A
- ACS 712-20A (20Ampe): 96 – 104 mV/A
- ACS 712-30A (30Ampe): 64 – 68 mV/A
Sơ đồ chân Module ACS712
Đo dòng dòng điện DC qua tải với ACS712-5A
Khi đo DC phải mắc tải nối tiếp Ip+ và Ip- đúng chiều. Điện áp đầu ra (chân Out) từ 2.5 – 5V tương ứng dòng 0 – 5A, nếu mắc ngược điệp áp sẽ ra điện thế 2.5V đến 0V tương ứng với 0A đến -5A.
Để đổi điện áp ra dòng điện trong lập trình IDE Arduino, cần offset điện áp lúc đầu là 2.5V (lúc chưa tải) tương ứng với 0A. Ở đây tôi lấy độ nhạy cảm biến ACS712-5A là 185mV/A. Tức là tính từ mức 2.5V mỗi lần tăng lên 185mV ta được 1A. Vậy công thức tính dòng điện sẽ là:
ecurrent = ((Voltage – offsetvoltage) / sensitivity)
Trong đó:
ecurrent: dòng điện đo
Voltage: Điện áp cảm VĐK đo được từ Output cảm biến
offsetvoltage: Điện áp offset (2.5V)
sensitivity: độ nhạy của cảm biến (185mV/A).
Trong lập trình Arduino ta dùng công thức sau để đọc giá trị điện áp từ output:
Voltage = (adcvalue / 1024.0) * 5000; (mV)
Trong đó: adcvalue là giá trị analog VĐK đọc được.
Sơ đồ kết nối ACS712-5A với Arduino mô phỏng Proteus
Chương trình Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | // include the library code: #include <LiquidCrystal.h> //library for LCD // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //Measuring Current Using ACS712 const int analogchannel = 0; //Kết nối Output cảm biến với chân A0 Arduino int sensitivity = 185; // Độ nhạy là 100 cho Module 20A và 66 cho Module 30A int adcvalue= 0; int offsetvoltage = 2500; double Voltage = 0; // Giá trị điện áp double ecurrent = 0;// Giá trị dòng void setup() { //baud rate Serial.begin(9600); lcd.begin(20, 4); lcd.setCursor(1,1); lcd.print("SVTDHNLU.COM"); delay(3000); lcd.clear(); lcd.display(); lcd.setCursor(1,0); lcd.print("Doc gia tri tu: "); lcd.setCursor(1,1); lcd.print("Cam bien dong DC"); lcd.setCursor(5,2); lcd.print("ACS 712"); delay(2000); } void loop() { adcvalue = analogRead(analogchannel);//Đọc giá trị cảm biến từ chân Analog Voltage = (adcvalue / 1024.0) * 5000; // mV ecurrent = ((Voltage - offsetvoltage) / sensitivity); //Công thức tính dòng điện (A) lcd.clear();//clears the display of LCD delay(1000);//delay of 1 sec lcd.display(); lcd.setCursor(1,0); lcd.print("adc Value = "); lcd.setCursor(13,0); lcd.print(adcvalue); Serial.print("\t mV = "); Serial.print(Voltage,3); // Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(1,1); lcd.print("Diep ap = "); lcd.setCursor(11,1); lcd.print(Voltage,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(17,1); lcd.print("mV"); Serial.print("\t Dong dien = "); Serial.println(ecurrent,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(1,2); lcd.print("Dong dien = "); lcd.setCursor(11,2); lcd.print(ecurrent,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(16,2); lcd.print("A"); delay(2500); } |
Video mô phỏng Proteus
Đo dòng dòng điện AC qua tải với ACS712-5A
Khi đo dòng điện AC, do dòng điện AC không có chiều nên không cần quan tâm chiều. Như ta đã biết dòng điện xoay chiều là dòng điện có cường độ biến thiên tuần hoàn với thời gian theo quy luật của hàm sin hay cosin.
Đối với dòng điện AC thì ta quan tâm đến giá trị hiệu dụng của nó. Để sử dụng cảm biến dòng ACS712 để đo dòng điện xoay chiều, điều quan trọng là tính được giá trị hiệu dụng của dòng điện (RMS).
Với ACS712 để đo được dòng điện với những giá trị điện áp đỉnh đầu vào. Chúng ta cần tính điện áp hiệu dụng:
- Tìm điện áp đỉnh đến đỉnh (Volts Peak to Peak)
- Chia điện áp đỉnh đến đỉnh cho 2 được điện áp đỉnh (Volts Peak)
- Nhân điện áp đỉnh với 0.707 thu được điện áp hiệu dụng (Volts RMS)
Tính được điện áp hiệu dùng rồi chỉ cần chia với độ nhạy của cảm biến mv/A nữa là ta tìm được dòng điện hiệu dụng.
Do điện áp đỉnh thay đổi liên tục, vì vậy chúng ta cần phải lấy nhiều giá trị điện áp đỉnh trong một khoảng thời gian đủ dài để có một kết quả chính xác.
Trong chương trình Arduino dưới đây, điện áp đỉnh đến đỉnh được lấy mẫu trong 1s trong hàm getVPP().
Sơ đồ kết nối ACS712-5A với Arduino mô phỏng Proteus
Chương trình Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <LiquidCrystal.h> //library for LCD // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //Measuring Current Using ACS712 const int analogchannel = 0; //Kết nối Output cảm biến với chân A0 Arduino int sensitivity = 185; // Độ nhạy là 100 cho Module 20A và 66 cho Module 30A double Voltage = 0; // Giá trị điện áp double VRMS = 0; double AmpsRMS = 0; void setup(){ Serial.begin(9600);//baud rate at which arduino communicates with Laptop/PC lcd.begin(20, 4); lcd.setCursor(1,1); lcd.print("SVTDHNLU.COM"); delay(3000); lcd.clear(); lcd.display(); lcd.setCursor(1,0); lcd.print("Doc gia tri tu: "); lcd.setCursor(1,1); lcd.print("Cam bien dong DC"); lcd.setCursor(5,2); lcd.print("ACS 712"); delay(2000); } void loop(){ Voltage = getVPP(); VRMS = (Voltage/2.0) *0.707; AmpsRMS = (VRMS * 1000)/sensitivity; Serial.print(AmpsRMS); Serial.println(" Amps RMS"); lcd.clear();//clears the display of LCD delay(1000);//delay of 1 sec lcd.display(); Serial.print("\t mV = "); Serial.print(Voltage,3); // Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(1,1); lcd.print("Diep ap = "); lcd.setCursor(11,1); lcd.print(Voltage,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(17,1); lcd.print("mV"); Serial.print("\t Dong dien = "); Serial.println(AmpsRMS,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(1,2); lcd.print("Dong dien = "); lcd.setCursor(11,2); lcd.print(AmpsRMS,3);//Hiển thị 3 chữ số thập phân sau dấu chấm lcd.setCursor(16,2); lcd.print("A"); delay(2500); } float getVPP() { float result; int readValue; //value read from the sensor int maxValue = 0; // store max value here int minValue = 1024; // store min value here uint32_t start_time = millis(); while((millis()-start_time) < 1000) //sample for 1 Sec { readValue = analogRead(analogchannel); // see if you have a new maxValue if (readValue > maxValue) { /*record the maximum sensor value*/ maxValue = readValue; } if (readValue < minValue) { /*record the maximum sensor value*/ minValue = readValue; } } // Subtract min from max result = ((maxValue - minValue) * 5.0)/1024.0; return result; } |
Video mô phỏng
Thư viện ACS712
Một số hàm có trong thư viện:
ACS712( ACS712_type type, uint8_t _pin )
Trong đó:
ACS712_type type : Hỗ trợ 3 models ACS712_05B, ACS712_20A, ACS712_30A
uint8_t_pin: Chân analog input
float getCurrentDC()
Đọc giá trị dòng điện DC
float getCurrentAC( uint16_t frequency )
Đọc giá trị dòng điện AC với tần số fequency
float getCurrentAC()
Đọc giá trị dòng điện AC với tần số 50Hz
int calibrate()
void setZeroPoint( int _zero )
Download file
Code ACS712-5A DC + Proteus
Code ACS712-5A AC + Proteus
Thư viện ACS712
Nguồn tham khảo thư viện
Lưu ý: Phần mềm proteus mô phỏng chương trình trên được sử dụng là phần mềm proteus 8.7
Bài viết các bạn có thể tham khảo:
- Nguyên lý và sử dụng nguồn xung hay bộ biến đổi nguồn DC-DC
- Đo nhiệt độ từ PT100 sử dụng Arduino với cầu Wheatstone
- Arduino với thermocouple loại K