Obvod vysokofrekvenčního voltmetru využívající Arduino. Prvotní data a revize. Měření průměrné hodnoty signálu

S některými doplňky.

Pár slavný trik Arduino a mnoho dalších AVR čipů je schopno měřit interní zdroj referenční napětí 1,1 V. Tato funkce může být použit pro zvýšení přesnosti Funkce Arduina - analogRead při použití standardní referenční napětí 5 V (na platformách s napájecím napětím 5 V) nebo 3,3 V (na platformách s napájecím napětím 3,3 V).Ona také může být slouží k měření Vcc aplikován na čip, poskytující prostředky ovládání napětí baterie bez použití vzácné analogové kolíky.

Motivace

Existuje minimálně minimálně dva důvody pro měření napájecí napětí naše Arduino (Vcc). Jedním z nich je náš bateriový projekt, pokud chceme monitorovat úroveň napětí baterie. Také, když výkon baterie (Vcc) nemůže být 5,0 voltů (například 3článkový 1,5V napájecí zdroj) a chceme zpřesnit analogová měření - musíme použít buď interní 1,1V referenci nebo externí zdroj referenční napětí. Proč?

Při použití analogRead() je běžné předpokládat, že analogové napájecí napětí regulátoru je 5,0 voltů, zatímco ve skutečnosti tomu tak vůbec nemusí být (například napájení ze 3 prvků je 1,5 V). Oficiální dokumentace Arduina nás dokonce může vést k tomuto nesprávnému předpokladu. Faktem je, že výkon není nutně 5,0 voltů bez ohledu na aktuální úroveň, tato energie je dodávána do Vcc čipu. Pokud naše napájení není stabilizované nebo pokud jedeme na baterie, může se toto napětí dost lišit. Zde je příklad kódu, který ilustruje tento problém:

Double Vcc = 5,0; // nemusí nutně true int value = analogRead(0); / odečtěte hodnoty z A0 double volt = (hodnota / 1023,0) * Vcc; // true only if Vcc = 5,0 volts Pro přesné měření napětí je potřeba přesné referenční napětí. Většina čipů AVR poskytuje tři referenční napětí:

  • 1,1 palce od interní zdroj, v dokumentaci přechází jako bandgap reference (některé z nich jsou 2,56 V, například ATMega 2560). Výběr se provádí funkcí analogReference() s parametrem INTERNAL: analogReference(INTERNAL) ;
  • externí zdroj referenčního napětí, na arduinu označený AREF. Vyberte: analogReference(EXTERNAL);
  • Vcc je napájení samotného regulátoru. Vyberte: analogReference(DEFAULT).

V Arduinu nemůžete pouze připojit Vcc k analogovému pinu přímo - ve výchozím nastavení je AREF připojen k Vcc a vždy získáte maximální hodnota 1023, bez ohledu na to, jaké napětí používáte. Připojení k AREF zdroje napětí s dříve známým stabilním napětím pomáhá, ale je to tak extra prvek v diagramu.

Můžete také připojit Vcc k AREF přes dioda: Úbytek napětí na diodě je znám předem, takže výpočet Vcc není obtížný. Ovšem s takovým obvodem přes diodu proud teče neustále, což zkracuje výdrž baterie, což také není příliš dobré.

Externí referenční napětí je nejpřesnější, ale vyžaduje další hardware. Vnitřní ION je stabilní, ale není přesný +/- 10% odchylka. Vcc je ve většině případů naprosto nespolehlivé. Volba interní napěťové reference je levná a stabilní, ale většina zčas, rádi bychom naměřili více napětí než 1,1V, takže použití Vcc je nejpraktičtější, ale potenciálně nejméně přesné. V některých případech může být velmi nespolehlivé!

Jak na to

Mnoho čipů AVR včetně řad ATmega a ATtiny poskytuje prostředek pro měření vnitřního referenčního napětí. Proč je to nutné? Důvod je jednoduchý – měřením vnitřní napětí, můžeme určit hodnotu Vcc. Zde je postup:

  1. Nastavit výchozí referenční napětí: analogReference(DEFAULT); . Jako zdroj používáme Vcc.
  2. Proveďte hodnoty ADC pro interní zdroj 1,1 V.
  3. Vypočítejte hodnotu Vcc na základě měření 1,1 V pomocí vzorce:

Vcc * (čtení ADC) / 1023 = 1,1 V

