Чи покладається перетворення АЦП на напругу на фактичне значення +5 В штир?


13

Запитання:

  1. Чи залежить перетворення підрахунку АЦП у напругу від фактичної напруги контакту +5 В?
  2. Якщо так, то який прийнятий метод отримання цієї напруги з плати?

Довідка / деталі:

У мене є схема, в якій у мене є Arduino Nano (клон), що працює від USB-роз'єму (від концентратора). Завдання Arduino полягає в вимірюванні напруги на акумуляторі, який буде вести другий ланцюг, включений / вимкнений Nano. Для довідки це тестер акумуляторів.

Випробувальна схема

Є екран Nokia 5110, який відображає напругу з дуже простого ескізу нижче.

void setup() {
  Serial.begin(9600);
  display.begin();
  // Init done

  // You can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  // Text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
}


void loop() {
  display.clearDisplay();   // Clears the screen and buffer
  display.setCursor(0,0);
  display.print("Vin=");
  int rawVIN = analogRead(VIN);
  float floatVin = (rawVIN*4.75)/1023.0;
  display.println(floatVin);
  Serial.println(rawVIN);
  display.display();
  delay(1000);
}
  • Я вимірював напругу акумулятора за допомогою DVM, і це 4,13 В, але Nano повідомляє 4,35 В.
  • У мене спільний контакт між акумулятором і Arduino.
  • Оскільки з'єднання для перевірки напруги може плавати, у мене є резистор, що припиняється, щоб зупинити дикі коливання (> 10 кОм)

Після деякого розслідування я виявив, що +5 В насправді виводить 4,75 В і змінив свій ескіз

float v = (rawVIN*5.0)/1024.0;

до

float v = (rawVIN*4.75)/1024.0;

і показник напруги на Arduino тепер був правильним. Я зробив це не тому, що я розумію, що я зробив, я це зробив, бо мав уявлення, що це може змінити значення на правильне.


3
Як сторону не слід ділити на 1024, а не на 1023. Це помилка, яка повторюється знову, імовірно, випливає з помилки, наведеної в прикладах Ардуїно. Джерело? Лист даних для AVR.
Том Карпентер

@TomCarpenter Я думаю, що це результат мого роздуму з розрахунком і читання чогось після досить довгого удару головою об стіл - я почав з 1024, але, як ви бачите, закінчився з 1023 - я виправлю своє питання .
Карібу

Відповіді:


16

АЦП всередині Arduino не вимірює напругу, а швидше співвідношення напруги . А саме відношення від напруги на аналоговому вході до напруги на штирі Vref.

У конфігурації за замовчуванням шпилька Vref внутрішньо прив’язана до лінії +5 V. Ви можете вибрати замість внутрішньої посилання Vref :

analogReference(INTERNAL);

Цей посилання становить близько 1,1 В, і він досить несприйнятливий до коливань +5 В. Проблема полягає в тому, що ви не можете виміряти напруги, що перевищують опорні.

Для вашого тестера акумуляторних батарей, якщо ви хочете отримати якесь "абсолютне" вимірювання, ви можете скористатися внутрішньою посиланням та дільником напруги, щоб забезпечити вимірювання напруги нижче 1,1 В.

Редагувати : Ще одним варіантом, який не потребує дільника напруги, є використання Vcc в якості еталона для вимірювання як аналогового входу, так і внутрішнього 1,1 В «пропускної здатності». Вимірювання 1,1 В проти Vcc - це непрямий спосіб вимірювання Vcc. Це не підтримується основною бібліотекою Arduino, але ви можете це зробити, програмуючи безпосередньо регістри управління АЦП:

// Return the supply voltage in volts.
float read_vcc()
{
    const float V_BAND_GAP = 1.1;     // typical
    ADMUX  = _BV(REFS0)    // ref = Vcc
           | 14;           // channel 14 is the bandgap reference
    ADCSRA |= _BV(ADSC);   // start conversion
    loop_until_bit_is_clear(ADCSRA, ADSC);  // wait until complete
    return V_BAND_GAP * 1024 / ADC;
}

Будьте уважні, що саме перше читання після завантаження може бути хибним.


Дякую за швидку відповідь :) це має ідеальний сенс зараз і пояснює, чому за допомогою мого коригування коду (fudge) я отримую правильну відповідь. Ця комбінація з відповіддю на енрікі дає мені все необхідне для продовження.
Карібу

9

USB-накопичувач Arduino Nano матиме опорний показник напруги АЦП, на який не можна покластися, через толерантність +/- 5% від вхідної напруги USB. Крім того, у Nano є діод Шотткі MBR0520 (D1), який знизиться від 0,1 до 0,5 В залежно від його власних допусків виготовлення, його температури та поточного малюнку вашої плати.

Що ви можете з цим зробити?

Бортовий MCU Arduino Nano - це ATmega328P. АЦП Nano може масштабувати свої аналогові показання напруги відповідно до кількох доступних посилань (і ви можете вибрати те, що підходить вам краще). Ви можете зробити це за допомогою analogReference (type)функції та обрати одну з таких посилань type:

  • DEFAULT: аналогове посилання за замовчуванням 5 вольт (на платах Arduino 5 В) або 3,3 вольт (на платах Arduino 3,3 В)
  • ВНУТРІШНЯ: Вбудована система відліку, рівна 1,1 вольт на ATmega168 або ATmega328 і 2,56 вольт на ATmega8 (недоступна для Мега Arduino) [...]
  • ВНУТРІШНІ: напруга, прикладена до штифта AREF (тільки від 0 до 5 В), використовується як опорне.

Джерело: analogReference

Це схема АЦП для того, що знаходиться всередині ATmega328, щоб ви могли побачити, що там відбувається:

Блок АЦП ATmega328P

Джерело: таблиця даних ATmega328

Отже, пряме рішення - побудувати слабкий дільник напруги, щоб отримати напругу, яку потрібно виміряти, нижче внутрішньої опори 1,1 В, а потім налаштувати analogReferenceвідповідно.

Розділювач напруги повинен бути слабким (високі значення R), щоб не виводити занадто багато струму з акумулятора, але не занадто слабкий, щоб бути завантаженим вхідним опором АЦП.

Бонус

Однак якщо вам потрібна посилання на напругу вище, ніж внутрішня посилання на проміжок 1.1 V ATmega328, ви все ще не пощастили. Варіантом буде використання 3,3 В регулятора LDO з бортового FT232RL, який доступний для вас на штифті 14 заголовка, але я також не думаю, що це надійно. У FT232RL листки це вказує на 3.0 - 3.6 V (номінальне 3,3 В)

Таким універсальним рішенням було б побудувати зовнішню опорну напругу на основі дешевого TL431 . Це може дати вам надійну орієнтир до 4,0 - 4,25 В з точністю +/- 1%.

Зовнішня схема відліку напруги була б такою простою, як це, (а TL431 доступний у пакеті TO-92, зручному для дошки!):

Регулятор напруги на базі TL431


Дякую за цю вичерпну відповідь і всі альтернативи, які я міг би взяти - я, мабуть, просто і зроблю дільник напруги, щоб масштабувати свій вхід між 0 і 1,1. Підказка про значення резистора була для мене цінною - спасибі
Карібу

3

У мене є сторінка про перетворювач АЦП на Atmega328P . Дещо вниз на сторінці я описую посилання на напругу. Ви можете використовувати мікросхему TL431 для забезпечення різного опорного напруги, наприклад 4В:

4V напруга

Змінюючи резистори, ви можете отримати інші напруги (схоже, що потрібно близько 4,2 В).

На вихідну напругу не впливає вхідна напруга (в цьому випадку 5В).

На пов'язаній сторінці описано, як ви можете вибрати значення резистора.


2

Чи залежить перетворення лічильника напруги у напругу від фактичної напруги контакту + 5 В?

так і ні: модуль adc піклується про Vref, який може поставлятися через Vdd, всередині або зовні.

Якщо так, то який прийнятий метод отримання цієї напруги з плати?

конфігуруючи модуль adc. таблиця даних пристрою повинна мати регістри / біти, які потрібно встановити для цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.