Měření napětí

 

 

Měření napětí

Arduinem lze měřit stejnosměrné napětí. Napětí připojíme na jeden z analogových pinů, např. na pin "A0".  Na analogový pin lze připojit max. 5 V, vyšší napětí poškodí procesor. Připojené napětí je procesorem převedeno na 10ti bitovou hodnotu, max. 1023. Při měření napětí 5V je analogová hodnota "nasekaná" na dílčí intervaly (5/1023), tj. 0.0048875 V na jeden interval (cca 4,9 mV). V daném případě je teoretické rozlišení měření cca 0,005V. V následujícím zapojení přivedeme 0-5V na pin "A0". "Interní" bitovou hodnotu 0-1023 budeme sledovat příkazem "Serial.println(U)" na sériovém monitoru v PC. Sériový monitor otevřeme ve vývojovém prostředí (IDE) kliknutím na ikonu lupy v pravém horním rohu displeje PC. Byla použita deska NANO.

Skeč "zde":

float U;                             //deklarace proměnné

void setup()                     //část programu - nastavení

{Serial.begin(9600);}    //aktivace komunikace se sériovým monitorem (rychlost přenosu dat 9600 baudů, stejnou rychlost nastavíme v sériovém monitoru)

void loop()                      //část programu - smyčka  

{U=analogRead(A0);    //načtení analogového pinu "A0"

Serial.println(U);           //tisk hodnoty "U" na sériový monitor

delay (1000); }              //smyčka čeká 1 sekundu

             

 Uvedený skeč přeneseme např. "klipbordem" na vyprázdněnou plochu vývojového prostředí IDE (případně zobrazíme soubor a přeneseme) a nahrajeme do desky Arduina. Následně spustíme sériový monitor ikonou lupy v pravém horním rohu displeje a sledujeme načtené binární hodnoty v rozsahu 0-1023 podle otáčení potenciometrem.

 Převod binární hodnoty na hodnotu napětí upravíme výpočtem:

U=((U*5)/1023) 

"Desetibitovou" hodnotu snímanou na pinu A0, zde "U=analogRead(A0)" násobíme rozsahem měření (zde 5V) a dělíme maximální "desetibitovou" hodnotou 1023. Následně můžeme na sériovém monitoru sledovat hodnotu napětí ve voltech 0-5V. Do předchozího skeče doplníme algebraický výpočet napětí (zvýrazněno):

 

Skeč "zde":

float U;                              //deklarace proměnné

void setup()                      //část programu - nastavení

{Serial.begin(9600);}     //aktivace komunikace se sériovým monitorem

void loop()                       //část programu - smyčka  

{U=analogRead(A0);     //načtení analogového pinu A0

U=((U*5)/1023);               //převod snímané binární hodnoty na napětí ve voltech (zde rozsah 5V)

Serial.println(U);            //tisk hodnoty "U" na sériový monitor ("ln" v příkazu je posun na další řádek tisku)

delay (1000); }               // smyčka čeká 1 sekundu

 

 

Arduino je možné nastavit na specifické srovnávací napětí procesoru, tzv. referenční napětí. Ve výše uvedeném příkladu nebyl příkaz nastavení referenčního napětí použit.  Za tohoto stavu bylo referenčním napětím napájecí napětí desky 5V. Referenční napětí můžeme upravit příkazem "analogReference()", který uvedeme v části programu "void setup()" s jedním z následujících parametrů:

analogReference(DEFAULT)  -  přiřadí referenční napětí desky za stabilizátorem 

analogReference(INTERNAL)  -  u procesoru ATmega328 (např. UNO, NANO) přiřadí referenční napětí 1,1 V 

analogReference(EXTERNAL) -  respektuje externí referenční napětí přivedené na pin REF

V příkladu v kapitole "Kontrola napětí" je použit parametr INTERNAL, přiřadí procesoru interní referenční napětí 1,1 V. Výhodou parametru INTERNAL je stabilita referenčního napětí při různém napájecím napětí desky. Je to výhodné zvláště v tzv. aplikacích  "Arduina bez Arduina" (uvedeno v kapitole "Uspání a přerušení"), kdy použijeme místo desky Arduina jen samotný procesor a napájení procesoru může být v tomto případě v rozmezí 1,8 - 5,5 V (ATmega328P). Tehdy lze procesor napájet např. z baterie 3,7 V, kdy napětí napájení může postupně klesat a referenční napětí procesoru zůstává na úrovni 1,1V. 

Nastavení jiného (menšího nebo většího) rozsahu měřeného napětí upravíme odporovým děličem tak, aby při maximálním napětí na děliči byla na analogovém pinu hodnota referenčního napětí procesoru, viz kapitola "Kontrola napětí".

 

Šum při měření napětí

Nestabilitu měřeného napětí pozorujeme především v oblasti nižších napěťových hodnot. Je zapříčiněna např. napájecím zdrojem, šumem měřeného napětí, vnější indukcí aj. Šum lze částečně potlačit použitím kvalitního napájení, kvalitním externím zdrojem referenčního napětí, stíněním. Následující graf zobrazuje šum na relativně nízké binární hodnotě (14), kterou sledujeme "Sériovým plotrem". Sériový plotr otevřeme v položce "Nástroje" (plotr obsahují vyšší verze vývojového prostředí IDE Arduino, byla použita verze 1.8.19). Graf zobrazuje šum binární hodnoty 14, tj. vstupní napětí na analogovém pinu 68 mV:

 

 

 K vyhlazení měřeného napětí lze použít iterační smyčku. Smyčka opakovaně načítá hodnoty a vypočítá průměr. Nevýhodou je zdržení, které smyčka vyžaduje.

