Autor: Samir Gutić
Pročitano: 2269 puta

ACS712 30A Current sensorSenzor ACS712 služi za mjerenje AC i DC struje. Dolazi u više verzija. Verzija korištena u ovom članku je za maksimalnu struju od 30A. Senzor je Hall-ova sonda.

Za mjerenje struje će, pored ACS712 senzora, biti korišten još Arduino UNO i grijalica snage 2kW sa dvostepenom regulacijiom (1kW ili 2kW) za generisanje struje za mjerenje.

NAPOMENA: U ČLANKU ĆE BITI OPISAN POSTUPAK MJERENJA NAIZMJENIČNE STRUJE U STRUJNOM KRUGU MREŽNOG NAPONA 230V. MREŽNI NAPON JE OPASAN PO ŽIVOT. AKO NISTE KVALIFIKOVANI ZA RAD SA MREŽNIM NAPONOM, OVAJ ČLANAK NIJE ZA VAS.

ACS712 senzor ima tri pina na niskonaponskoj strani za povezivanje sa Arduinom in dva pina na visokonaponskoj strani za povezivanje u krug za mjerenje struje. Senzor ACS712 se napaja sa Arduino 5V pina.

Za mjerenje naizmjenične struje je potrebno imati potrošač koji se napaja iz 230V mreže. Budući da mjerimo struju, ACS712 senzor je potrebno spojiti u seriju sa potrošačem. Ja sam koristio grijalicu od 2kW koja ima mogućnost preklopa na polovinu snage i punu snagu (da imam barem dva nivoa za mjerenje).

U seriju sam spojio i digitalni TRMS (True Root Mean Square) instrument kao referencau za utvrđivanje tačnosti mjerenja i za kalibraciju samog senzora.

Ispod je šema spoja:

AC mjerenje struje - ACS712

Kao što se vidi sa slike iznad, GND pin ACS712 senzora je spojen na GND Arduina, 5V (VCC)  pin  ACS712 senzora je spojena na 5V pin Arduina i Vo (OUT) pin je spojen na A0 analogni pin Arduina. Visokonaponska strana senzora se spojena u seriju sa potrošačem.

Budući da ACS712 senzor ima analogni izlaz, potrebno ga je povezati na analogni ulaz Arduina. Vrijednost na izlazu ACS712 senzora može biti između 0 i 1024. Na osnovu te vrijednosti je potrebno izračunati struju koja trenutno protiče kroz senzor.

Budući da se radi o mjerenju naizmjenične struje, biće mjerena efektivna vrijednost naizmjenične struje. Već sam spominjao da sam u šemi koristio TRMS koji je puno tačniji kada se radi o mjerenju naizmjenične struje koja sadrži više harmonike ili uopšte nije sinusoidalnog oblika. Ja sam koristio BT-770M multimetar ali je moguće koristiti bilo koji ampermetar za naizmjeničnu struju. Budući da će instrument biti korišten za kalibraciju ACS712 senzora, tačnost mjerenja senzora će zavisiti o tačnosti samog instrumenta.

Nakon povezivanja svih elemenata po šemi iznad je potrebno pokrenuti Arduino IDE i instalirati biblioteku Filters.h. Ovu biblioteku, koja vrši većinu proračuna, možete preuzeti sa linka ispod:

 

Nakon downloada file-a Filters-master.zip je potrebno izabrati izabrati Sketch\Include Library\Add .ZIP Library... i pronaći download-ovani ZIP file Filters-master.zip.Time će biblioteka  Filters.h biti instalirana.

Sada je moguće kopirati i pastirati sljedeći Arduino kôd:

// Mjerenje naizmjenične struje pomoću ACS712 30A current senzora
// Za mjerenje se koristi TRMS (True Root Mean Square) zbog povećavanja tačnosti

#include // Biblioteka za računanje TRMS
#define intAnalogniUlaz A0 // Analogni pin za mjerenje

