Việc chuyển đổi ADC thành điện áp có phụ thuộc vào giá trị thực của chân +5 V không?


13

Câu hỏi:

  1. Việc chuyển đổi số đếm ADC thành điện áp có phụ thuộc vào điện áp thực tế của chân +5 V không?
  2. Nếu có, phương pháp được chấp nhận để có được điện áp đó từ bảng là gì?

Bối cảnh / Chi tiết:

Tôi có một mạch trong đó tôi có Arduino Nano (bản sao) chạy từ đầu nối USB (từ một hub). Công việc của Arduino là đo điện áp trên pin sẽ điều khiển mạch thứ hai được bật / tắt bởi Nano. Để tham khảo nó là một thử nghiệm pin.

Kiểm tra mạch

Có một màn hình Nokia 5110 hiển thị điện áp từ bản phác thảo rất đơn giản dưới đây.

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);
}
  • Tôi đã đo điện áp của pin bằng DVM và nó là 4,13 V, nhưng Nano báo cáo 4,35 V.
  • Tôi có một điểm chung giữa pin và Arduino.
  • Vì kết nối để kiểm tra điện áp có thể nổi, tôi có điện trở kéo xuống để dừng dao động hoang dã (> 10 kΩ)

Sau một số điều tra, tôi thấy rằng +5 V thực sự đã xuất ra 4,75 V và thay đổi bản phác thảo của tôi từ

float v = (rawVIN*5.0)/1024.0;

đến

float v = (rawVIN*4.75)/1024.0;

và đọc điện áp trên Arduino bây giờ đã chính xác. Tôi đã làm điều này không phải vì tôi hiểu những gì tôi đã làm, tôi đã làm nó bởi vì tôi có linh cảm nó có thể thay đổi giá trị thành đúng.


3
Là một bên, bạn không nên chia cho 1024, không phải 1023. Đây là một lỗi được lặp đi lặp lại nhiều lần, có lẽ xuất phát từ sai lầm trong các ví dụ về Arduino. Nguồn? Bảng dữ liệu cho AVR.
Tom Carpenter

@TomCarpenter Tôi nghĩ rằng đây là kết quả của việc tôi dò dẫm tính toán và đọc một cái gì đó sau một thời gian dài đập đầu vào bàn làm việc - Tôi bắt đầu với 1024 nhưng khi bạn thấy kết thúc với 1023 - Tôi sẽ sửa câu hỏi của tôi .
Caribou

Câu trả lời:


16

ADC bên trong Arduino không đo điện áp, mà là tỷ lệ điện áp . Cụ thể là tỷ lệ từ điện áp ở đầu vào tương tự đến điện áp ở chân Vref.

Trong cấu hình mặc định, chân Vref được gắn bên trong với dòng +5 V. Bạn có thể chọn sử dụng thay vì tham chiếu nội bộ như Vref :

analogReference(INTERNAL);

Tham chiếu này là khoảng 1,1 V và khá miễn dịch với các dao động trên +5 V. Vấn đề là bạn không thể đo điện áp cao hơn tham chiếu.

Đối với người kiểm tra pin của bạn, nếu bạn muốn một số phép đo tuyệt đối, bạn có thể sử dụng tham chiếu bên trong và bộ chia điện áp để đảm bảo điện áp đo được dưới 1.1 V.

Chỉnh sửa : Một tùy chọn khác không yêu cầu bộ chia điện áp là sử dụng Vcc làm tham chiếu để đo cả đầu vào tương tự và tham chiếu bandgap 1.1 bên trong 1.1. Đo 1.1 V so với Vcc là cách gián tiếp để đo Vcc. Điều này không được thư viện lõi Arduino hỗ trợ, nhưng bạn có thể thực hiện bằng cách lập trình trực tiếp các thanh ghi điều khiển của 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;
}

Xin lưu ý rằng lần đọc đầu tiên sau khi khởi động có thể là không có thật.


Cảm ơn đã trả lời nhanh chóng :) điều này có ý nghĩa hoàn hảo bây giờ và giải thích lý do tại sao bằng cách điều chỉnh mã (fudge) của tôi, tôi nhận được câu trả lời đúng. Điều này kết hợp với câu trả lời enrics cho tôi tất cả những gì tôi cần để tiếp tục.
Caribou

9

Arduino Nano được hỗ trợ USB sẽ có tham chiếu điện áp ADC không thể dựa vào, do dung sai +/- 5% của điện áp USB đến. Trên hết, Nano có một diode Schottky MBR0520 (D1) sẽ giảm từ 0,1 đến 0,5 V tùy thuộc vào dung sai sản xuất của chính nó, nhiệt độ của nó và mức độ hiện tại của bo mạch của bạn.

