A conversão de ADC para uma tensão depende do valor real do pino de +5 V?

13

Questões:

  1. A conversão do ADC conta em tensão depende da tensão real do pino de +5 V?
  2. Se sim, qual é o método aceito para obter essa tensão da placa?

Histórico / Detalhe:

Eu tenho um circuito no qual tenho um Arduino Nano (clone) sendo executado a partir de um conector USB (de um hub). O trabalho do Arduino é medir a tensão em uma bateria que acionará um segundo circuito ligado / desligado pelo Nano. Para referência, é um testador de bateria.

Circuito de teste

Há uma tela do Nokia 5110 que exibe a tensão do desenho muito simples abaixo.

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);
}
  • Eu medi a tensão da bateria usando um DVM e ele é de 4,13 V, mas o Nano informa 4,35 V.
  • Eu tenho um terreno comum entre a bateria e o Arduino.
  • Como a conexão para testar a tensão pode flutuar, eu tenho um resistor de pulldown para interromper flutuações violentas (> 10 kΩ)

Após alguma investigação, descobri que o +5 V estava realmente emitindo 4,75 V e mudei meu esboço de

float v = (rawVIN*5.0)/1024.0;

para

float v = (rawVIN*4.75)/1024.0;

e a leitura de tensão no Arduino agora estava correta. Fiz isso não porque entendi o que fiz, porque fiz um palpite de que poderia mudar o valor para o correto.

Caribou
fonte
3
Por um lado, você não deve dividir por 1024, e não por 1023. Esse é um erro repetido várias vezes, provavelmente decorrente do erro nos exemplos do Arduino. Fonte? A folha de dados para o AVR.
Tom Carpenter
@TomCarpenter Eu acho que isso é o resultado de me atrapalhar com o cálculo e ler alguma coisa depois de muito tempo batendo minha cabeça contra a mesa - comecei com 1024, mas como você vê acabou com 1023 - vou corrigir minha pergunta .
Caribou

Respostas:

16

O ADC dentro do Arduino não mede a voltagem, mas uma relação de voltagem . Nomeadamente, a razão entre a tensão na entrada analógica e a tensão no pino Vref.

Na configuração padrão, o pino Vref é vinculado internamente à linha de +5 V. Você pode optar por usar uma referência interna como Vref :

analogReference(INTERNAL);

Essa referência é de cerca de 1,1 V e é bastante imune a flutuações nos +5 V. O problema é que você não pode medir tensões maiores que a referência.

Para o seu testador de bateria, se você quiser algum tipo de medição "absoluta", use a referência interna e um divisor de tensão para garantir que a tensão medida esteja abaixo de 1,1 V.

Editar : Uma outra opção que não necessita de um divisor de tensão é a utilização de Vcc como uma referência para medir tanto a entrada analógica e a 1,1 V de referência “banda proibida” interno. Medir 1,1 V contra Vcc é uma maneira indireta de medir Vcc. Isso não é suportado pela biblioteca principal do Arduino, mas você pode fazer isso programando diretamente os registros de controle do 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;
}

Cuidado que a primeira leitura após a inicialização pode ser falsa.

Edgar Bonet
fonte
Obrigado pela resposta rápida :) isso faz todo o sentido agora e explica por que, pelo meu ajuste de código (fudge), recebo a resposta certa. Isso combinado com a resposta enrics me dá tudo o que preciso para continuar.
Caribou
9

Um Arduino Nano alimentado por USB terá uma referência de voltagem ADC que não pode ser usada devido à tolerância de +/- 5% da voltagem USB de entrada. Além disso, o Nano possui um diodo Schottky MBR0520 (D1) que cai entre 0,1 e 0,5 V, dependendo de suas próprias tolerâncias de fabricação, temperatura e consumo atual de sua placa.

O que você pode fazer sobre isso?

O MCU a bordo do Arduino Nano é um ATmega328P. O ADC do Nano pode dimensionar suas leituras de tensão analógica de acordo com várias referências disponíveis (e você pode escolher a que melhor lhe convier). Você pode fazer isso através da analogReference (type)função e escolher entre as seguintes referências type:

  • PADRÃO: a referência analógica padrão de 5 volts (em placas Arduino de 5 V) ou 3,3 volts (em placas Arduino de 3,3 V)
  • INTERNO: Uma referência interna, igual a 1,1 volts no ATmega168 ou ATmega328 e 2,56 volts no ATmega8 (não disponível no Arduino Mega) [...]
  • EXTERNO: a tensão aplicada ao pino AREF (somente 0 a 5 V) é usada como referência.

Fonte: analogReference

Este é o esquema da ADC para o conteúdo do ATmega328, para que você possa ver o que está acontecendo lá:

Bloco ADC ATmega328P

Fonte: Folha de dados do ATmega328

Portanto, a solução direta é criar um divisor de tensão fraco para obter a tensão que você deseja medir abaixo da referência INTERNAL de 1,1 V e, em seguida, configurar de analogReferenceacordo.

O divisor de tensão precisa ser fraco (altos valores de R) para que você não extraia muita corrente da bateria, mas não muito fraco para ser carregado pela impedância de entrada do ADC.

Bônus

No entanto, se você precisar de uma referência de tensão maior que a referência interna de 1,1 V do ATmega328, ainda estará sem sorte. Uma opção seria usar a saída do regulador LDO de 3,3 V do FT232RL on-board, disponível no pino 14 do cabeçalho, mas também não acho que seja confiável. A folha de dados do FT232RL a especifica em 3,0 - 3,6 V (3,3 V nominais)

Portanto, uma solução universal seria criar uma referência de tensão externa baseada em um TL431 barato . Isso pode fornecer uma referência confiável de 4,0 a 4,25 V com uma precisão de +/- 1%.

O circuito de referência de tensão externa seria algo tão fácil quanto isso (e o TL431 está disponível no pacote TO-92 amigável para a placa de ensaio!):

Regulador de tensão de derivação baseado em TL431

Enric Blanco
fonte
Obrigado por esta resposta abrangente e todas as alternativas que eu poderia adotar - provavelmente irei simplificar e fazer um divisor de tensão para escalar minha entrada entre 0 e 1.1. A dica sobre valores resisteor foi valioso para mim - graças
Caribou
3

Eu tenho uma página sobre o conversor ADC no Atmega328P . Um pouco abaixo da página , descrevo as referências de tensão. Você pode usar o chip TL431 para fornecer tensões de referência variadas, por exemplo 4V:

Referência de tensão de 4V

Ao alterar os resistores, você pode obter outras tensões (parece que você deseja em torno de 4,2V).

A tensão de saída não é influenciada pela tensão de entrada (5V neste caso).

A página vinculada descreve como você pode escolher os valores do resistor.

Nick Gammon
fonte
2

A conversão da contagem de adc em tensão depende da tensão real do pino + 5v?

sim e não: o módulo adc se preocupa com o Vref, que pode ser fornecido via Vdd, interna ou externamente.

Se sim, qual é o método aceito para obter essa tensão da placa?

configurando o módulo adc. a folha de dados do dispositivo deve ter registros / bits que precisam ser configurados para isso.

dannyf
fonte