전압으로의 ADC 변환은 + 5V 핀의 실제 값에 의존합니까?


13

질문 :

  1. ADC 카운트를 전압으로 변환하는 것은 +5 V 핀의 실제 전압에 따라 달라 집니까?
  2. 그렇다면 보드에서 해당 전압을 얻는 방법은 무엇입니까?

배경 / 세부 :

USB 커넥터 (허브)에서 Arduino Nano (복제)를 실행하는 회로가 있습니다. Arduino의 임무는 배터리의 전압을 측정하여 Nano에 의해 두 번째 회로를 켜거나 끕니다. 참고로 배터리 테스터입니다.

테스트 회로

아래의 매우 간단한 스케치의 전압을 표시하는 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.13V이지만 Nano는 4.35V를보고합니다.
  • 배터리와 Arduino 사이에 공통 접지가 있습니다.
  • 전압을 테스트하기위한 연결이 플로팅 될 수 있으므로 과도 변동을 방지하기위한 풀다운 저항이 있습니다 (> 10 kΩ)

조사 후 +5 V가 실제로 4.75 V를 출력하고 스케치를

float v = (rawVIN*5.0)/1024.0;

float v = (rawVIN*4.75)/1024.0;

Arduino의 전압 판독 값이 이제 정확했습니다. 나는 내가 한 일을 이해했기 때문에이 일을하지 않았으며, 직감이 있었기 때문에 값을 올바른 것으로 바꿀 수 있었기 때문에 그렇게했습니다.


3
한 편으로 는 1023이 아니라 1024로 나눠야합니다. 이것은 아두 이노 예제의 실수에서 비롯된 것으로 다시 반복되는 실수입니다. 출처? AVR에 대한 데이터 시트.
Tom Carpenter

@TomCarpenter 나는 이것이 계산에 어려움을 겪고 책상에 머리를 두드리는 데 꽤 오랜 시간을 보낸 후 무언가를 읽은 결과라고 생각합니다 .1024로 시작했지만 1023으로 끝났습니다. .
순록

답변:


16

Arduino 내부의 ADC는 전압을 측정하지 않고 전압 비율을 측정 합니다. 즉, 아날로그 입력 전압과 Vref 핀 전압 간의 비율입니다.

기본 구성에서 Vref 핀은 내부적으로 +5 V 라인에 연결되어 있습니다. 대신 내부 참조를 Vref 로 사용하도록 선택할 수 있습니다 .

analogReference(INTERNAL);

이 기준은 약 1.1V이며 + 5V의 변동에 매우 강합니다. 문제는 기준보다 높은 전압을 측정 할 수 없다는 것입니다.

배터리 테스터의 경우 어떤 종류의 "절대"측정을 원할 경우 내부 기준 전압 분배기와 전압 분배기를 사용하여 측정 전압이 1.1V 미만인지 확인할 수 있습니다.

편집 : 전압 분배기를 필요로하지 않는 다른 방법으로 측정하는 기준으로서 VCC를 사용하는 것이 모두 아날로그 입력과 내부 1.1 V "밴드 갭"참조. Vcc에 대해 1.1V를 측정하는 것은 Vcc를 측정하는 간접적 인 방법입니다. 이것은 Arduino 코어 라이브러리에서 지원되지 않지만 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 답변과 결합하여 계속해야 할 모든 것을 제공합니다.
순록

9

USB 전원 Arduino Nano는 들어오는 USB 전압의 +/- 5 % 허용 오차로 인해 신뢰할 수없는 ADC 전압 레퍼런스를 갖습니다. 또한 Nano에는 자체 제조 공차, 온도 및 보드의 전류 소모에 따라 0.1 ~ 0.5V 사이로 떨어지는 MBR0520 쇼트 키 다이오드 (D1)가 있습니다.

그것에 대해 무엇을 할 수 있습니까?

