Pesquisando circuitos para montar um Carregador da Bateria Li-Ion, encontrei esse Módulo sensor de Corrente Contínua MAX471. O que fez me despertar interesse por ele, é que que o chip MAX471 já tem um resistor interno de precisão com um valor baixo de resistência  que serve para medir a corrente. E também tem uma porta de saída que indica o sinal da corrente, isto é, o sentido da passagem da corrente. O fato dele medir corrente de até 3 ampéres, acho que é o suficiente para a aplicação carregador de bateria. Se for necessário medir uma corrente maior, pode ser usado o MAX472.

Como sempre, antes de usar um módulo, pesquiso e faço levantamento de todas as informações. Desse modo, evita-se que eu o use indevidamente, por exemplo, sobrecarregando-o ou até queimando-o. E sabendo suas características, você poderá usar todos os recursos que o módulo tem.

Primeiro passo, eu baixo o datasheet (folha de especificações)  sempre do site do fabricante. Se baixar de outro site, poderá usar informações antigas ou obsoletas. Portanto esse é o link do datasheet do MAX471 :

Link do Datasheet do MAX471

Foi no site da MAXIM, que descobri que infelizmente, o chip MAX471 já esta obsoleto. A própria MAXIM recomenda o uso de outros substitutos – MAX4070, MAX4071 ou MAX4072. Mas pesquise antes, pois existem algumas diferenças do MAX471.

Link do Datasheet de substituto

Esse é o pequeno Módulo do MAX471 (2,2 x 2,3 cm). Eu havia informado que ele é sensor de corrente. Mas o fabricante chinês do módulo acrescentou dois resistores que formam um divisor de tensão, que é usado  para a medição da tensão de entrada ( VIN).


A partir da foto do Módulo MAX471 e usando o programa ExpressSCH, fiz o levantamento do diagrama do circuito.

Link do programa ExpressSCH

Link das fotos e diagramas do Módulo MAX471

modulo-max471

Medição de corrente MAX471  – pino AT :

O chip MAX471 é amplificador  sensor de corrente com precisão. Ele possui um resistor interno de precisão de 35 mΩ por onde passa a corrente (entre os pinos RS+ e RS-). A tensão sobre o resistor  é amplificada e medida. O circuito tem uma acuracidade de 2%. O Chip suporta tensões de 3V a 36V ente os pinos RS e terra (GND).(OBS – o módulo suporta tensões de 3V a 25V somente – vide explicação posterior).  Serve para medição de correntes de até 3 Ampéres. Se precisar de corrente maiores do que 3A, pode-se usar o MAX472, mas nesse caso como ele não tem um resistor interno, é preciso montar um resistor externo de precisão para o sensoriamento da corrente.

No pino de saída (OUT), circula uma corrente que é proporcional à corrente que esta sendo medida entre os pinos RS+ e RS-. Usando um resistor de 2000 Ω, a tensão sobre ele será :

pino AT = 1A  /  1V 

Isto é, se a tensão de saída (pino AT) for de 1V, então a corrente medida será de 1A, se VT for 0,5V, então a corrente será de 500mA. Essa relação simplifica bastante as medições.A precisão das medidas dependerá do valor de R1 (2KΩ). No Sketch tive que fazer uma aferição nas medições, apesar do resistor ter uma boa precisão.

Um pino interessante do Chip MAX471 é o pino SIGN (sinal) . Infelizmente esse pino esta desativado no módulo. Mas fiz verificações para comprova-lo. Ele indica o sinal da corrente, isto é se a corrente esta carregando ou descarregando no circuito. Esse pino é uma saída digital coletor aberto. Para ser usado, precisará conectar um resistor de 10K até o +VCC do Microcontrolador.

                                      SIGN – nível alto    – Sentido  VIN (RS+)    ==>   VOUT (RS-)

                                      SIGN – nível baixo – Sentido VOUT (RS-)  ==> VIN (RS+)

pino de entrada SHDN permite o desligamento do chip (shutdown). Mas nesse módulo, o chip esta sempre ativo, já que  SHDN esta aterrado.

Medição de Tensão do Módulo – pino VT : 

Veja no circuito, o divisor de Tensão R2 / R3.

R2 + R3 = 30K + 7,5K = 37,5K Ω

Como o pino VT é a tensão sobre o R3, existe essa relação de tensão :

pino VT = VIN  x  0,2         =>       VIN  / 37,5K = VT  / 7,5K       =>       VT = VIN   x (7,5 / 37,5)

Ou melhor ( essa relação é usada no Sketch) =>     VIN = VT   x   5 

Esse cálculo da tensão  também dependerá da precisão dos valores dos resistores R2 e R3. No programa tive que fazer também uma aferição, para que a tensão fosse medida corretamente. Observação importante :  Como a entrada do circuito ADC (conversor analógico digital) suporta tensões de até 5V, usando a fórmula acima, percebe-se que a tensão máxima que pode ser usada no Módulo MAX471 é de 25 V . ( 5 x 5V) .

