Pytania:
- Czy przeliczenie liczby ADC na napięcie zależy od rzeczywistego napięcia styku +5 V?
- 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.
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ą.
Odpowiedzi:
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 :
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:
Uwaga: pierwsze czytanie po uruchomieniu może być fałszywe.
źródło
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
:Źródło: analogReference
Oto schemat ADC dla tego, co jest w ATmega328, abyś mógł zobaczyć, co się tam dzieje:
Ź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
analogReference
odpowiednio 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!):
źródło
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:
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.
źródło
tak i nie: moduł adc dba o Vref, który może być dostarczany przez Vdd, wewnętrznie lub zewnętrznie.
konfigurując moduł adc. karta danych urządzenia powinna zawierać rejestry / bity, które należy w tym celu skonfigurować.
źródło