Czy konwersja ADC na napięcie zależy od rzeczywistej wartości styku +5 V?


13

Pytania:

  1. Czy przeliczenie liczby ADC na napięcie zależy od rzeczywistego napięcia styku +5 V?
  2. Jeśli tak, jaka jest akceptowana metoda uzyskania tego napięcia z płyty?

Tło / szczegół:

Mam obwód, w którym mam Arduino Nano (klon) działający ze złącza USB (z koncentratora). Zadaniem Arduino jest pomiar napięcia na akumulatorze, który napędza drugi obwód włączany / wyłączany przez Nano. Dla porównania jest to tester baterii.

Obwód testowy

Istnieje ekran Nokia 5110, który wyświetla napięcie z bardzo prostego szkicu poniżej.

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);
}
  • Zmierzyłem napięcie akumulatora za pomocą DVM i wynosi ono 4,13 V, ale Nano podaje 4,35 V.
  • Mam wspólną płaszczyznę między baterią a Arduino.
  • Ponieważ połączenie do testowania napięcia może się unosić, mam rozwijany rezystor, aby zatrzymać dzikie wahania (> 10 kΩ)

Po pewnym dochodzeniu odkryłem, że +5 V faktycznie wysyła 4,75 V i zmieniłem szkic

float v = (rawVIN*5.0)/1024.0;

do

float v = (rawVIN*4.75)/1024.0;

a odczyt napięcia na Arduino był teraz poprawny. Zrobiłem to nie dlatego, że rozumiem, co zrobiłem, zrobiłem to, ponieważ miałem przeczucie, że może to zmienić wartość na poprawną.


3
Jako strona nie powinieneś dzielić przez 1024, a nie 1023. Jest to błąd, który powtarza się od nowa, prawdopodobnie wynikający z błędu występującego w przykładach Arduino. Źródło? Arkusz danych dla AVR.
Tom Carpenter

@TomCarpenter Wydaje mi się, że jest to wynik mojego grzebania się w obliczeniach i czytania czegoś po dość długim uderzaniu głową o biurko - zacząłem od 1024, ale jak widać skończyło się na 1023 - poprawię moje pytanie .
Caribou

Odpowiedzi:


16

ADC wewnątrz Arduino nie mierzy napięcia, a raczej stosunek napięcia . Mianowicie stosunek napięcia na wejściu analogowym do napięcia na pinie Vref.

W konfiguracji domyślnej pin Vref jest wewnętrznie powiązany z linią +5 V. Zamiast tego możesz wybrać wewnętrzne odniesienie jako Vref :

analogReference(INTERNAL);

To odniesienie wynosi około 1,1 V i jest dość odporne na wahania na +5 V. Problem polega na tym, że nie można zmierzyć napięć wyższych niż odniesienie.

W przypadku testera akumulatorów, jeśli potrzebujesz jakiegoś „absolutnego” pomiaru, możesz użyć wewnętrznego odniesienia i dzielnika napięcia, aby upewnić się, że zmierzone napięcie jest niższe niż 1,1 V.

Edycja : Inną opcją, która nie wymaga dzielnika napięcia, jest użycie Vcc jako odniesienia do pomiaru zarówno wejścia analogowego, jak i wewnętrznego odniesienia „pasma wzbronionego” 1,1 V. Pomiar 1,1 V względem Vcc jest pośrednim sposobem pomiaru Vcc. Nie jest to obsługiwane przez podstawową bibliotekę Arduino, ale można to zrobić, programując bezpośrednio rejestry kontrolne ADC:

// 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;
}

Uwaga: pierwsze czytanie po uruchomieniu może być fałszywe.


Dziękuję za szybką odpowiedź :) To ma teraz sens i wyjaśnia, dlaczego dzięki mojemu dostosowaniu kodu (krówki) dostaję właściwą odpowiedź. To w połączeniu z odpowiedzią enrics daje mi wszystko, czego potrzebuję, aby kontynuować.
Caribou

9

Zasilany przez USB Arduino Nano będzie miał napięcie odniesienia ADC, na którym nie można polegać, ze względu na tolerancję +/- 5% na przychodzące napięcie USB. Ponadto Nano ma diodę Schottky'ego (D1) MBR0520, która spadnie między 0,1 a 0,5 V w zależności od własnych tolerancji produkcyjnych, temperatury i aktualnego poboru prądu z płyty.

