Таен волтметър в Arduino

По принцип превод на статията Secret Arduino Voltmeter - Измерете напрежението на батерията с някои допълнения.

Малко известна характеристика на Arduino и много други AVR чипове е възможността за измерване на вътрешното референтно напрежение от 1,1 V. Тази функция може да се използва за подобряване на точността на функцията Arduino analogRead(), когато се използва стандартното 5 V (на 5 V платформи) или 3,3 V (на 3,3 V платформи). Може също така да се използва за измерване на Vcc, приложено към чипа, осигурявайки средство за наблюдение на напрежението на батерията без използване на ценни аналогови щифтове.

Има поне две причини да измерваме напрежението, захранващо нашия Arduino (Vcc). Един от тях е нашият проект, захранван с батерии, ако искаме да наблюдаваме нивото на напрежение на батерията. Освен това, когато захранването на батерията (Vcc) не може да бъде 5,0 волта (напр. 1,5 V 3-клетъчно захранване) и искаме да направим аналоговите измервания по-точни, трябва да използваме или вътрешно референтно 1,1 V, или външно еталонно напрежение. Защо?

Обикновено се приема, че когато се използва analogRead(), аналоговото захранващо напрежение на контролера е 5,0 волта, когато в действителност това може изобщо да не е така (например 1,5 V 3-клетъчно захранване). Официалната документация на Arduino може дори да ни доведе до това погрешно предположение. Факт е, че захранването не е непременно 5,0 волта, независимо от текущото ниво, това захранване се подава към Vcc на чипа. Ако захранването ни не е стабилизирано или ако работим на батерия, това напрежение може да варирамного малко. Ето примерен код, илюстриращ този проблем:

  • 1.1 V от вътрешен източник, в документацията минава като bandgap reference (някои от тях са 2.56 V, например ATMega 2560). Изборът се прави от функцията analogReference() с параметър INTERNAL: analogReference(INTERNAL) ;
  • външен източник на референтно напрежение, AREF е подписан на arduino. Избор: analogReference(EXTERNAL);
  • Vcc е захранването на самия контролер. Избор: analogReference(DEFAULT).

В Arduino не можете просто да продължите и да свържете директно Vcc към аналогов щифт - по подразбиране AREF е свързан с Vcc и винаги ще получавате максимална стойност от 1023, независимо какво напрежение използвате. Запазва връзката към AREF на източник на напрежение с известно, стабилно напрежение, но това е допълнителен елемент във веригата.

Можете също да свържете Vcc към AREF чрездиод: спадът на напрежението върху диода е известен предварително, така че изчисляването на Vcc не е трудно. Но при такава схема през диодапостоянно тече ток, намаляващ живота на батерията, което също не е много успешно.

Външното референтно напрежение е най-точно, но изисква допълнителен хардуер. Вътрешен ION стабилен, но не точен +/- 10% отклонение. Vcc е напълно ненадежден в повечето случаи. Изборът на вътрешно референтно напрежение е евтин и стабилен, но през повечето време бихме искали да измерваме повече от 1,1 V, така че използването на Vcc е най-практичното, но потенциално най-малко точното. В някои случаи може да бъде много ненадеждно!

Как да го направим

Много AVR чипове, включително серията ATmega и ATtiny, осигуряват средство за измерване на вътрешната референцияволтаж. Защо е необходимо това? Причината е проста - чрез измерване на вътрешното напрежение можем да определим стойността на Vcc. Ето как:

  1. Задайте референтно напрежение по подразбиране: analogReference(DEFAULT); . Ние използваме Vcc като източник.
  2. Прочетете показанията на ADC за вътрешното захранване от 1,1 V.
  3. Изчислете стойността на Vcc въз основа на измерването на 1,1 V, като използвате формулата:

Vcc * (отчитане на ADC) / 1023 = 1,1 V

От какво следва:

Vcc = 1.1V * 1023 / (ADC четене)

Сглобяване на всичко и получаване на кода:

Използване

Проверка на Vcc или напрежението на батерията

Можете да извикате тази функция readVcc(), ако искате да наблюдавате Vcc. Пример за това е да проверите нивото на батерията. Можете също да го използвате, за да определите дали сте свързани към източник на захранване или работите на захранване от батерия.

Измерване на Vcc за референтно напрежение

Можете също да го използвате, за да получите правилната стойност на Vcc, която да използвате с analogRead(), когато използвате референтното напрежение (Vcc). Освен ако не използвате регулирано захранване, не можете да сте сигурни, че Vcc = 5,0 волта. Тази функция ви позволява да получите правилната стойност. Въпреки че има едно предупреждение....

В една от статиите направих твърдението, че тази функция може да се използва за подобряване на точността на аналоговите измервания в случаите, когато Vcc не е точно 5,0 волта. За съжаление тази процедура няма да даде точен резултат. Защо? Това зависи от точността на вътрешното еталонно напрежение. Спецификацията дава номинално напрежение от 1,1 волта, но пише, че може да варира с до 10%. Такива измервания може да са по-малко точни от нашето захранване Arduino!

Ние повишаваметочност

Докато големите толеранси на вътрешното захранване от 1,1 V силно ограничават точността на измерване, когато се използва в масово производство, можем да постигнем по-голяма точност за индивидуални проекти. Това се прави лесно чрез просто измерване на Vcc с волтметър и нашата функция readVcc(). След това заместваме константата 1125300L с нова променлива:

scale_constant = internal1.1Ref * 1023 * 1000

internal1.1Ref = 1.1 * Vcc1 (волтметър_отчитане) / Vcc2 (четенеVcc()_функция_отчитане)

Тази калибрирана стойност ще бъде добра индикация за измервания на AVR чип, но може да бъде повлияна от температурни промени. Чувствайте се свободни да експериментирате със собствените си измервания.

С тази малка функция може да се направи много. Можете да използвате стабилна справка, близка до 5.0V, без всъщност да имате 5.0V при Vcc. Можете да измерите напрежението на вашата батерия или дори да видите дали сте на батерия или стационарно захранване.

И накрая, кодът ще поддържа всички Arduinos, включително новия Leonardo, както и чиповете от серията ATtinyX4 и ATtinyX5.