Arduino. Секретний вольтметр. Правильне вимірювання напруги

Ще одна цеглинка в скарбничку знань про мікроконтролери в загальному і про Arduino зокрема.

Зазвичай при побудові різних вольтметрів на базі Arduino припускають, що напруга живлення Vcc чітко дорівнює 5В. Але це далеко не так, точніше – зовсім не так. Як результат – чимала похибка у вимірах.

Маловідомою особливістю Arduino і багатьох інших AVR є можливість вимірювання внутрішньої опорної напруги 1.1В.

Ця можливість може бути використана для підвищення точності функції Arduino analogRead () або для вимірювання напруги живлення (Vcc), що забезпечує засіб моніторингу напруги живлення (наприклад, батареї) без задіяння дорогоцінного аналогового входу.

У мережі гуляють, крім описуваного тут, ще два способи «особливо точного» вимірювання опорної напруги. Один заснований на зміні стандартної бібліотеки wiring_analog.c і потім читання analogRead (14). Інші «знавці» вважають, що вказівка ​​analogReference (INTERNAL) або DEFAULT є більш ніж достатньою. Розбрід і хитання в стані «фахівців» не бажаючих копнути трохи глибше, ніж перша сторінка видачі пошуку гугла.

Мої натурні випробування з’ясували, що можливо вищевказані способи і спрацювали у їх авторів на їх же китайських репліках Arduino, але особисто на моїй обидва способи видали повну нісенітницю. Тобто вони не вірні в принципі.

А тепер правильна відповідь нижче.

Як правильно?

Багато AVR чіпів, включаючи серію ATmega і багато з ряду Attiny забезпечують засоби для вимірювання внутрішньої опорної напруги. Навіщо це комусь треба? Причина проста – шляхом вимірювання опорної напруги ми можемо визначити точне значення Vcc.
Ось як це робиться:

Спочатку встановлюємо опорну (reference) напругу в значення Vcc
Вимірюємо внутрішню опорну напругу
Розраховуємо величину Vcc
Наша виміряна напруга

Vcc * (АЦП-вимір) / 1023

яка, як ми знаємо дорівнює 1.1В. Згідно даташіту на ATMEGA 328 вона може дорівнювати:

мінімально 1.0В,
зазвичай 1.1В,
максимально 1.2В.
Забігаючи вперед скажу, що ця константа вимагає ручного калібрування, у мене вона вийшла рівною 1.179В.

АЦП у Arduino має розрядність 10 біт, це означає, що вхідна напруга від 0В до 5В перетворюється в цілочисельне значення від 0 до 1023. Ось звідки тут число 1023.

Далі розраховуємо Vcc і отримуємо:

Vcc = 1.1 * 1023 / АЦП-вимір

Іншими словами, вся фішка в тому, щоб з’ясувати реальну напругу живлення Vcc, читаючи internal 1.1V reference і використовуючи Vcc як еталон. Потім за допомогою простої математики вираховуємо реальне Vcc.

Шматок коду функції виглядає так:

ADCSRA | = _BV (ADSC); // початок перетворень
while (bit_is_set (ADCSRA, ADSC)); // вимір
uint8_t low = ADCL; // спочатку потрібно прочитати ADCL - це замикає ADCH
uint8_t high = ADCH; // разлочить обидва
float result = (high << 8) | low;
result = (1.1 * 1023.0 * 1000) / result; // Результат Vcc в мілівольтах

Примітка. Функцію analogReference () для зміни опорної напруги застосовувати не потрібно.

 

Взято з http://tim4dev.com/arduino-secret-true-voltmeter/

Поділитися цим:
Loading Likes...

Залишити відповідь

Увійти за допомогою: