การแปลง ADC เป็นแรงดันขึ้นอยู่กับมูลค่าที่แท้จริงของพิน +5 V หรือไม่?


13

คำถาม:

  1. การแปลงของ ADC นับเป็นแรงดันขึ้นอยู่กับแรงดันไฟฟ้าที่แท้จริงของขา +5 V หรือไม่?
  2. ถ้าใช่วิธีการรับแรงดันไฟฟ้าจากบอร์ดเป็นที่ยอมรับคืออะไร?

พื้นหลัง / รายละเอียด:

ฉันมีวงจรที่มี Arduino Nano (โคลน) ที่ทำงานจากตัวเชื่อมต่อ USB (จากฮับ) หน้าที่ของ Arduino คือการวัดแรงดันไฟฟ้าของแบตเตอรี่ซึ่งจะทำให้วงจรที่สองเปิด / ปิดโดยนาโน สำหรับการอ้างอิงมันเป็นเครื่องทดสอบแบตเตอรี่

วงจรทดสอบ

มีหน้าจอ 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 V แต่นาโนรายงาน 4.35 V
  • ฉันมีสายกราวด์ร่วมกันระหว่างแบตเตอรี่กับ Arduino
  • เนื่องจากการเชื่อมต่อเพื่อทดสอบแรงดันไฟฟ้าสามารถลอยได้ฉันจึงมีตัวต้านทานแบบเลื่อนลงเพื่อหยุดความผันผวนที่รุนแรง (> 10 kΩ)

หลังจากการตรวจสอบฉันพบว่า +5 V กำลังส่งออก 4.75 V จริง ๆ แล้วเปลี่ยนร่างของฉันจาก

float v = (rawVIN*5.0)/1024.0;

ถึง

float v = (rawVIN*4.75)/1024.0;

และแรงดันไฟฟ้าที่อ่านบน Arduino นั้นถูกต้องแล้ว ฉันทำสิ่งนี้ไม่ใช่เพราะฉันเข้าใจสิ่งที่ฉันทำฉันทำเพราะฉันมีลางสังหรณ์มันอาจเปลี่ยนค่าเป็นสิ่งที่ถูกต้อง


3
คุณไม่ควรหารด้วย 1024 ไม่ใช่ 1,023 นี่เป็นความผิดพลาดที่ซ้ำไปซ้ำมาซึ่งอาจเกิดจากความผิดพลาดในตัวอย่างของ Arduino แหล่งที่มา? แผ่นข้อมูลสำหรับ AVR
Tom Carpenter

@ TomCarpenter ฉันคิดว่านี่เป็นผลมาจากการคลำหาของฉันด้วยการคำนวณและการอ่านบางสิ่งบางอย่างหลังจากต่อสู้กับหัวโต๊ะของฉันมานาน - ฉันเริ่มต้นด้วย 1024 แต่ตามที่คุณเห็นท้ายด้วย 1,023 - ฉันจะแก้ไขคำถามของฉัน .
Caribou

คำตอบ:


16

เอดีซีภายใน Arduino ไม่ได้วัดแรงดันไฟฟ้า แต่แรงดันอัตราส่วน คืออัตราส่วนจากแรงดันไฟฟ้าที่อินพุตแบบอะนาล็อกกับแรงดันไฟฟ้าที่ขา Vref

ในการกำหนดค่าเริ่มต้นหมุด Vref จะถูกผูกไว้ภายในกับสาย +5 V คุณสามารถเลือกที่จะใช้แทนการอ้างอิงภายในเป็น Vref :

analogReference(INTERNAL);

การอ้างอิงนี้มีค่าประมาณ 1.1 V และค่อนข้างมีภูมิคุ้มกันต่อความผันผวนของ +5 V ปัญหาคือคุณไม่สามารถวัดแรงดันไฟฟ้าที่สูงกว่าการอ้างอิงได้

สำหรับเครื่องทดสอบแบตเตอรี่ของคุณหากคุณต้องการการวัดแบบ“ สัมบูรณ์” คุณสามารถใช้การอ้างอิงภายในและตัวแบ่งแรงดันเพื่อให้แน่ใจว่าแรงดันไฟฟ้าที่วัดได้นั้นต่ำกว่า 1.1 V

แก้ไข : ตัวเลือกอื่นที่ไม่ต้องการตัวแบ่งแรงดันไฟฟ้าคือการใช้ Vcc เป็นข้อมูลอ้างอิงในการวัดทั้งอินพุตแบบอะนาล็อกและการอ้างอิงภายใน 1.1 V“ bandgap” การวัด 1.1 V เทียบกับ Vcc เป็นวิธีทางอ้อมในการวัด Vcc นี่ไม่ใช่ไลบรารีหลักของ Arduino ที่รองรับ แต่คุณสามารถทำได้โดยการตั้งโปรแกรมโดยตรงกับ register ของ 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;
}

ระวังว่าการอ่านครั้งแรกหลังจากบูตอาจเป็นของปลอม


ขอบคุณสำหรับการตอบกลับที่รวดเร็ว :) มันสมเหตุสมผลดีในขณะนี้และอธิบายว่าทำไมการปรับรหัสของฉัน (เหลวไหล) ฉันได้รับคำตอบที่ถูกต้อง สิ่งนี้รวมกับคำตอบของ enrics ให้ทุกอย่างที่ฉันต้องการต่อไป
Caribou

9

Arduino Nano ที่ขับเคลื่อนด้วย USB จะมีการอ้างอิงแรงดันไฟฟ้า ADC ซึ่งไม่สามารถเชื่อถือได้เนื่องจากความอดทน +/- 5% ของแรงดันไฟฟ้า USB ที่เข้ามา ยิ่งไปกว่านั้น Nano ยังมี MBR0520 Schottky diode (D1) ที่จะลดลงระหว่าง 0.1 และ 0.5 V ขึ้นอยู่กับความคลาดเคลื่อนในการผลิตของตัวเองอุณหภูมิและการจับกระแสของบอร์ดของคุณ

คุณทำอะไรได้บ้าง

Arduino Nano บนบอร์ดเป็น ATmega328P ADC ของนาโนสามารถปรับขนาดการอ่านแรงดันไฟฟ้าแบบอะนาล็อกตามการอ้างอิงที่มีอยู่หลายตัว (และคุณสามารถเลือกอันที่เหมาะกับคุณได้ดีกว่า) คุณสามารถทำได้ผ่านanalogReference (type)ฟังก์ชั่นและเลือกระหว่างการอ้างอิงต่อไปนี้type:

  • ค่าเริ่มต้น: การอ้างอิงแบบอะนาล็อกเริ่มต้นของ 5 โวลต์ (บนบอร์ด Arduino 5 V) หรือ 3.3 โวลต์ (บนบอร์ด Arduino 3.3 V)
  • ภายใน: การอ้างอิงในตัวเท่ากับ 1.1 โวลต์บน ATmega168 หรือ ATmega328 และ 2.56 โวลต์บน ATmega8 (ไม่สามารถใช้ได้กับ Arduino Mega) [... ]
  • ภายนอก: แรงดันไฟฟ้าที่ใช้กับขา AREF (0 ถึง 5 V เท่านั้น) ใช้เป็นข้อมูลอ้างอิง

ที่มา: analogReference

นี่คือแผนผัง ADC สำหรับสิ่งที่อยู่ภายใน ATmega328 เพื่อให้คุณสามารถเห็นสิ่งที่เกิดขึ้นที่นั่น:

บล็อก ADC ATmega328P

ที่มา: แผ่นข้อมูล ATmega328

ดังนั้นทางออกที่ตรงไปตรงมาคือการสร้างตัวแบ่งแรงดันไฟฟ้าที่อ่อนแอเพื่อให้ได้แรงดันที่คุณต้องการวัดด้านล่างอ้างอิงภายใน 1.1 V จากนั้นกำหนดค่าanalogReferenceตามความเหมาะสม

