ADC bir voltaja dönüşüm +5 V pininin gerçek değerine dayanıyor mu?


13

Sorular:

  1. ADC sayımının voltaja dönüştürülmesi +5 V pininin gerçek voltajına bağlı mı?
  2. Evet ise, bu voltajı karttan almanın kabul edilen yöntemi nedir?

Arka plan / Ayrıntı:

Bir USB konektöründen (hub'dan) çalışan bir Arduino Nano (klon) kullandığım bir devrem var. Arduino'nun görevi, Nano tarafından açılıp kapatılan ikinci bir devreyi çalıştıracak bir akü üzerindeki voltajı ölçmektir. Referans için bir pil test cihazıdır.

Test devresi

Aşağıdaki çok basit çizimden voltajı gösteren bir Nokia 5110 ekranı var.

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);
}
  • Pilin voltajını DVM kullanarak ölçtüm ve 4,13 V, ancak Nano 4,35 V bildiriyor.
  • Batarya ve Arduino arasında ortak bir zemine sahibim.
  • Gerilimi test etmek için bağlantı yüzebileceğinden, vahşi dalgalanmaları durdurmak için bir açılan direncim var (> 10 kΩ)

Bazı araştırmalardan sonra +5 V'nin aslında 4.75 V çıktığını ve çizimimi

float v = (rawVIN*5.0)/1024.0;

için

float v = (rawVIN*4.75)/1024.0;

ve Arduino'daki voltaj okuması artık doğruydu. Bunu ne yaptığımı anladığım için yapmadım, yaptım çünkü bir değere sahiptim, değeri doğru olana değiştirebilir.


3
Bir yan olarak değil, 1023'e değil , 1024'e bölünmelisiniz. Bu, muhtemelen Arduino örneklerindeki hatadan kaynaklanan tekrar tekrar tekrarlanan bir hatadır. Kaynak? AVR için veri sayfası.
Tom Carpenter

@TomCarpenter Sanırım bu, hesaplama ile uğraşmamın ve kafamı masaya vurarak uzun bir süre sonra bir şeyler okumamın bir sonucu - 1024 ile başladım ama gördüğünüz gibi 1023 ile bitti - sorumu düzelteceğim .
Caribou

Yanıtlar:


16

Arduino'nun içindeki ADC voltajı değil, bir voltaj oranını ölçer . Yani analog girişteki voltajdan Vref pimindeki voltaja oran.

Varsayılan yapılandırmada, Vref pini dahili olarak +5 V hattına bağlıdır. Bunun yerine Vref olarak dahili bir referans kullanmayı seçebilirsiniz :

analogReference(INTERNAL);

Bu referans yaklaşık 1,1 V'tur ve +5 V'deki dalgalanmalardan oldukça etkilenmez. Sorun, referanstan daha yüksek voltajları ölçememenizdir.

Pil test cihazınız için bir çeşit “mutlak” ölçüm istiyorsanız, ölçülen voltajın 1,1 V'un altında olduğundan emin olmak için dahili referansı ve bir voltaj bölücüyü kullanabilirsiniz.

Düzenleme : Gerilim bölücü gerektirmeyen bir başka seçenek de Vcc'yi hem analog girişi hem de dahili 1.1 V “bandgap“ referansını ölçmek için referans olarak kullanmaktır . 1.1 V'nin Vcc'ye karşı ölçülmesi, Vcc'yi ölçmenin dolaylı bir yoludur. Bu, Arduino çekirdek kütüphanesi tarafından desteklenmez, ancak doğrudan ADC'nin kontrol kayıtlarını programlayarak yapabilirsiniz:

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

Önyüklemeden sonraki ilk okumanın sahte olabileceğine dikkat edin.


Hızlı cevap için teşekkürler :) Bu şimdi mükemmel bir mantıklı ve neden benim kod (fudge) ayarlaması ile doğru cevap olsun açıklar. Bu enrics cevabı ile birlikte bana devam etmem için gereken her şeyi veriyor.
Caribou

9

USB ile çalışan bir Arduino Nano, gelen USB voltajının +/-% 5 toleransı nedeniyle güvenilemeyecek bir ADC voltaj referansına sahip olacaktır. Bunun da ötesinde, Nano, kendi üretim toleranslarına, sıcaklığına ve kartınızın mevcut çekişine bağlı olarak 0.1 ila 0.5 V arasında düşecek bir MBR0520 Schottky diyotuna (D1) sahiptir.

