Apakah konversi ADC ke tegangan bergantung pada nilai aktual pin +5 V?

13

Pertanyaan:

  1. Apakah konversi jumlah ADC ke tegangan tergantung pada tegangan sebenarnya dari +5 V pin?
  2. Jika ya, apa metode yang diterima untuk mendapatkan tegangan dari papan?

Latar belakang / detail:

Saya memiliki sirkuit di mana saya memiliki Arduino Nano (klon) berjalan dari konektor USB (dari hub). Tugas Arduino adalah mengukur tegangan pada baterai yang akan mendorong sirkuit kedua dinyalakan / dimatikan oleh Nano. Untuk referensi itu adalah tester baterai.

Sirkuit uji

Ada layar Nokia 5110 yang menampilkan tegangan dari sketsa yang sangat sederhana di bawah ini.

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);
}
  • Saya mengukur tegangan baterai menggunakan DVM dan 4,13 V, namun Nano melaporkan 4,35 V.
  • Saya memiliki kesamaan antara baterai dan Arduino.
  • Karena koneksi untuk menguji tegangan dapat mengambang, saya memiliki resistor pulldown untuk menghentikan fluktuasi liar (> 10 kΩ)

Setelah beberapa penyelidikan saya menemukan bahwa +5 V sebenarnya menghasilkan 4,75 V dan mengubah sketsa saya dari

float v = (rawVIN*5.0)/1024.0;

untuk

float v = (rawVIN*4.75)/1024.0;

dan pembacaan tegangan pada Arduino sekarang benar. Saya melakukan ini bukan karena saya mengerti apa yang saya lakukan, saya melakukannya karena saya punya firasat itu dapat mengubah nilai menjadi yang benar.

Karibu
sumber
3
Sebagai sisi Anda tidak harus membagi dengan 1024, bukan 1023. Ini adalah kesalahan yang berulang lagi, mungkin berasal dari kesalahan dalam contoh Arduino. Sumber? Lembar data untuk AVR.
Tom Carpenter
@ TomCarpenter Saya pikir ini adalah hasil dari meraba-raba dengan perhitungan dan membaca sesuatu setelah waktu yang cukup lama membenturkan kepala ke meja - saya mulai dengan 1024 tetapi seperti yang Anda lihat berakhir dengan 1023 - Saya akan memperbaiki pertanyaan saya .
Caribou

Jawaban:

16

ADC di dalam Arduino tidak mengukur voltase, melainkan rasio voltase . Yaitu rasio dari tegangan pada input analog ke tegangan pada pin Vref.

Dalam konfigurasi default, pin Vref diikat secara internal ke garis +5 V. Anda dapat memilih untuk menggunakan referensi internal sebagai Vref :

analogReference(INTERNAL);

Referensi ini sekitar 1,1 V, dan cukup kebal terhadap fluktuasi pada +5 V. Masalahnya adalah Anda tidak dapat mengukur tegangan lebih tinggi dari referensi.

Untuk penguji baterai Anda, jika Anda menginginkan pengukuran "absolut", Anda dapat menggunakan referensi internal dan pembagi tegangan untuk memastikan tegangan yang diukur di bawah 1,1 V.

Mengedit : Pilihan lain yang tidak memerlukan pembagi tegangan adalah dengan menggunakan Vcc sebagai referensi untuk mengukur baik input analog dan 1.1 V “bandgap” referensi internal. Mengukur 1,1 V terhadap Vcc adalah cara tidak langsung untuk mengukur Vcc. Ini tidak didukung oleh pustaka inti Arduino, tetapi Anda bisa melakukannya dengan memprogram langsung register kontrol 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;
}

Berhati-hatilah karena pembacaan pertama setelah boot mungkin palsu.

Edgar Bonet
sumber
Terima kasih atas balasan secepatnya :) ini masuk akal sekarang dan menjelaskan mengapa dengan penyesuaian kode saya (fudge) saya mendapatkan jawaban yang benar. Ini dikombinasikan dengan jawaban enrics memberi saya semua yang saya butuhkan untuk melanjutkan.
Caribou
9

Arduino Nano yang didukung USB akan memiliki referensi tegangan ADC yang tidak dapat diandalkan, karena toleransi +/- 5% dari tegangan USB yang masuk. Selain itu, Nano memiliki MBR0520 Schottky diode (D1) yang akan turun antara 0,1 dan 0,5 V tergantung pada toleransi pabrikannya sendiri, suhu, dan daya tarik papan Anda saat ini.

Apa yang bisa kamu lakukan?

MCU yang terpasang di Arduino Nano adalah ATmega328P. ADC Nano dapat mengukur pembacaan tegangan analognya sesuai dengan beberapa referensi yang tersedia (dan Anda dapat memilih yang cocok untuk Anda). Anda dapat melakukan ini melalui analogReference (type)fungsi, dan memilih di antara referensi berikut types:

  • DEFAULT: referensi analog default 5 volt (pada 5 papan Arduino V) atau 3,3 volt (pada papan Arduino 3,3 V)
  • INTERNAL: Referensi bawaan, sama dengan 1,1 volt pada ATmega168 atau ATmega328 dan 2,56 volt pada ATmega8 (tidak tersedia di Arduino Mega) [...]
  • EKSTERNAL: tegangan diterapkan pada pin AREF (hanya 0 hingga 5 V) digunakan sebagai referensi.

Sumber: analogReference

Ini adalah skema ADC untuk apa yang ada di dalam ATmega328 sehingga Anda dapat melihat apa yang terjadi di sana:

ATmega328P ADC blok

Sumber: lembar data ATmega328

Jadi solusi langsung adalah membangun pembagi tegangan lemah untuk mendapatkan tegangan yang ingin Anda ukur di bawah referensi INTERNAL 1.1 V, dan kemudian konfigurasikan analogReferencesesuai.

Pembagi tegangan harus lemah (nilai R tinggi) sehingga Anda tidak menarik terlalu banyak arus dari baterai, tetapi tidak terlalu lemah untuk dimuat oleh impedansi input ADC.

Bonus

Namun, jika Anda memerlukan referensi tegangan yang lebih tinggi daripada referensi celah pita internal 1,1 V dari ATmega328 Anda masih kurang beruntung. Pilihannya adalah menggunakan output regulator 3,3 V LDO dari FT232RL on-board, yang tersedia untuk Anda pada pin 14 dari header, tapi saya rasa itu juga tidak bisa diandalkan. The FT232RL datasheet menspesifikasikan itu pada 3,0-3,6 V (nominal 3,3 V)

Jadi solusi universal adalah membangun referensi tegangan eksternal berdasarkan TL431 yang murah . Itu bisa memberi Anda referensi yang dapat diandalkan hingga 4,0 - 4,25 V dengan akurasi +/- 1%.

Rangkaian referensi tegangan eksternal akan menjadi sesuatu yang semudah ini, (dan TL431 tersedia dalam paket TO-92 ramah papan tempat memotong roti!):

Regulator tegangan shunt berbasis TL431

Enric Blanco
sumber
Terima kasih atas jawaban komprehensif ini dan semua alternatif yang bisa saya ambil - saya mungkin akan pergi sederhana dan melakukan pembagi tegangan untuk skala input saya antara 0 dan 1.1. Petunjuk tentang nilai-nilai resisteor sangat berharga bagi saya - terima kasih
Caribou
3

Saya punya halaman tentang konverter ADC pada Atmega328P . Agak turun halaman saya menggambarkan referensi tegangan. Anda dapat menggunakan chip TL431 untuk memberikan berbagai tegangan referensi, misalnya 4V:

Referensi tegangan 4V

Dengan mengubah resistor Anda bisa mendapatkan tegangan lain (sepertinya Anda ingin sekitar 4.2V).

Tegangan output tidak dipengaruhi oleh tegangan input (5V dalam kasus ini).

Halaman tertaut menjelaskan bagaimana Anda dapat memilih nilai resistor.

Nick Gammon
sumber
2

Apakah konversi jumlah adc ke tegangan tergantung pada tegangan sebenarnya dari +5v pin?

ya dan tidak: modul ADC peduli dengan Vref, yang dapat disediakan melalui Vdd, internal, atau eksternal.

Jika ya, apa metode yang diterima untuk mendapatkan tegangan dari papan?

dengan mengkonfigurasi modul ADC. datasheet perangkat harus memiliki register / bit yang perlu diatur untuk itu.

dannyf
sumber