Měření proudu pomocí Arduino

25.03.2022 Arduino #arduino #veličiny #fyzikální #programování

Metody pro měření proud pomocí různých senzorů.


Měření proudu s využitím MCU je možné realizovat pomocí dvou typů senzorů. Prvním typem je řada senzorů ACS712, které se připojují do přerušeného obvodu. Druhým typem jsou senzory, které vyžadují pouze vedení vodiče snímačem bez jeho přerušení. Jedná se například o řadu senzorů WCS1700.

Senzory ASC712

Proudový senzor ACS712 je ekonomické řešení pro měření proudu, interně spolupracuje s Hallovým senzorem, který detekuje magnetické pole, které vzniká indukcí proudu protékajícího měřeným vedením. Snímač dodává napěťový výstup úměrný proudu, v závislosti na aplikaci můžeme použít ACS712-05A, ACS712-20A nebo ACS712-30A pro rozsahy 5, 20 nebo 30 ampér. ACS712 najdeme v modulech, které usnadňují jejich připojení, přinášejí svorkovnici pro připojení linky, kterou chceme měřit a 3 piny, dva pro připojení napájení a pin pro analogový výstup.

Model Rozsah Citlivost
ACS712ELCTR-05B-T -5 až 5 A 185 mV / A
ACS712ELCTR-20A-T -20 až 20 A 100 mV / A
ACS712ELCTR-30A-T -30 až 30 A 66 mV / A

Senzor dává hodnotu 2,5 voltu pro proud 0A a odtud roste proporcionálně podle citlivosti, přičemž mezi napěťovým výstupem senzoru a proudem je lineární vztah. Tento vztah je přímka na grafu napětí vs. proud, kde sklon je citlivost a průsečík na ose Y je 2,5 voltu. Rovnice přímky by byla následující:

Kde m se rovná citlivosti.

Rovnice pro zjištění proudu čtením ze senzoru: 

S touto rovnicí můžeme přistoupit k vytvoření příkladů s Arduinem.

Zapojení čidla s MCU je velmi jednoduché.

 

Některé moduly pro měření proudu mají jiné pořadí pinů. Senzor proudu se do obvodu zapojuje do série a přidá se zátěž. Nikdy se senzor nepřipojuje paralelně.

Základní čtení proudu

Chceme-li provést odečet proudu, stačí přečíst analogový vstup a pomocí výše popsaného vzorce získat proud. Níže je uveden kód pro odečet proudu. Pro 5A senzor, se používá hodnota citlivosti 0,185V/A, což je ekvivalent 185mV/A, který udává výrobce. Pokud pracujeme s 20A senzorem, nahradí se hodnota citlivosti 0,100 V/A. Výsledky jsou viditelné na sériovém monitoru:

float  citlivost = 0.185 ; 

void  setup ( )  {  
  Serial.begin ( 9600 ) ; 
}

void  loop ( )  {  
  float  voltage =  analogRead ( A0 ) * ( 5.0  /  1023.0 ) ;
  float  I = ( voltage - 2.5 ) / citlivost ; 
  Serial.print ( "Proud:" ) ; 
  Serial.println( I, 3 ) ;  
  delay ( 200 ) ;      
}

 

Aplikace filtru pro čtení proudu

Pokud nebude do obvodu připojena zátěž, měl by na výstupu nulový proud. Lze si všimnout, že při čtení se projevuje šum a hodnota není přímo nulová. Pokud při aplikaci nemá šum velký význam, lze pracovat se základním programem. Pokud bychom chtěli zpřesnit měření je nutné aplikovat filtr. Existuje několik typů filtrů, které v závislosti na složitosti mohou spotřebovávat zdroje Arduina. V níže uvedeném případě se jednoduše použije aritmetický průměr několika po sobě jdoucích odečtů. Implementace průměru odečtů v Arduinu je jednoduchá a snadno proveditelná. Jednoduše se sečtou hodnoty a rozdělí se na počet vzorků. Počet vzorků pro výpočet průměru závisí na úrovni šumu, který mají.