Co následuje:

Vcc = 1,1 V * 1023 / (čtení ADC)

Dáme vše dohromady a dostaneme kód:

long readVcc() ( // Přečtení 1,1V reference proti AVcc // nastavení reference na Vcc a měření na interní 1,1V referenci #if define(__AVR_ATmega32U4__) || define(__AVR_ATmega1280__) || definition(__AVR_ATmega2560___) ADMUX =_B (REFS0) |. _BV(MUX1 definováno(__AVR_ATtiny44__) ||. definováno (__AVR_ATtiny45__) else ADMUX = _BV(MUX3) |. _BV(MUX1); #endif zpoždění(75); ); // musí nejprve přečíst ADCL - pak uzamkne ADCH uint8_t high = ADCH // odemkne oba long result = (high<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }

Používání

Kontrola Vcc nebo napětí baterie

Tuto funkci můžete volat readVcc(), pokud chcete monitorovat Vcc. Příkladem může být kontrola úrovně nabití baterie. Můžete jej také použít k určení, zda jste připojeni ke zdroji napájení nebo zda používáte napájení z baterie.

Měření Vcc pro referenční napětí

Můžete jej také použít k získání správné hodnoty Vcc pro použití s ​​analogRead(), když používáte referenční napětí (Vcc). Pokud nepoužíváte regulovaný zdroj napájení, nemůžete si být jisti, že Vcc = 5,0 voltů. Tato funkce umožňuje získat správnou hodnotu. Je tu ale jedno upozornění...

V jednom z článků jsem uvedl, že tuto funkci lze použít ke zlepšení přesnosti analogových měření v případech, kdy Vcc nebylo tak docela 5,0 voltů. Bohužel tento postup neposkytuje přesný výsledek. Proč? To závisí na přesnosti interní reference napětí. Specifikace udává jmenovité napětí 1,1 voltu, ale může se lišit až o 10 %. Taková měření mohou být méně přesná než náš napájecí zdroj Arduino!

Zvýšení přesnosti

Zatímco velké tolerance interního 1,1V napájecího zdroje výrazně omezují přesnost měření při použití v hromadné výrobě, u zakázkových projektů můžeme dosáhnout větší přesnosti. To lze snadno provést jednoduchým měřením Vcc pomocí voltmetru a naší funkce readVcc(). Dále nahraďte konstantu 1125300L novou proměnnou:

scale_constant = interní1.1Ref * 1023 * 1000

interní1.1Ref = 1,1 * Vcc1 (načítání_voltmetru) / Vcc2 (čtení_funkcí_čteníVcc)

Tato kalibrovaná hodnota bude dobrým indikátorem pro měření čipu AVR, ale může být ovlivněna změnami teploty. Nebojte se experimentovat s vlastními měřeními.

Závěr

S touto malou funkcí můžete dělat hodně. Můžete použít stabilní referenční napětí blízké 5,0 V, aniž byste ve skutečnosti měli 5,0 V na Vcc. Můžete změřit napětí baterie nebo dokonce zjistit, zda používáte baterii nebo stacionární napájení.

A konečně, kód bude podporovat všechna Arduina, včetně nového Leonarda, a také čipy řady ATtinyX4 a ATtinyX5.

Prvotní data a revize

Takže v tomto okamžiku máme voltmetr konstantního napětí s limitem 0..20V (viz předchozí díl). Nyní k tomu přidáme 0..5a ampérmetr. K tomu obvod mírně upravíme – stane se z něj obvod průchozí, to znamená, že má vstup i výstup.

Odebral jsem část týkající se displeje na LCD - nezmění se. V zásadě je hlavním novým prvkem 0,1 Ohm Rx bočník. Řetězec R1-C1-VD1 slouží k ochraně analogového vstupu. Má smysl instalovat to samé na vstup A0. Vzhledem k tomu, že předpokládáme poměrně velké proudy, existují požadavky na instalaci - elektrické vedení musí být vyrobeno pomocí poměrně silného drátu a připojeno ke svorkám bočníku přímo (jinými slovy připájeno), jinak budou údaje daleko od reality. Nechybí ani poznámka k proudu - v principu referenční napětí 1,1V umožňuje zaregistrovat jej na bočníku 0,1 Ohm proud až 11 ampér s přesností o něco horší než 0,01a, ale při poklesu takového napětí na Rx přesáhne puštěný výkon 10 W, což není vůbec sranda. K vyřešení problému můžete použít zesilovač se ziskem 11 pomocí vysoce kvalitního operačního zesilovače a 10 mOhm (0,01 Ohm) bočníku. Ale zatím si nebudeme komplikovat život a jednoduše omezíme proud na 5A (v tomto případě lze Rx výkon zvolit v řádu 3-5W).

V této fázi mě čekalo překvapení - ukázalo se, že ADC regulátoru má poměrně velký nulový offset - asi -3 mV. To znamená, že ADC jednoduše nevidí signály menší než 3 mV a signály o něco vyšší úrovně jsou viditelné s charakteristickou nepřesností -3 mV, což kazí linearitu na začátku rozsahu. Rychlé hledání neposkytlo žádné zjevné odkazy na takový problém (nulový posun je normální, ale měl by být výrazně menší), takže je docela možné, že se jedná o problém s konkrétní instancí Atmega 328. Řešení I zvoleno bylo dvojí - pokud jde o napětí - softwarový krok na začátku rozsahu (zobrazení začíná na 0,06 voltu), pro proud - pull-up rezistor na 5V sběrnici. Rezistor je označen tečkovanou čarou.

Zdrojový kód

Plná verze tohoto voltampérmetru (ve verzi I2C) je ke stažení z odkazu na konci článku. Dále ukážu změny ve zdrojovém kódu. Přidáno čtení analogového vstupu A1 se stejným průměrováním jako u voltmetru. V podstatě se jedná o stejný voltmetr, pouze bez děliče, a získáme ampéry pomocí Ohmova vzorce: I = U/Rx (například pokud pokles napětí na Rx = 0,01 V, pak je proud 0,1 A). Také jsem představil aktuální konstantu zesílení AmpMult - pro budoucnost. Konstanta AmpRx s odporem bočníku bude pravděpodobně muset být přizpůsobena, aby se vzala v úvahu nepřesnost bočníku. Protože se již jedná o voltampérmetr a na displeji 1602 stále zbývá místo, zbývá zobrazit aktuální spotřebu energie ve wattech a získat tak jednoduchou doplňkovou funkci.

.... // Analogový vstup #define PIN_VOLT A0 #define PIN_AMP A1 // Interní referenční napětí (výběr) const float VRef = 1,10; // Koeficient vstupního odporového děliče (Rh + Rl) / Rl. IN 0,2) InVolt += 3;

// Převod na volty (In: 0..1023 -> (0..VRef) v měřítku Mult) float Volt = InVolt * VoltMult * VRef / 1023;

  • float Amp = InAmp * VRef / AmpMult / AmpRx / 1023 ;

// Chcete-li vzít v úvahu pokles na bočníku, odkomentujte 2 řádky //float RxVolt = InAmp * VRef / 1023 / AmpMult;

Hlavní výhodou hotových obvodů Arduino je jedinečný blokově-modulární princip: každou desku lze přidat o další rozhraní, čímž se nekonečně rozšiřují možnosti vytváření různých projektů.

moduly Arduino jsou postaveny na univerzálním mikrokontroléru s vlastním bootloaderem, který usnadňuje jeho flashování potřebným programovým kódem, bez použití dalších zařízení. Programování se provádí ve standardním jazyce C++.

Jedním z nejjednodušších příkladů použití Arduina může být implementace na základě této sestavy vysoce přesného DC voltmetru s rozsahem měření od 0 do 30 V.

Analogové vstupy Arduino jsou navrženy pro konstantní napětí ne více než pět voltů, takže jejich použití při napětích přesahujících tuto hodnotu je možné s děličem napětí.


Schéma zapojení Areduina přes dělič napětí

Dělič napětí se skládá ze dvou rezistorů zapojených do série. Vypočítá se pomocí vzorce:

Externí USB konektor v autorádiu

Dobrý den, Habr! Dnes chci pokračovat v tématu „křížení“ arduina a androidu. V předchozí publikace Mluvil jsem o a dnes budeme mluvit o voltmetru bluetooth pro vlastní potřebu. Dalším takovým zařízením lze bez uvozovek nazvat chytrý voltmetr, „chytrý“ voltmetr nebo jen chytrý voltmetr. Příjmení je nesprávné z hlediska ruské gramatiky, nicméně se často vyskytuje v médiích. Na konci článku bude hlasování o tomto tématu, ale doporučuji začít s ukázkou fungování zařízení, abyste pochopili, o čem článek bude.


Upozornění: článek je určen pro průměrného nadšence arduina, který se obvykle nevyzná v programování pro Android, proto stejně jako v předchozím článku vytvoříme aplikaci pro smartphone pomocí vizuálního vývojového prostředí aplikace pro Android App Vynálezce 2.
K výrobě vlastního bluetooth voltmetru musíme napsat dva relativně nezávislé programy: skicu pro Arduino a aplikaci pro Android.
Za prvé, měli byste vědět, že existují tři hlavní možnosti pro měření napětí pomocí Arduina, bez ohledu na to, kde potřebujete informace vydávat: na komunikační port, na obrazovku připojenou k Arduinu nebo na smartphone.
První případ: měření napětí do 5 voltů. Zde stačí jeden nebo dva řádky kódu a napětí je přivedeno přímo na pin A0:
int hodnota = analogRead(0) // čtení hodnot z A0
napětí = (hodnota / 1023,0) * 5; // true, pouze pokud Vcc = 5,0 voltů
Druhý případ: pro měření napětí větších než 5 voltů se používá dělič napětí. Obvod je velmi jednoduchý, stejně jako kód.

Skica

int analogInput = A0;
float val = 0,0;
plovoucí napětí = 0,0;
float R1 = 100000,0; //Baterie Vin-> 100K -> A0
float R2 = 10000,0; //Battery Gnd -> Arduino Gnd a Arduino Gnd -> 10K -> A0
int hodnota = 0;

Void setup() (
Serial.begin(9600);
pinMode(analogový vstup, INPUT);
}

Void loop() (
hodnota = analogRead(analogový vstup);
val = (hodnota * 4,7) / 1024,0;
napětí = val / (R2/(R1+R2));
Serial.println(napětí);
zpoždění(500);
}


Arduino Uno
Bluetooth modul
Třetí případ. Když potřebujete získat přesnější informace o napětí, měli byste jako referenční napětí použít nikoli napájecí napětí, které se může mírně lišit například při napájení z baterie, ale napětí interního stabilizátoru Arduino 1,1 voltu obvod je zde stejný, ale kód je trochu delší. Nebudu tuto možnost podrobně rozebírat, protože je již dobře popsána v tematických článcích, ale druhá metoda je pro mě dostačující, protože moje napájení je stabilní, z USB portu notebooku.
Takže jsme vyřešili měření napětí, nyní přejdeme k druhé polovině projektu: vytvoření aplikace pro Android. Aplikaci vytvoříme přímo z prohlížeče ve vizuálním vývojovém prostředí pro Android aplikace App Inventor 2. Přejděte na web appinventor.mit.edu/explore, přihlaste se pomocí svého účtu Google, klikněte na tlačítko vytvořit, nový projekt a jednoduchým přetažením prvků vytvoříme něco takového:

Grafiku jsem zachoval velmi jednoduchou, pokud by někdo chtěl víc zajímavá grafika, dovolte mi připomenout, že k tomu musíte použít soubory .png s průhledným pozadím místo souborů .jpeg.
Nyní přejděte na kartu Bloky a vytvořte tam aplikační logiku něco takového:


Pokud vše funguje, můžete kliknout na tlačítko Build a uložit .apk do mého počítače a poté stáhnout a nainstalovat aplikaci do smartphonu, i když existují i ​​​​jiné způsoby, jak aplikaci nahrát. tady je to pro každého pohodlnější. V důsledku toho jsem skončil s touto aplikací:


Chápu, že vizuální vývojové prostředí App Inventor 2 pro aplikace pro Android ve svých projektech používá jen málokdo, takže o práci v něm může vyvstat mnoho otázek. Abych odstranil některé z těchto otázek, udělal jsem to podrobné video, o tom, jak vytvořit takovou aplikaci „od nuly“ (abyste ji mohli zobrazit, musíte jít na YouTube):

P.S. Sbírka více než 100 vzdělávacích materiálů o Arduinu pro začátečníky i profesionály

Dobrý den, Habr! Dnes chci pokračovat v tématu „křížení“ arduina a androidu. V předchozí publikaci jsem mluvil o bluetooth stroji a dnes budeme mluvit o DIY bluetooth voltmetru. Dalším takovým zařízením lze bez uvozovek nazvat chytrý voltmetr, „chytrý“ voltmetr nebo jen chytrý voltmetr. Příjmení je nesprávné z hlediska ruské gramatiky, nicméně se často vyskytuje v médiích. Na konci článku bude hlasování o tomto tématu, ale doporučuji začít s ukázkou fungování zařízení, abyste pochopili, o čem článek bude.


Upozornění: článek je určen pro běžného arduino nadšence, který se obvykle nevyzná v programování pro Android, proto stejně jako v předchozím článku vytvoříme aplikaci pro chytrý telefon s využitím vizuálního vývojového prostředí pro Android aplikace App Inventor 2.
K výrobě vlastního bluetooth voltmetru musíme napsat dva relativně nezávislé programy: skicu pro Arduino a aplikaci pro Android.
Za prvé, měli byste vědět, že existují tři hlavní možnosti pro měření napětí pomocí Arduina, bez ohledu na to, kde potřebujete informace vydávat: na komunikační port, na obrazovku připojenou k Arduinu nebo na smartphone.
První případ: měření napětí do 5 voltů. Zde stačí jeden nebo dva řádky kódu a napětí je přivedeno přímo na pin A0:
int hodnota = analogRead(0) // čtení hodnot z A0
napětí = (hodnota / 1023,0) * 5; // true, pouze pokud Vcc = 5,0 voltů
Druhý případ: pro měření napětí větších než 5 voltů se používá dělič napětí. Obvod je velmi jednoduchý, stejně jako kód.

Skica

int analogInput = A0;
float val = 0,0;
plovoucí napětí = 0,0;
float R1 = 100000,0; //Baterie Vin-> 100K -> A0
float R2 = 10000,0; //Battery Gnd -> Arduino Gnd a Arduino Gnd -> 10K -> A0
int hodnota = 0;

Void setup() (
Serial.begin(9600);
pinMode(analogový vstup, INPUT);
}

Void loop() (
hodnota = analogRead(analogový vstup);
val = (hodnota * 4,7) / 1024,0;
napětí = val / (R2/(R1+R2));
Serial.println(napětí);
zpoždění(500);
}


Arduino Uno
Bluetooth modul
Třetí případ. Když potřebujete získat přesnější informace o napětí, měli byste jako referenční napětí použít nikoli napájecí napětí, které se může mírně lišit například při napájení z baterie, ale napětí interního stabilizátoru Arduino 1,1 voltu obvod je zde stejný, ale kód je trochu delší. Nebudu tuto možnost podrobně rozebírat, protože je již dobře popsána v tematických článcích, ale druhá metoda je pro mě dostačující, protože moje napájení je stabilní, z USB portu notebooku.
Takže jsme vyřešili měření napětí, nyní přejdeme k druhé polovině projektu: vytvoření aplikace pro Android. Aplikaci vytvoříme přímo z prohlížeče ve vizuálním vývojovém prostředí pro Android aplikace App Inventor 2. Přejděte na web appinventor.mit.edu/explore, přihlaste se pomocí svého účtu Google, klikněte na tlačítko vytvořit, nový projekt a do pouhým přetažením prvků vytvoříme něco jako tento design:

Grafiku jsem udělal velmi jednoduchou, pokud chce někdo zajímavější grafiku, připomenu, že k tomu je potřeba místo .jpeg souborů použít .png soubory s průhledným pozadím.
Nyní přejděte na kartu Bloky a vytvořte tam aplikační logiku něco takového:


Pokud vše funguje, můžete kliknout na tlačítko Build a uložit .apk do mého počítače a poté stáhnout a nainstalovat aplikaci do smartphonu, i když existují i ​​​​jiné způsoby, jak aplikaci nahrát. tady je to pro každého pohodlnější. V důsledku toho jsem skončil s touto aplikací:


Chápu, že vizuální vývojové prostředí App Inventor 2 pro aplikace pro Android ve svých projektech používá jen málokdo, takže o práci v něm může vyvstat mnoho otázek. Abych odpověděl na některé z těchto otázek, natočil jsem podrobné video o tom, jak vytvořit takovou aplikaci „od nuly“ (abyste ji mohli zobrazit, musíte jít na YouTube):

P.S. Sbírka více než 100 vzdělávacích materiálů o Arduinu pro začátečníky i profesionály


Nahoru