Co możesz z tym zrobić?

MCU na pokładzie Arduino Nano to ATmega328P. ADC Nano może skalować swoje analogowe odczyty napięcia zgodnie z kilkoma dostępnymi odniesieniami (i możesz wybrać ten, który najbardziej Ci odpowiada). Możesz to zrobić za pomocą analogReference (type)funkcji i wybrać spośród następujących odniesień type:

  • DOMYŚLNE: domyślne odniesienie analogowe 5 woltów (na płytkach Arduino 5 V) lub 3,3 wolta (na płytkach Arduino 3,3 V)
  • WEWNĘTRZNE: Wbudowane odniesienie, równe 1,1 V w ATmega168 lub ATmega328 i 2,56 V w ATmega8 (niedostępne w Arduino Mega) [...]
  • ZEWNĘTRZNE: napięcie przyłożone do pinu AREF (tylko od 0 do 5 V) służy jako odniesienie.

Źródło: analogReference

Oto schemat ADC dla tego, co jest w ATmega328, abyś mógł zobaczyć, co się tam dzieje:

Blok ADmega328P ADC

Źródło: arkusz danych ATmega328

Tak więc prostym rozwiązaniem jest zbudowanie dzielnika słabych napięć, aby uzyskać napięcie, które chcesz zmierzyć poniżej wartości referencyjnej WEWNĘTRZNEJ 1,1 V, a następnie analogReferenceodpowiednio je skonfigurować .

Dzielnik napięcia musi być słaby (wysokie wartości R), abyś nie wyciągał zbyt dużego prądu z akumulatora, ale nie był zbyt słaby, aby obciążał go impedancja wejściowa ADC.

Premia

Jeśli jednak potrzebujesz napięcia odniesienia wyższego niż wewnętrzne odniesienie pasma 1,1 V w ATmega328, nadal nie masz szczęścia. Opcją byłoby użycie wyjścia regulatora LDO 3,3 V z wbudowanego FT232RL, który jest dostępny na styku 14 nagłówka, ale nie sądzę, aby był również niezawodny. Karta danych FT232RL określa ją na 3,0 - 3,6 V (nominalnie 3,3 V)

Tak więc uniwersalnym rozwiązaniem byłoby zbudowanie zewnętrznego napięcia odniesienia w oparciu o tani TL431 . To może dać wiarygodne odniesienie do 4,0 - 4,25 V z dokładnością +/- 1%.

Zewnętrzny obwód napięcia odniesienia byłby czymś tak prostym (a TL431 jest dostępny w pakiecie TO-92 przyjaznym dla makiet!):

Regulator napięcia bocznikowego oparty na TL431


Dzięki za tę kompleksową odpowiedź i wszystkie alternatywy, które mogłem podjąć - prawdopodobnie pójdę prosto i wykonam dzielnik napięcia, aby wyskalować mój wkład między 0 a 1.1. Wskazówka na temat wartości rezystorów była dla mnie cenna - dzięki
Caribou

3

Mam stronę o konwerterze ADC na Atmega328P . Nieco dalej na stronie opisuję odniesienia napięcia. Możesz użyć układu TL431, aby zapewnić różne napięcia odniesienia, na przykład 4V:

Napięcie odniesienia 4 V.

Zmieniając rezystory można uzyskać inne napięcia (wygląda na to, że chcesz około 4,2 V).

Na napięcie wyjściowe nie ma wpływu napięcie wejściowe (w tym przypadku 5 V).

Połączona strona opisuje, w jaki sposób możesz wybrać wartości rezystorów.


2

Czy konwersja liczby adc na napięcie zależy od rzeczywistego napięcia styku + 5 V?

tak i nie: moduł adc dba o Vref, który może być dostarczany przez Vdd, wewnętrznie lub zewnętrznie.

Jeśli tak, jaka jest akceptowana metoda uzyskania tego napięcia z płyty?

konfigurując moduł adc. karta danych urządzenia powinna zawierać rejestry / bity, które należy w tym celu skonfigurować.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.