float floatMjerenje; // Analogna vrijednost očitana sa analognog pina
float floatFrekvencija = 50; // Frekvencija testnog signala [Hz]
float floatOdstupanje = -0.05; // Korekcija koja se dobija empirijski na osnovu testiranja ACS712 modula (eliminisanje offseta za stvarnih 0A)
// Vrijednost se mijenja dok se pri stvarnoj struji 0A ne dobije prikaz što bliži 0
float intervalMjerenja = 50.0/floatFrekvencija; // Interval za računanje prosječne (efektivne) vrijednosti signala
float floatKoeficijent = 0.075; // Koeficijent za računanje vrijednosti struje (0.0752). Dobije se empirijski poređenjem sa mjerenjem TRMS instrumenta
// Vrijednost izmjerenu nekim TRMS instrumentom podijeliti sa inputStats.sigma() vrijednosti da se dobije floatKoeficijent
// floatKoeficijent=stvarna_vrijednost_struje/inputStats.sigma()
// Manja vrijednost => manja izmjerena struja
float floatStruja; // Izračunata vrijedost struje u [A]
unsigned long periodOcitavanja = 1000; // Vrijednost u milisekundama
unsigned long vrijemeOdZadnjegMjerenja = 0; // Pratiti proteklo vrijeme od zadnjeg očitavanja

void setup()
{
Serial.begin(57600);
pinMode(intAnalogniUlaz,INPUT);
}

void loop()
{
RunningStatistics inputStats; // Kreira statistiku očitanog analognog signala (Filters biblioteka)
inputStats.setWindowSecs(intervalMjerenja); // Postavlja širinu segmenta za mjerenje sinusnog signala

while(true)
{
floatMjerenje = analogRead(intAnalogniUlaz); // Očitavanje analognog ulaza
inputStats.input(floatMjerenje); // Pošalji podatke u Stats funkciju Filters.h biblioteke

// Računanje se vrši svako periodOcitavanja [mS]
if((unsigned long)(millis() - vrijemeOdZadnjegMjerenja) >= periodOcitavanja)
{
// Reset intervala
vrijemeOdZadnjegMjerenja = millis();

// Računanje izmjerene struje
floatStruja = floatKoeficijent * inputStats.sigma() + floatOdstupanje;

// Eliminisati negativnu vrijednost (za slučaj da je stvarna struja 0A - nije obavezno)
if (floatStruja<0.0)
{
floatStruja=0;
}

// Prikaz izmjerene (izračunate) TRMS vrijednosti naizmjenične struje na serijski monitor
Serial.print("\t Izmjerena struja: ");
Serial.print(floatStruja);
Serial.println(" A");

// Za računanje vrijednosti floatKoeficijent
// Serial.print("\t TRMS vrijednost: ");
// Serial.println(inputStats.sigma());

// Koeficijent za računanje vrijednosti struje floatKoeficijent dobije se tako da se vrijednost izmjerena nekim TRMS instrumentom podijeli sa inputStats.sigma()
// floatKoeficijent=stvarna_vrijednost_struje/inputStats.sigma()
}
}
}

Šta radi Arduino sketch iznad? U kodu su komentari koji opisuju skoro svaku liniju pa ću objasniti samo šta sketch radi.

U Setup proceduri se konfiguriše serijska komunikacija (brzina 57600) i definiše analogni pin koji će biti korišten za komunikaciju ACS712 senzorom (A0).

Na početku Loop procedure se kreira inputStats objekat za proračune koje vrši Filters.h biblioteka i definiše se širina segmenta z amjerenje naizmjeničnog signala. 

Unutar While petlje se prvo očitava vrijednost analognog ulaza A0 i očitana vrijednost šalje u Stats funkciju Filters.h biblioteke.

U If naredbi se provjerava da li je isteklo podešeno vrijeme za računanje vrijednosti izmjerene struje (varijabla periodOcitavanja). U ovom primjeru je to 1s (1000ms).

Unutar If naredbe se prvo resetuje varijabla vrijemeOdZadnjegMjerenja i računa izmjerena struja floatStruja.