Bạn có thể làm gì về nó?

MCU trên tàu Arduino Nano là ATmega328P. ADC của Nano có thể mở rộng các giá trị điện áp tương tự của nó theo một số tài liệu tham khảo có sẵn (và bạn có thể chọn cái phù hợp với mình hơn). Bạn có thể làm điều này thông qua analogReference (type)chức năng và chọn trong số các tham chiếu sau type:

  • DEFAULT: tham chiếu tương tự mặc định là 5 volt (trên bảng Arduino 5 V) hoặc 3,3 volt (trên bảng Arduino 3,3 V)
  • NỘI BỘ: Tham chiếu tích hợp, bằng 1,1 volt trên ATmega168 hoặc ATmega328 và 2,56 volt trên ATmega8 (không khả dụng trên Arduino Mega) [...]
  • EXTERNAL: điện áp đặt vào chân ISF (chỉ 0 đến 5 V) được sử dụng làm tham chiếu.

Nguồn: analogReference

Đây là sơ đồ ADC cho những gì bên trong ATmega328 để bạn có thể thấy những gì đang diễn ra ở đó:

Khối ADC ATmega328P

Nguồn: Bảng dữ liệu ATmega328

Vì vậy, giải pháp đơn giản là xây dựng bộ chia điện áp yếu để lấy điện áp bạn muốn đo bên dưới tham chiếu INTERNAL 1.1 V, sau đó định cấu hình cho analogReferencephù hợp.

Bộ chia điện áp cần phải yếu (giá trị R cao) để bạn không rút quá nhiều dòng điện ra khỏi pin, nhưng không quá yếu khi được nạp bởi trở kháng đầu vào ADC.

Tặng kem

Tuy nhiên, nếu bạn cần tham chiếu điện áp cao hơn thì tham chiếu băng tần 1.1 V bên trong của ATmega328 bạn vẫn không gặp may. Một tùy chọn sẽ là sử dụng đầu ra bộ điều chỉnh LDO 3,3 V từ FT232RL trên bo mạch, có sẵn cho bạn ở chân 14 của tiêu đề, nhưng tôi cũng không tin nó đáng tin cậy. Bảng dữ liệu FT 232RL chỉ định nó ở 3.0 - 3.6 V (danh nghĩa 3.3 V)

Vì vậy, một giải pháp phổ quát sẽ là xây dựng một tham chiếu điện áp bên ngoài dựa trên TL431 giá rẻ . Điều đó có thể cung cấp cho bạn một tài liệu tham khảo đáng tin cậy lên tới 4.0 - 4.25 V với độ chính xác +/- 1%.

Mạch tham chiếu điện áp bên ngoài sẽ dễ dàng như thế này (và TL431 có sẵn trong gói TO-92 thân thiện với bánh mì!):

Bộ điều chỉnh điện áp shunt dựa trên TL431


Cảm ơn câu trả lời toàn diện này và tất cả các giải pháp thay thế tôi có thể đưa ra - tôi có thể sẽ đơn giản và thực hiện một bộ chia điện áp để mở rộng đầu vào của tôi trong khoảng từ 0 đến 1.1. Gợi ý về giá trị sao băng rất có giá trị đối với tôi - cảm ơn
Caribou

3

Tôi có một trang về bộ chuyển đổi ADC trên Atmega328P . Một phần nào đó xuống trang tôi mô tả các tài liệu tham khảo điện áp. Bạn có thể sử dụng chip TL431 để cung cấp điện áp tham chiếu các loại, ví dụ 4V:

Tham chiếu điện áp 4V

Bằng cách thay đổi điện trở, bạn có thể có được điện áp khác (có vẻ như bạn muốn khoảng 4.2V).

Điện áp đầu ra không bị ảnh hưởng bởi điện áp đầu vào (5V trong trường hợp này).

Trang được liên kết mô tả cách bạn có thể chọn giá trị điện trở.


2

Việc chuyển đổi số lượng adc thành điện áp có phụ thuộc vào điện áp thực tế của chân + 5v không?

có và không: mô-đun adc quan tâm đến Vref, có thể được cung cấp qua Vdd, bên trong hoặc bên ngoài.

Nếu có, phương pháp được chấp nhận để có được điện áp đó từ bảng là gì?

bằng cách cấu hình mô-đun adc. biểu dữ liệu thiết bị nên có các thanh ghi / bit cần được thiết lập cho điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.