Arduino návody: Měření AC proudu s Arduino UNO

Vlastimil Vágner

V tomto článku Vám přinášíme konstrukci přípravku, který umožňuje využít měřící transformátor proudu CT08CL10 na měření AC proudu s Arduino Uno v jedné fázi 230V AC. Jednoduchou úpravou programu je možné měřit AC proud ve třech fázích současně. Zapojení může posloužit pro inspiraci při podobných měřeních AC proudu. Uvedenou vlakonstrukci nám zaslal náš zákazník Vlastimil Vágner.

Celkový popis

Převodník pro měření proudu využívá měřící proudový transformátor CT08CL10 a převodník pro snímání napětí z měřícího transformátoru je vyrobený na univerzální vrtané destičce. Při výrobě snímače je velice důležité, aby použité rezistory v odporovém děliči měly naprosto shodné hodnoty, stejně tak i použitý zátěžový rezistor pro snímání napětí na sekundárním výstupu z měřícího proudového transformátoru.

Hodnota rezistorů v děliči je důležitá pro správné rozdělení napětí 5VDC na hodnotu 2.5V DC, zátěžový (snímací) rezistor zase ovlivňuje přesnost měření. Jeho hodnotu je možné výpočtem hodnoty jiného rezistoru upravit v programu. Zobrazovaná hodnota proudu je v RMS a v programu je současně vypočítaná fiktivní hodnota spotřeby ve Wattech. Ta se počítá v programu z  napětí sítě 230V AC které je vynásobeno vypočítaným RMS proudem a je pouze orientační. Pro zobrazení na LCD displeji je použit displej 2 x 16 znaků nebo 4 x 20 znaků se sériovým řadičem. Pro připojení LCD displeje s Arduino Uno je použito tří vodičů +5V, -5V a výstupního signálu TXD z desky Arduino Uno na PINU 2, na řadiči je nastavena komunikační rychlost 2400 Bd tato rychlost musí být nastavena i v programu a klidová úroveň „T“.

Napájení převodníku i LCD displeje je z desky Arduino Uno napájené ze vstupního konektoru pro připojení napájení 8 – 12V DC. Na obrázku č.01 je schéma zapojení převodníku pro měření napětí na zátěžovém rezistoru z měřícího proudového transformátoru proudu, na obrázku č.02 je schéma připojení převodníku k desce Arduino Uno pro zobrazování na LCD. Výhoda používání těchto měřících transformátorů (CT) pro měření AC proudu je v galvanickém oddělení primárního vinutí od sekundárního vynutí.

Upozornění : při zapojování a měření AC proudu se pracuje s napětím sítě 230VAC, toto napětí je životu nebezpečné A JE NUTNÉ PRACOVAT OPATRNĚ!

Popis převodníku pro měřící transformátor proudu

Připojení sekundárního vynutí měřícího proudového transformátoru (CT) se zátěžovým rezistorem přímo na vstupy A/D převodníku není zrovna vhodné řešení. Protože proudový transformátor (CT) pouze poskytuje na sekundární straně plovoucí napětí přes zátěžový rezistor, z tohoto důvodu je použit uvedený převodník, aby bylo možné načítat surové napětí který poskytne DC offset k AC napětí tak, aby byl použitelný.

Tento převodník na Obr. č.01 poskytuje DC offset (~ 2.5V) k průběhu střídavého napětí místo toho, aby byl udržován v rozsahu DC. Popsaný převodník je vlastně obyčejný rezistorový dělič napětí z napájecího napětí 5V DC na napětí 2.5V DC, ke kterému je připojen jeden sekundární vývod z měřícího transformátoru proudu se zátěžovým rezistorem a druhý vývod sekundárního vinutí z měřícího transformátoru proudu se zátěžovým rezistorem je připojen na vstup A/D převodníku Arduino Uno.

V případě potřeby je možné prodloužit přívodní vodiče měřícího transformátoru proudu, použijeme dvoužilový stíněný kabel k mikrofonu nebo je možné použít i stíněný UTP kabel. Převodník umožňuje nejjednodušším způsobem měřit AC proud pomocí měřícího proudového transformátoru (CT).

Popis měřícího transformátoru proudu CT08CL10  snímače 20A AC

Měřící transformátor proudu umožňuje měřit AC proud do 20A,  z dokumentace v [1] k tomuto měřícímu transformátoru proudu je udávaný převodní poměr 2000 : 1. Udávaný zátěžový rezistor pro tento proud je 100R, výstupní proud na sekundární straně měřícího transformátoru je s tímto zátěžovým rezistorem 0,01A. Výpočtem z těchto hodnot dostaneme výstupní napětí na zátěžovém rezistoru 1V, 20A / 2000závitů = 0.01A, 100R x 0.01A = 1V.