U liniji floatStruja = floatKoeficijent * inputStats.sigma() + floatOdstupanje; su dvije varijable koje predstavljaju kalibracijske faktore koji zavise od svakog pojedinačnog modula i potrebno ih je mjerenjem utvrditi za svaki modul.

To su varijable floatKoeficijent  i floatOdstupanje . Postupak je vrlo jednostavan i potrebno ga je obaviti prije upotrebe modula za stvarno mjerenje struje.

Kalibracija ACS712 senzor

Svaki ACS712 senzor je potrebno kalibrirati prije zvanične upotrebe. Prvo treba eliminisati offset (odstupanje od stvarne nule) u slučaju da je struja stvarno 0A (prekinut strujni krug).

Vrijednost varijable floatOdstupanje ćemo utvrditi tako da prvo mjerenje obavimo sa isključenim potrošačem - struja 0A a vrijednost varijable floatOdstupanje postavimo na nulu floatOdstupanje=0.0;

Budući da je stvarna struje 0A, prikaz u serijskoj konzoli, odnosno vrijednost koju mjeri ACS712 senzor bi morala biti 0A, odnosno Izmjerena struja: 0.00 A

U slučaju da je prikazana vrijednost različita od nule, tu vrijednost je potrebno oduzeti/dodati na izračunatu vrijednost struje - to je vrijednost varijable floatOdstupanje ali sa suprotnim predznakom. U mom slučaju je to bilo 0.05A pa je kod mene float floatOdstupanje = -0.05; Na ovaj način će biti eliminisan offset ACS712 senzora.

Drugi korak je utvrđivanje vrijednosti varijable floatKoeficijent. Za to je prvo potrebno vrijednost floatKoeficijent postaviti na nulu float floatKoeficijent = 0.0;

Nakon toga komentarisati sljedeće tri linije:

Serial.print("\t Izmjerena struja: ");
Serial.print(floatStruja);
Serial.println(" A");

i odkomentarisati sljedeće dvije linije:

Serial.print("\t TRMS vrijednost: ");
Serial.println(inputStats.sigma());

Po uploadu sketcha je potrebno uključiti potrošač, sačekati da se umiri prikaz u serijskoj konzoli i očitati vrijednost koju mjeri kontrolni instrument. U mom primjeru je, za izmjerenu struju 4.02A (TRMS instrument) prikaz u serijskoj konzoli bio TRMS vrijednost: 53.61

Na osnovu toga je floatKoeficijent=4.02/53.61=0.07496≈0.075

Sada ponovo komentarisati linije za prikaz TRMS vrijednosti i odkomentrarisati tri linije za prikaz izmjerene struje te za varijablu floatKoeficijent upisati izračunatu vrijednost float floatKoeficijent = 0.075;

Na kraju ponovo upload-ati novi sketch uključiti potrošač i pratiti prikaz na serijskoj konzoli i na kontrolnom instrumentu:

ACS712 mjerenjeKontrolno mjerenje

Kao što se vidi na slikama iznad, mjerenja ACS712 senzora su od 4.05A do 4.07A dok kontrolni instrument prikazuje 4.06A. To znači da je odstupanje samo ±0.01A, odnosno 0.25% što je impresivno za tako mali senzor.

Potrebne komponente:

1 x Arduino UNO
1 x ACS712 30A current sensor
1 x TRMS multimetar (naizmjenični ampermetar)
1 x Grijalica (potrošač)
Žice za spajanje

UPOZORENJE: U ČLANKU JE OPISAN POSTUPAK MJERENJA NAIZMJENIČNE STRUJE U STRUJNOM KRUGU MREŽNOG NAPONA 230V. MREŽNI NAPON JE OPASAN PO ŽIVOT. SVE OPISANE AKCIJE IZVODITE NA VLASTITU ODGOVORNOST. AKO NISTE KVALIFIKOVANI ZA RAD SA MREŽNIM NAPONOM, OVAJ ČLANAK NIJE ZA VAS.