Program by byl následující. V uvedeném příkladě, s 200 vzorky se pracuje s velkým šumem, čím větší množství vzorků se získá, tím lepší bude výsledek, ale také déle trvá, než Arduino provede měření. U 200 vzorků to trvá přibližně 35 milisekund, což lze ve většině aplikací považovat za zanedbatelné. Nezaměňujme šum s chybou offsetu, která je v tomto případě přibližně +150 mA, tuto poslední chybu, pokud je reprezentativní, můžeme odečíst výsledkem z aktuální rovnice.

float citlivost=0.185;

void setup() {  
  Serial.begin(9600);
}

void loop() {  
  float I=getAvarage(200);
  Serial.print("Prumer: ");
  Serial.println(I,3); 
  delay(100);     
}

float getAvarage(int n){
  float voltage;
  float avarage=0;

  for(int i=0; i<n; i++)  {
     voltage = analogRead(A0) * (5.0 / 1023.0);
     avarage=avarage+(voltage-2.5)/citlivost;
   }

  avarage=avarage/n;
  return(avarage);
}

Kalibrace senzoru ACS712

Pokud se podíváme na přesnost mření, tak při získání hodnoty ze senzoru 1A, lze multitesterem nebo ampérmetrem, získat odlišnou hodnotu proudu jako například 1,15A. V takovém případě se jedná o chybu -130 mA, která se liší od offsetu nebo chyby pro proud 0A. Pokud jsou takové výsledky opravdu jsou, znamená to, že rovnice, která se používá pro výpočet proudu, není dopovídají a k nápravě je nutné senzor zkalibrovat a najít nové hodnoty citlivosti a napětí ekvivalentní 0A. Pokud je chyba, kterou dostaneme u předchozích příkladů, velká, musíme překalibrovat a najít skutečné hodnoty, protože hodnoty, které uvádí výrobce, nejsou přesné. Rovnice kterou používáme k nalezení proudu je:

V této rovnici máme pouze dvě konstanty: 2.5, což je napětí senzoru, při proudu 0 V a citlivost, která je ekvivalentní strmosti přímky Napětí Vs. Proud; musíme vypočítat skutečné hodnoty těchto dvou konstant. K tomu potřebujeme multimetr nebo ampérmetr, který musí být velmi přesný, protože to bude nástroj ke kalibraci. Ampérmetr, ACS712 a zátěž musí být zapojeny do série. Po připojení ampérmetru a snímače musíme provést odečty napětí snímače, to se provádí pomocí následujícího programu.

void setup() {  
  Serial.begin(9600);
}

void loop() {  
  float voltage =getVoltage(10000);
  Serial.print("Voltage from senzor: ");
  Serial.println(voltage,3);     
}

float getVoltage(int n){
  float voltage=0;  
  for(int i=0; i<n; i++) {
    voltage =voltage+analogRead(A0) * (5.0 / 1023.0);    
  }
  voltage=voltage/n;
  return(voltage);
}

Napětí je jednou z konstant, například to může být 2.527, která odpovídá bodu P1 (2.527,0). K nalezení druhé konstanty se provede druhé měření. Oproti prvnímu měření se použije zátěž, jejíž proud je větší než 1 ampér. Napětí pak může být např. 2.687 V a v ampérmetru naměříme 1.155 A. To je druhý bod P2 (2.687, 1.555), pro výpočet citlivosti. Rovnice pro výpočet citlivosti je: 

Kde citlivost = 0,139 V/A

S těmito novými hodnotami se musí pracovat v předchozích příkladů. Každý senzor má svou vlastní charakteristiku. Dalším způsobem může být vzít několik bodů a nakonec použít regresi a najít rovnici přímky.

Senzory využívající hallův jev

Proudové senzory využívající Hallův jev se zejména hodí k měření vysokých proudů. Přesnost měření přitom závisí na základním principu: U přímo zobrazujících senzorů (Open Loop) se seskupuje magnetické pole primárního proudu v prstencovém jádře obklopujícím vodič. Prstencové jádro má vzduchovou mezeru, ve které je umístěna Hallova sonda. Sonda vytváří napětí, které je přímo úměrné protékajícímu proudu. Na základě pevného zobrazovacího poměru se tak dá určit primární proud s přesností až ± 0,5 %.
Nepřímo zobrazující kompenzační proudové senzory (Closed Loop) mají podobnou konstrukci, zachycují však proud ještě o něco přesněji. Odchylka 0,5 % od skutečné hodnoty je zde maximální hodnota. Tyto senzory pracují rovněž s prstencovým jádrem, které vytváří Hallovo napětí. Napětí se zde ale nesnímá přímo, ale používá se k regulaci sekundárního obvodu proudu. Hallova sonda reguluje sekundární průtok proudu tak, že se magnetická pole sekundárního a primárního proudu vždy navzájem ruší. Sekundární proud dodává současně výstupní signál. Tento typ senzoru má tu výhodu, že mimořádně přesně měří i při extrémních teplotách prostředí mezi -40 °C až +85 °C [1].