Circuito de Teste do Módulo MAX471 : 

Essa é a montagem de teste do módulo que eu fiz. Conectei-o à um Arduino NANO (poderá usar outro tipo de Arduino com ATMega328 ou similar). Usei uma bateria de Chumbo selada de 12V / 7Ah como fonte de energia. Na carga usei dois resistores de 12 Ω / 10 W. Montei os dois resistores em série, para que a corrente medida fosse de aproximadamente 500 mA.

V = R  x  I    =>    I  = V  /  R  =    12V  /  ( 12Ω +12Ω)    =   12V  /  24 Ω  =   500 mA 

Esse é o diagrama simplificado do circuito de teste (a carga são os dois resistores de 12Ω em série).Se for usar uma carga que tiver polaridade, muita atenção para não inverter as ligações.

modulo-max471-teste

O pino de medição de corrente AT foi conectado ao pino analógico A1 do Arduino. E o pino de medição de Tensão VT foi conectado ao pino analógico A0. Durante os testes, percebi a necessidade de usar capacitores de desacoplamento nas entradas ( C1 e C2 de 10nF). Não se esqueça do conectar o Terra (GND) do módulo ao GND do Arduino.

Usando o Conversor ADC do Arduino ATMega 328 :

Todas medidas analógicas do Arduino são convertidas em valores digitais, através do Conversor ADC (conversor analógico digital). O  ADC do Microcontrolador ATMega 328 tem 10 bits. A tensão máxima de entrada nos pinos analógicos é de 5V. Ele possui um multiplexador que permite 8 entradas (pinos A0 até A7 do Arduino).

Sabendo-se que 2 elevado à 10 é igual à 1024 :

5,0V   /   1024   =   0,0048828125 V   (4,88 mV aproximadamente)

( valor de tensão do bit menos significativo do ADC) 

Muitas pessoas tentam fazer medidas com o Arduino e não conseguem. É muito importante saber alguns detalhes sobre o uso do ADC:

  • Primeiro ponto é em relação a tensão de referência AREF (analogic Reference). Todas medições são comparadas com essa tensão. Portanto essa tensão tem que ser regulada e estabilizada. Se ela variar, todas as medidas serão incorretas. Use um capacitor de 10uF conectado do pino AREF(+)  ao terra(-). Isso evitará ruídos e oscilações nessa  tensão. Meça a tensão AREF com um voltímetro de precisão, para aferir o cálculo no Sketch. A Tensão AREF pode ser gerada internamente no ATMega328 ou pode ser alimentada com um regulador (Arduino). Recomendo que forneça no conector de alimentação do Arduino,  uma tensão de 9 a 12V (pode usar uma fonte externa).  Pois se alimentar o Arduino através do conector USB, a tensão AREF pode não chegar aos 5,0V e ficar instável (fiz testes para comprovar isso).
  • o uso de capacitores de desacoplamento nas entradas, evitam ruídos e interferências. Mas o valor do capacitor dependerá da taxa de variação do sinal. No caso do módulo MAX471 com o circuito da bateria, os capacitores de 10nF deram bom resultados.
  • Como as 8 entradas do ADC são multiplexadas, recomenda-se que as entradas que não estão sendo usadas, sejam aterradas – conectadas ao GND.

Programa SKETCH do Arduino – MAX471b.ino

Esse é o programa de Teste do Módulo MAX471 usando um Arduino Nano (pode ser usado outro Arduino com ATMega328). O grande pulo do gato, foi usar o filtro passa baixa do Simon Monk. Com esse filtro, as medições ficam mais precisas e são estabilizadas gradativamente. Como eu já disse, use uma fonte externa estabilizada e regulada para o Arduino.

Link do Filtro Passa Baixa do Simon Monk

Conheci esse filtro no Livro do Simon Monk :

Livro Programming Arduino Next Steps

Sketches de exemplo do Livro

Livro traduzido (excelente dica) :

Programação com Arduino II – Simon Monk

Esse é o programa de Teste MAX471b.ino.

PasteBin do MAX471B.ino

// Testes com Modulo MAX471 // Medicao corrente e Tensao com bateria  12V // Gustavo Murta 26/jan/2017 // Capacitor no Pino REF Arduino = 10uF IMPORTANTE // 5,00V / 1024 = 0,0048828125  Tensão do bit menos significativo  const float voltsporUnidadeV = 0.004893 ;      // Valor aferido para calculo da Tensao const float voltsporUnidadeI = 0.00502 ;       // Valor aferido para calculo da Corrente const int pinVT = A0;                          // Pino de Medicao de Tensao VT const int pinAT = A1;                          // Pino de Medicao de Corrente AT  const int bufferTam = 100;                    // Tamanho do Buffer = 100 int buffer[bufferTam];                        // Definicao do Buffer int index;                                    // Definicao do Indice int amostra; const float alpha = 0.99;                     // Constante de calculo do Filtro Passa Baixa  int Iint = 0;           // Tensao filtrada no pino AT int Vint = 0;           // Tensao filtrada no pino VT float Tensao = 0;       // calculo da Tensao float Corrente = 0;     // calculo da corrente  void setup() {   Serial.begin(9600);   // Console 9600 Bps }  void LeituraV() {   for (int v = 0; v /span> bufferTam; v++)   // Carregando o Buffer V com as leituras   {     buffer[v] = analogRead(pinVT);      // Leitura no pino VT - tensao     delay(2);                           // Atraso para leitura analogica   } }  void LeituraI() {    for (int i = 0; i /span> bufferTam; i++)   // Carregando o Buffer I com as leituras   {     buffer[i] = analogRead(pinAT);      // Leitura no pino AT - corrente     delay(2);                           // Atraso para leitura analogica   }  }  void Filtro() {   LeituraV();   int novaleituraV;   static float Vfiltro = 0.0;   for (int v = 0; v /span> bufferTam; v++)   {     novaleituraV = buffer[v];     Vfiltro = (alpha * Vfiltro) + ((1 - alpha) * novaleituraV);   // Filtro Passa Baixa    }    Vint = Vfiltro;                                  // Converte valor float em inteiro   Tensao   =  Vint * voltsporUnidadeV * 5 ;        // Calculo da Tensao no Modulo MAX471  VOUT = VT x 5    LeituraI();   int novaleitura;   static float Ifiltro = 0.0;   for (int i = 0; i /span> bufferTam; i++)   {     novaleitura = buffer[i];     Ifiltro = (alpha * Ifiltro) + ((1 - alpha) * novaleitura);    // Filtro Passa Baixa   }   Iint = Ifiltro;                                   // Converte valor float em inteiro   Corrente =  Iint * voltsporUnidadeI ;             // calculo da Corrente no Modulo MAX471    Serial.print(" Tensao = " );                      // Display do valor da Tensao   Serial.print(Vint);   Serial.print(" =>  ");   Serial.print(Tensao, 3);   Serial.print(" V ");   Serial.print("   Corrente = " );                    // Display do valor da Corrente   Serial.print(Iint);   Serial.print(" =>  ");   Serial.print(Corrente, 3);   Serial.println(" A "); }  void loop() {   Filtro();   delay(200);   // Atraso para leitura na console } 

Resultados na console IDE Arduino  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A  Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A

Calibrando as medições de Corrente e Tensão do Módulo MAX471:

A tensão AREF, como já disse, é a referência de todas as medições do conversor ADC do Arduino. Meça a tensão no pino AREF do Arduino com um voltímetro preciso. Se ela estiver variando, indica que algum problema existe. Use uma fonte de boa qualidade, regulada e estabilizada para alimentar o Arduino. Use um capacitor de 10uF conectado do pino AREF(+)  ao terra(-).

Outra informação importante – Como o conversor ADC do Arduino tem 10 bits e a tensão do bit menos significativo é de aproximadamente 4,88 mV, as medições de miliVolts induzem alguns erros que podem ser desprezados.

Para que as medições fiquem precisas, é necessário a calibração dos seguintes valores :

  • voltsporUnidadeV = 0.004893      ( Tensão)
  • voltsporUnidadeI = 0.00502          (Corrente)

Esses valores devem ser diferentes um do outro, pois eles dependem da precisão dos resistores usados no módulo. Tentei unificar essas constantes no Sketch, mas não consegui valores precisos de medição.

Como conseguir obter esses valores ?

Rodando o meu programa de teste, veja nos resultados da console, que além dos valores de Tensão (em Volts) e Corrente (em Ampéres), inseri ao lado os valores decimais obtidos pelo conversor ADC .

Tensao = 493 => 12.061 V Corrente = 101 => 0.507 A

Meça com um voltímetro preciso, as tensões nos pinos VT e AT no módulo MAX471. No meu circuito :

Medição  VT = 2,412 V                  Valor Vint = 493 

voltsporUnidadeV =    VT  /   Valor Vint = 2,412V   / 493  = 0,00489249

Arredondei esse valor para   voltsporUnidadeV = 0.004893

Sabendo-se que VT é a quinta parte da Tensão de entrada do Módulo :

Tensao   =  Vint * voltsporUnidadeV * 5 ;

Medição AT = 0,507 A                Valor Iint = 101

voltsporUnidadeI = AT  /   Valor Iint  = 0,507A  / 101 = 0,005019

Arredondei esse valor para   voltsporUnidadeI = 0.00502

Corrente =  Iint * voltsporUnidadeI ;

Para chegar em medições precisas e confiáveis, sugiro que refaça a calibração com outros valores de tensão e corrente.

Espero que tenham gostado !