Arduino Nano의 MCU는 ATmega328P입니다. Nano의 ADC는 사용 가능한 여러 기준에 따라 아날로그 전압 판독 값을 스케일링 할 수 있습니다 (그리고 더 적합한 것을 선택할 수 있습니다). analogReference (type)기능을 통해이를 수행 할 수 있으며 다음 참조 중에서 선택하십시오 type.

  • DEFAULT : 5V (5V Arduino 보드) 또는 3.3V (3.3V Arduino 보드)의 기본 아날로그 참조
  • 내부 : ATmega168 또는 ATmega328에서 1.1 볼트와 ATmega8에서 2.56 볼트 (Arduino Mega에서는 사용할 수 없음)와 동일한 내장 참조 [...]
  • EXTERNAL : AREF 핀 (0-5V 만 해당)에 적용되는 전압이 기준으로 사용됩니다.

출처 : analogReference

다음은 ATmega328 내부에있는 ADC 회로도이므로 현재 상황을 확인할 수 있습니다.

ATmega328P ADC 블록

출처 : ATmega328 데이터 시트

따라서 간단한 솔루션은 측정하려는 전압을 INTERNAL 1.1 V 기준 미만으로 낮추고 analogReference그에 따라 구성하기 위해 약한 전압 분배기를 구축하는 것 입니다.

전압 분배기는 약해야합니다 (높은 R 값). 배터리에서 너무 많은 전류를 소비하지는 않지만 ADC 입력 임피던스에 의해로드 되기에는 너무 약하지는 않습니다.

보너스

그러나 ATmega328의 내부 1.1V 밴드 갭 기준보다 높은 전압 기준이 필요한 경우 여전히 운이 좋지 않습니다. 옵션은 온보드 FT232RL의 3.3V LDO 레귤레이터 출력을 사용하는 것입니다.이 출력은 헤더의 핀 14에서 사용할 수 있지만 신뢰할만한 것은 아닙니다. FT232RL 데이터 시트3.0-3.6V (공칭 3.3V)로 지정합니다.

따라서 보편적 인 솔루션은 저렴한 TL431을 기반으로 외부 전압 레퍼런스를 구축하는 것 입니다. 따라서 +/- 1 % 정확도로 최대 4.0-4.25 V의 안정적인 기준을 제공 할 수 있습니다.

외부 전압 레퍼런스 회로는 이처럼 쉬울 것입니다 (그리고 TL431은 브레드 보드 친화적 인 TO-92 패키지로 제공됩니다!) :

TL431 기반 션트 전압 레귤레이터


이 포괄적 인 답변과 내가 취할 수있는 모든 대안에 감사드립니다. 아마도 간단하게 전압 분배기를 사용하여 입력을 0에서 1.1 사이로 조정합니다. 저항 값에 대한 힌트는 저에게 소중했습니다 – 감사
Caribou

3

나는이 Atmega328P에 ADC 컨버터에 대한 페이지를 . 다소 페이지 아래로 난 전압 레퍼런스를 설명합니다. TL431 칩을 사용하여 분류 기준 전압 (예 : 4V)을 제공 할 수 있습니다.

4V 전압 레퍼런스

저항을 변경하면 다른 전압을 얻을 수 있습니다 (약 4.2V가 원하는 것처럼 보입니다).

출력 전압은 입력 전압 (이 경우 5V)의 영향을받지 않습니다.

링크 된 페이지는 저항 값을 선택하는 방법을 설명합니다.


2

adc 카운트를 전압으로 변환하는 것은 + 5v 핀의 실제 전압에 따라 달라 집니까?

예 및 아니오 : adc 모듈은 Vdd를 통해 내부 또는 외부로 공급 될 수있는 Vref를 관리합니다.

그렇다면 보드에서 해당 전압을 얻는 방법은 무엇입니까?

adc 모듈을 구성하여 장치 데이터 시트에는 레지스터 / 비트가 설정되어 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.