Bu konuda ne yapabilirsiniz?

Arduino Nano'daki MCU bir ATmega328P'dir. Nano'nun ADC, analog voltaj değerlerini mevcut birkaç referansa göre ölçeklendirebilir (ve size daha uygun olanı seçebilirsiniz). Bunu analogReference (type)işlev aracılığıyla yapabilir ve aşağıdaki referanslar arasından seçim yapabilirsiniz type:

  • VARSAYILAN: 5 volt (5 V Arduino kartlarında) veya 3,3 volt (3,3 V Arduino kartlarında) varsayılan analog referansı
  • DAHİLİ: ATmega168 veya ATmega328 üzerinde 1.1 volta ve ATmega8 üzerinde 2.56 volta (Arduino Mega'da mevcut değildir) eşit bir dahili referans [...]
  • HARİCİ: AREF pimine uygulanan voltaj (sadece 0 ila 5 V) referans olarak kullanılır.

Kaynak: analogReference

Bu, ATmega328'in içindekiler için ADC şemasıdır, böylece orada neler olduğunu görebilirsiniz:

ATmega328P ADC bloğu

Kaynak: ATmega328 veri sayfası

Bu nedenle, basit çözüm, DAHİLİ 1.1 V referansının altında ölçmek istediğiniz voltajı elde etmek için zayıf bir voltaj bölücü inşa etmek ve ardından analogReferencebuna göre yapılandırmaktır .

Voltaj bölücünün zayıf olması gerekir (yüksek R değerleri), bu nedenle aküden çok fazla akım çekmezsiniz, ancak ADC giriş empedansı tarafından yüklenecek kadar zayıf değildir.

Bonus

Bununla birlikte, ATmega328'in dahili 1.1 V bant aralığı referansından daha yüksek bir voltaj referansına ihtiyacınız varsa hala şansınız kalmaz. Bir seçenek, başlığın 14. piminde bulunan yerleşik FT232RL'den 3.3 V LDO regülatör çıkışını kullanmak olabilir, ancak bunun da güvenilir olduğunu düşünmüyorum. FT232RL veri sayfası 3.0 de belirtir o - 3.6 V (nominal 3.3 V)

Dolayısıyla evrensel bir çözüm, ucuz TL431'e dayalı bir harici voltaj referansı oluşturmak olacaktır . Bu, +/-% 1 doğrulukla 4,0 - 4,25 V'a kadar güvenilir bir referans verebilir.

Harici voltaj referans devresi bu kadar kolay bir şey olacaktır (ve TL431, breadboard dostu TO-92 paketinde mevcuttur!):

TL431 tabanlı şönt voltaj regülatörü


Bu kapsamlı cevap ve alabileceğim tüm alternatifler için teşekkürler - Girişimi 0 ile 1.1 arasında ölçeklendirmek için muhtemelen basit olacağım ve bir voltaj bölücü yapacağım. Resisteor değerleri ile ilgili ipucu benim için değerli - teşekkürler
Caribou

3

Atmega328P'deki ADC dönüştürücü hakkında bir sayfam var . Biraz sayfadan voltaj referanslarını tarif ediyorum. TL431 yongasını çeşitli referans voltajları sağlamak için kullanabilirsiniz, örneğin 4V:

4V voltaj referansı

Dirençleri değiştirerek diğer voltajları elde edebilirsiniz (4.2V civarında istediğiniz gibi görünür).

Çıkış gerilimi giriş geriliminden etkilenmez (bu durumda 5V).

Bağlantı verilen sayfada direnç değerlerini nasıl seçebileceğiniz açıklanmaktadır.


2

Adc sayısının voltaja dönüştürülmesi + 5v pininin gerçek voltajına bağlı mı?

evet ve hayır: adc modülü, Vdd aracılığıyla dahili veya harici olarak tedarik edilebilen Vref'i önemser.

Evet ise, bu voltajı karttan almanın kabul edilen yöntemi nedir?

adc modülünü yapılandırarak. cihaz veri sayfasında bunun için ayarlanması gereken kayıtlar / bitler olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.