ตัวแบ่งแรงดันไฟฟ้าต้องอ่อน (ค่า R สูง) ดังนั้นคุณจะไม่ดึงกระแสไฟออกจากแบตเตอรี่มากเกินไป แต่ไม่อ่อนแอเกินไปที่จะโหลดโดยอิมพิแดนซ์อินพุต ADC

โบนัส

อย่างไรก็ตามหากคุณต้องการแรงดันไฟฟ้าอ้างอิงสูงกว่าว่าการอ้างอิง bandgap 1.1 V ภายในของ ATmega328 คุณยังโชคไม่ดี ทางเลือกหนึ่งคือใช้เอาท์พุท regulator 3.3 V LDO จาก FT232RL ออนบอร์ดซึ่งมีให้คุณที่ขา 14 ของส่วนหัว แต่ฉันไม่คิดว่ามันน่าเชื่อถือ FT232RL แผ่นข้อมูลที่ระบุไว้ที่ 3.0-3.6 V (ตามที่ระบุ 3.3 V)

ดังนั้นการแก้ปัญหาสากลที่จะสร้างแรงดันอ้างอิงภายนอกอยู่บนพื้นฐานของราคาถูกTL431 ที่สามารถให้การอ้างอิงที่เชื่อถือได้สูงถึง 4.0 - 4.25 V พร้อมความแม่นยำ +/- 1%

วงจรอ้างอิงแรงดันไฟฟ้าภายนอกนั้นเป็นอะไรที่ง่ายอย่างนี้ (และ TL431 มีอยู่ในแพ็คเกจ TO-92 ที่เป็นมิตรกับเขียงหั่นขนม!):

ตัวปรับแรงดันไฟฟ้าแบบแบ่งตาม TL431


ขอบคุณสำหรับคำตอบที่ครอบคลุมและทางเลือกทั้งหมดที่ฉันสามารถรับได้ - ฉันอาจจะง่ายและทำอุปกรณ์แบ่งแรงดันไฟฟ้าเพื่อปรับขนาดอินพุตของฉันระหว่าง 0 ถึง 1.1 คำแนะนำเกี่ยวกับค่าความต้านทานต่อสภาพอากาศนั้นมีค่าสำหรับฉัน - ขอบคุณ
Caribou

3

ฉันมีหน้าเกี่ยวกับตัวแปลง ADC บน Atmega328P ค่อนข้างหน้าฉันอธิบายการอ้างอิงแรงดันไฟฟ้า คุณสามารถใช้ชิป TL431 เพื่อให้แรงดันอ้างอิงที่หลากหลายเช่น 4V:

แรงดันอ้างอิง 4V

โดยการเปลี่ยนตัวต้านทานคุณสามารถรับแรงดันไฟฟ้าอื่น ๆ (ดูเหมือนว่าคุณต้องการรอบ 4.2V)

แรงดันไฟขาออกไม่ได้รับอิทธิพลจากแรงดันไฟฟ้าขาเข้า (5V ในกรณีนี้)

หน้าที่เชื่อมโยงจะอธิบายถึงวิธีที่คุณอาจเลือกค่าตัวต้านทาน


2

การแปลง adc นับเป็นแรงดันขึ้นอยู่กับแรงดันไฟฟ้าจริงของพิน +5v หรือไม่?

ใช่และไม่ใช่: โมดูล adc ใส่ใจกับ Vref ซึ่งสามารถจัดหาผ่าน Vdd ภายในหรือภายนอก

ถ้าใช่วิธีการรับแรงดันไฟฟ้าจากบอร์ดเป็นที่ยอมรับคืออะไร?

โดยการกำหนดค่าโมดูล adc แผ่นข้อมูลอุปกรณ์ควรมีการลงทะเบียน / บิตที่ต้องมีการตั้งค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.