Princip měření proudových senzorů Closed-Lopp. Při principu měření Closed-Loop reguluje Hallova sonda průtok proudu v sekundárním vinutí tak, že se magnetická pole sekundárního a primárního proudu navzájem ruší.

Proudový senzor WCS1700

Tento modul obsahuje měřící prvek WCS1700, díky kterému lze měřit jak střídavý, tak stejnosměrný proud. Na modulu se může měřit jak přímo analogovou hodnotu na výstupu senzoru, tak i digitální výstup. Ten slouží jako detektor překonání určité hodnoty proudu, kterou můžeme nastavit trimrem na modulu. Pro napájení senzoru proudu lze použít napětí v rozsahu 3-12 Voltů. Měřící rozsah senzoru je +- 70 Ampér pro stejnosměrný proud a 50 Ampér pro střídavý proud.

Zapojení senzoru WSC1700 je totožné jako u ASC712. Zásadní rozdíl je v tom, že se senzor nezapojuje sériově do měřeného obvodu, ale vodič prochází prstencem senzoru.

#include <Arduino.h>

#define HALL_SENSOR A0


#define SENSOR_POWER_SUPPLY 5 // VDC
#define ANALOG_RANGE 1023
#define SENSOR_RESOLUTION 30 // mV
#define AVG_SAMPLES 10

const uint16_t voltageRange = SENSOR_POWER_SUPPLY * 1000;
uint16_t calcArray[AVG_SAMPLES];

uint16_t calibrationConstant = 0;

uint32_t getAverage(uint16_t *arrayPointer){
  uint32_t sum = 0;
  for(uint8_t i = 0; i < AVG_SAMPLES; i++){
    sum += arrayPointer[i];
  }
  return sum/AVG_SAMPLES;
}

void readCurrent(){
  uint16_t mapValue = 0;
  for(uint8_t i = 0; i < AVG_SAMPLES; i++){
    mapValue = map(analogRead(HALL_SENSOR), 0, ANALOG_RANGE, 0, voltageRange);
    if(mapValue > calibrationConstant){
      calcArray[i] = mapValue - calibrationConstant;
    }else{
      calcArray[i] = 0;
    }
    delay(20);
  }
}

void setup() {
  Serial.begin(9600, SERIAL_8N1);

  pinMode(HALL_SENSOR, INPUT);

  Serial.println("Calibrating, make sure that there is no current flow through wire.");
  delay(2500);
  for(uint8_t i = 0; i < AVG_SAMPLES; i++){
    calcArray[i] = map(analogRead(HALL_SENSOR), 0, ANALOG_RANGE, 0, voltageRange);
    Serial.print(".");
    delay(250);
  }
  Serial.println();
  calibrationConstant = getAverage(calcArray);
  Serial.print("Calibration value: "); Serial.println(calibrationConstant);
  delay(2500);
}

void loop() {
  readCurrent();
  float current = (float)getAverage(calcArray) / SENSOR_RESOLUTION;
  Serial.print("Actual current flow: "); Serial.print(current); Serial.println(" A");
  delay(1000);
}

Uvedený programový kód pracuje s automatickým zjišťování kalibrační konstanty. Kalibrace senzoru musí probíhat bez zapojení zátěže a kalibrace by měla trvat nejméně 5s.

Literatura

[1] Proudové senzory využívající Hallův jev. Https://www.elektroprumysl.cz/ [online]. Praha: HARTING, 2019 [cit. 2022-04-03]. Dostupné z: https://www.elektroprumysl.cz/merici-technika/proudove-senzory-vyuzivajici-halluv-jev