Dalším výpočtem „√2 x vypočítané napětí“ (√2 x 1V = 1.41V P-P) si zkontrolujeme hodnotu napětí  na zátěžového rezistoru tak aby výstupní napětí na připojeném vstupu A/D převodníku nepřesáhlo referenční hodnotu 2.5V převodníku v tomto případě je vypočítané napětí 1.41V P-P v pořádku. Pokud by vypočítané napětí přesáhlo hodnotu 2.5V volíme jinou hodnotu zátěžového rezistoru na sekundární straně měřícího transformátoru proudu (CT) a hodnoty s tímto zátěžovým rezistorem znova vypočítáme.

S tímto převodníkem pro měření proudu s měřícím transformátorem proudu CT08CL10  je možné využít i měřící transformátor proudu SCT-013-000. Tento měřící transformátor umožňuje měřit maximální proud 100A AC, má převodní poměr 100A : 0.05A a počet závitů 2000, změnou zátěžového rezistoru v přípravku na hodnotu 33R je možné měřit AC proud v celém uvedeném rozsahu 0 – 100A.   

Upozornění: Nikdy nesmíte osadit měřící transformátor proudu do elektrického okruhu s rozpojenými vývody na sekundární straně! Pokud na sekundární vinutí není připojen žádný snímací prvek, musí se tyto vývody zkratovat.

Použité měřící transformátory proudu SCT-013-000 a CT08CL10

Vyrobený převodník pro používání k AC měřícím proudovým transformátorům

Připojení topné spirály při testování měřícího transformátoru proudu CT08CL10

Naměřená hodnota proudu připojené spirály se zobrazením na LCD displeji

Zobrazení hodnot bez měřeného proudu na LCD displeji

Příprava na testování programu pro měření na měřícím transformátoru proudu

// Mereni AC proudu s mericim transformatorem proudu 20A typ: CT-08CL10, 2000:1 
// se zobrazenim na LCD se seriovou komunikaci, pro mereni AC proudu / 230V AC. 
// www.mojeelektronika.mzf.cz  vagnervlastimil@seznam.cz

#include <SoftwareSerial.h>                    // pripojeni knihovny pro kmunikaci  LCD displejem
#define txPin 2                                // definovani komunikacniho pinu s lcd displejem klidova uroven na lcd je nastavena na "T" vysoka 
SoftwareSerial LCD = SoftwareSerial(0, txPin); // pripojeni nastavenych parametru ke knihovně
const int LCDdelay=300;                        // nastaveni casove prodlevy pro lcd displej
#define L1_pinTrafo A0                         // nastaveni cisla PINU pro pripojeni vystupu zatezoveho (snimaciho) rezistoru
int prevod = 2000;                             // prevodni pomer transformatoru
float odpor = 100.0;                           // hodnota zatezoveho (snimaciho) rezistoru
float L1_Spickovenapeti;                       // seznam mericich promennych 
float L1_Spickovyproud;                        // seznam mericich promennych 
float L1_proudRMSnaRezistoru;                  // seznam mericich promennych 
float L1_proudRMS;                             // seznam mericich promennych 
float L1_odberWatt;                            // seznam mericich promennych 
float L1_celkem;                               // seznam mericich promennych 

void setup(){
delay(1000);                                   // casova prodleva  
pinMode(L1_pinTrafo, INPUT);                   // nastaveni pinu s prevodnik transformatoreem jako vstup
pinMode(txPin, OUTPUT);                        // nastaveni komunikacniho pinu na vystup
LCD.begin(2400);                               // nastaveni prenosove rychlosti
smazLCD();                                     // prikaz pro inicializaci lcd a smazani displeje
podsviceniOn() ;                               // zapnuti podsviceni displeje
kursorOff();                                   // vypnuti kursoru blikani
posunvpravo();                                 // nastaveni posunu znaku vpravo  
}