for (int i=0;i<100;i++)

{H=analogRead(A0);S+=H;}

U=S/100;S=0; 

První řádek skriptu určuje počet iteračních kroků (zde 100), druhý řádek načítá měřené napětí na pinu "A0" a sčítá do proměnné "S". Třetí řádek počítá průměr, ukládá zprůměrovanou hodnotu do proměnné "U" a vynuluje proměnnou "S". Vynulováním proměnné "S" je iterační smyčka připravena k dalšímu běhu kódu. Skript doplníme do původního skeče uvedeného výše (zvýrazněno):

 

 

Skeč "zde":

 

float H;                                                      //deklarace proměnných

float S;

float U;                            

void setup()                                               //část programu - nastavení

{Serial.begin(9600);}                                //aktivace komunikace se sériovým monitorem

void loop()                                                 //část programu - smyčka  

{for (int i=0;i<100;i++)                           //nastavení počtu iterací (100)

{H=analogRead(A0);S+=H;}               //načtení a součet hodnoty pinu "A0"

U=S/100;S=0;                                         //zprůměrování a vynulování 

Serial.println(U);                                        //tisk hodnoty "U" na sériový monitor

delay (1000); }                                           //smyčka čeká 1 sekundu

 

Průběh měřené binární hodnoty upravené 100 iteracemi je patrný z následujícího grafu (binární hodnota 14, tj. 68mV na pinu "A0").

Rozsah osy "Y" grafu je totožný s předchozím grafem :

Experimentálně bylo zjištěno, že běh části kódu "void loop", včetně iterační smyčky, bez posledního řádku "delay", trval 12,58955 ms.

 

Zaokrouhlení hodnoty napětí

Při měření napětí je účelné zobrazovat dvě desetinná místa. Implicitně zobrazuje dvě desetinná místa příkaz "print", zbytek je ignorován. Je vhodné využít zaokrouhlení třetího desetinného místa (např. 0.005-0.009 na 0.01 a  0.001-0.004 na 0.00).  K zaokrouhlení použijeme příkaz "round(proměnná)". Příkaz zaokrouhlí hodnotu za desetinnou čárkou od 0.5-0.9 nahoru a 0.1-0.4 dolu. Nejprve proměnnou vynásobíme stem, poté uplatníme zaokrouhlení a následně vydělíme proměnnou stem:

U=U*100; U=(round(U)); U=U/100;

 

 

Přesnost měření s děličem na vstupu

Arduino není ideálním prostředkem pro měření napětí. Mnohokráte bylo experimentálně ověřeno, že především nízké hodnoty napětí menší než 1V Arduino podměřuje. Pro některé praktické aplikace nemusí být táto nevýhoda překážkou. Experimentálně byl pomoci desky NANO ověřen rozsah 2 - 22 V s odporovým děličem 1 kΩ na vstupu a referenčním napětím na úrovni napájení desky (USB).

 

Vstupní měřené napětí Arduina bylo sledováno dílenským multimetrem OWON XDM1041 s přesností +/- 0,05%. Napětí sledované sériovým monitorem bylo vstupním děličem vyrovnáno na přibližně střed zvoleného měřícího rozsahu, tj. 10.00 V:

 

Ve skeči byla použita filtrace šumu iterační smyčkou s počtem iterací 2500 (čas iterací cca 300 ms) a zaokrouhlení na druhé desetinné místo :

 

Skeč "zde":

float U;                                                  //deklarace proměnných

float H;

float S;

void setup()                                          //část programu - nastavení

{Serial.begin(9600);}                          //aktivace komunikace se sériovým monitorem

void loop()                                            //část programu - smyčka                           

{for(int i=0;i<2500;i++)                       //nastavení počtu iterací 2500 (čas cca 300 ms)

{H=analogRead(A0);S+=H;}             //načtení a součet hodnoty pinu "A0"

S=((S*22)/1023);                               //převod snímané binární hodnoty na napětí ve voltech (zde rozsah 22V)

U=S/2500;S=0;                                  //zprůměrování a vynulování filtru

U=U*100;U=(round(U));U=U/100;    //zaokrouhlení na druhé desetinné místo

Serial.println(U);                                 //tisk na sériový monitor

delay(700);}                                        //dorovnání času jednoho měření na 1 sekundu

Výsledy měření:

 

Měření bylo opakováno za stejných podmínek s nastavením referenčního napětí procesoru 1,1 V, příkaz "analogReference(INTERNAL)". Výsledek byl horší (chyba čtení: 20V=+0,25%, 2V=-1,5%). Měření napětí pod 2 V se silně zhoršovalo až na chybu čtení -20% u napětí 0,2V.

V rozsahu 2-22V lze uvedenou chybu čtení v běžných "hobby" aplikacích akceptovat.  

 

Leden 2024 

 

Home

 

Arby

arduinohobby@email.cz