Điện áp tham chiếu Arduino ADC nếu nó chạy bằng pin


9

Tôi đang tìm cách có thể theo dõi năng lượng pin cho Arduino bằng cách sử dụng ADC của nó. Điều này khá đơn giản và đơn giản (đặc biệt nếu sử dụng API Arduino); tuy nhiên, nếu pin cung cấp năng lượng cho Arduino và không được kiểm soát bên ngoài, liệu điện áp tham chiếu ADC có liên tục giảm với pin không? Nói cách khác, giá trị ADC sẽ liên tục đọc cùng một giá trị (giá trị tối đa) mặc dù pin thực sự sẽ giảm điện áp?

Nếu đây là trường hợp, nó sẽ không hiệu quả và vô nghĩa để đo điện áp pin.

Câu trả lời:


4

... Sẽ không có điện áp tham chiếu ADC liên tục giảm với pin?

Có, đó là lý do tại sao bạn sử dụng hoặc đo tham chiếu bandgap nội bộ thay thế.

Sử dụng analogReference()chức năng để chọn một tài liệu tham khảo phù hợp cho bảng đang sử dụng. Lưu ý rằng bạn sẽ cần sử dụng bộ chia điện áp để giảm điện áp pin xuống giá trị dưới giá trị tham chiếu đã chọn nếu bạn muốn đo nó.

Để đo điện áp bandgap thay vì (sử dụng AV CC như một tài liệu tham khảo và làm việc "ngược"), bạn sẽ cần phải thiết lập MUX[3:0]trong ADMUXđể 0b1110 và sau đó thực hiện một ADC đọc trực tiếp (thiết lập ADSCtrong ADCSRAvà chờ đợi cho đến khi nó reset, sau đó đọc từ ADC[H:L]).

Như mọi khi, hãy xem bảng dữ liệu MCU để biết chi tiết.


Thông tin tuyệt vời, bây giờ tôi nghĩ rằng tôi có thể tự mình tiến hành. Tôi đã hy vọng có một số loại tài liệu tham khảo nội bộ có thể được sử dụng. Như bạn đề xuất, tôi sẽ cần phân chia điện áp xuống dưới AVccref, tuy nhiên, tôi đang tìm cách tối đa hóa tuổi thọ pin ở tất cả các khía cạnh có thể vì vậy tôi sẽ sử dụng điện trở tương đương lớn cho bộ chia để đảm bảo tôi có ít hơn một uA của dòng điện rò rỉ. Bạn có thấy bất kỳ vấn đề với điều này?
ryeager

1
Trở kháng ADC chỉ là 100Mohm. Thay vào đó hãy xem xét việc tham chiếu nội bộ.
Ignacio Vazquez-Abrams

1
FYI Tôi tìm thấy blog tuyệt vời này sau khi câu trả lời @Ignacio đăng: link
ryeager

1

@ ryeager liên kết đến http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-vol volt / # com-71836 có mã này để đọc điện áp pin của Arduino:

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

Thủ thuật ở đây là nó đo tham chiếu bên trong 1.1V bằng điện áp pin, sau đó đảo ngược để tính điện áp tham chiếu không xác định.

Phép thuật ADMUX trong mã này có thể cho phép các phép đọc ADC thú vị khác, chẳng hạn như phép đo vi sai và phép đo ADC khác biệt với mức tăng, tùy thuộc vào thành phần và biểu dữ liệ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.