void loop() {
L1_Spickovenapeti = L1_NapetiSpickaSpicka();                // ziskani napeti Spicka-spicka pomoci funkce 
L1_Spickovyproud = ((L1_Spickovenapeti / odpor) * 1000.0);  // vypocet proudu v mA tekoucjho rezistorem pomoci Ohmova zakona
L1_proudRMSnaRezistoru = (L1_Spickovyproud * 0.707);        // vypocet RMS hodnoty proudu
L1_proudRMS = (L1_proudRMSnaRezistoru * prevod);            // vypocet mereneho proudu diky znalosti prevodniho pomeru 2000:1
L1_odberWatt = 230.0 * (L1_proudRMS / 1000.0);              // zjednoduseny vypocet spotreby ve Wttech 230=sitove napeti
L1_celkem = (L1_proudRMS / 1000);                           // prepocet z honoty mA pro zobrazeni "A" 0.134A
LCDpoziceznaku(0,0); LCD.print("L1 A: ");                   // nastaveni pozice prvniho znaku na prvnim radku
delay(100);                                                 // casova prodleva pro zapis znaku
if (L1_proudRMS <= 0 ){                                     // porovnani hodnoty pokud je nizssi nebo rovna "0" pokracuje na dalsim radku
LCDpoziceznaku(0,6); LCD.print("          ");}              // vymazani znaku od pozice 0,6  
else{                                                       // pokud neni pravda pokracuje na dalsim radku
LCDpoziceznaku(0,6); LCD.print(L1_celkem,3);                // nastaveni pozice vypoctu na prvnim radku vysledek na tri desetinna mista
delay(100);}                                                // casova prodleva pro zapis znaku
LCDpoziceznaku(1,0); LCD.print("L1 W: ");                   // nastaveni pozice prvniho znaku na ctvrtem radku
delay(100);                                                 // casova prodleva pro zapis znaku
if (L1_odberWatt <= 0){                                     // porovnani hodnoty pokud je nizssi nebo rovna "0" pokracuje na dalsim radku
LCDpoziceznaku(1,6); LCD.print("          ");}              // vymazani znaku od pozice 0,6  
else{                                                       // pokud neni pravda pokracuje na dalsim radku
LCDpoziceznaku(1,6); LCD.print(L1_odberWatt,3);             // nastaveni pozice vypoctu na druhem radku vysledek na tri desetinna mista
delay(3000);}                                               // casova prodleva pred dalsim cteni proudu
}
float L1_NapetiSpickaSpicka(){                        
float L1_vysledek = 0;                                      // merici promenne
int L1_merenaHodnota = 0;                                   // merici promenne
int L1_maximum = 0;                                         // merici promenne
unsigned long zacatekMereni = millis();                     // ulozeni startovaciho casu
while ((millis() - zacatekMereni) < 1000){                  // mereni po dobu jedne sekundy 
L1_merenaHodnota = analogRead(L1_pinTrafo);                 // mereni napeti na odporu
if (L1_merenaHodnota > L1_maximum){                         // nalezeni maxima
L1_maximum = L1_merenaHodnota;                              // ulozeni noveho maxima
  }
 }
L1_vysledek = ((L1_maximum * 5.0) / 1024);                  // prevod vysledku na napeti ve Voltech
L1_vysledek = (L1_vysledek - 2.500);                        // vypocet hodnoty o stejnosmerne napeti prevodniku 2.500V
return L1_vysledek;                                         // vraceni vysledku funkce
}
//podprogramy pro nastaveni lcd displeje
void LCDpoziceznaku(int row, int col){                      // nastaveni pozice zobrazeni znaku
if(row>1){row -= 2;                                         // porovnani zda je row vetsi nez jedna
LCD.write(0xFE); LCD.write((col + row*64 + 148));}          // vypocet pozice znaku pro treti a ctvrty radek
else{LCD.write(0xFE);LCD.write((col + row*64 + 128));}      // vypocet pozice znaku pro prvni a druhy radek
delay(LCDdelay);}                                           // konec podporgramu
void smazLCD(){                                             // smazani a inicializace lcd displeje
LCD.write(0xFE); LCD.write(0x01); delay(LCDdelay);}         // prikaz pro smazani
void podsviceniOn(){                                        // zapnuti podsviceni lcd displeje 
LCD.write(0xFE); LCD.write(0xE9);  delay(LCDdelay);}        // prikaz pro zapnuti
void podsviceniOff(){                                       // vypnuti podsviceni lcd displeje
LCD.write(0xFE); LCD.write(0xE8);  delay(LCDdelay);}        // prikaz pro vypnuti podsviceni displeje
void kursorOn(){                                            // zapnuti kursoru podtrzitka blikani
LCD.write(0xFE); LCD.write(0x0E); delay(LCDdelay);}         // prikaz pro zapnuti kursoru zobrazeni
void kursorOff(){                                           // prikaz pro vypnuti zobrazeni kursoru
LCD.write(0xFE); LCD.write(0x0C); delay(LCDdelay);}         // prikaz pro vypnuti kursoru
void posunvpravo(){                                         // zapsane znaky se zapisuji zleva doprava
LCD.write(0xFE); LCD.write(0x06); delay(LCDdelay);}         // prikaz pro posun zapsanych znaku

Sdílet článek

2 komentáře

  1. Dobrý den,
    mám dvě otázky/komentáře:
    1) není nutné/vhodné ošetřit zapojení proti proudovým špičkám vznikajícím při spuštění spotřebiče? Čekal bych, že například taková lednička (protože indukce motoru) může při zapnutí (i vypnutí) způsobit značnou proudovou špičku. Tak se potom v nějaké podobě přenese (přes snímací rezistor) i na vstup MCU. Asi by se mě tam líbili nějaké rychlé schottkyho diody. A nebo je vstup MCU proti takových jehlovým impulzům od

    2) asi všichni chápeme, co znamená upozornění

    NIKDY SE NESMÍ OSADIT MĚŘÍCÍ TRANSFORMÁTOR PROUDU DO EL. OKRUHU BEZ TOHO ABY BYLI VÝVODY NA SEKUNDÁRNÍ STRANĚ ROZPOJENY!

    ale přeci jen bych slovo „ROZPOJENY“ nahradil něčím jako „PROPOJENY/SPOJENY/ZATÍŽENY/…“

    Každopádně díky za podrobně popsaný a vysvětlený nápad.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit