INA3221: Um sensor de tensão e corrente DC com 3 canais!
Olá caro(a) leitor(a)! Hoje vamos explorar e entender o Módulo Sensor de Tensão e Corrente DC 3 Canais INA3221, um componente que mede tensão e corrente DC com 3 canais e comunicação I2C! Esse tipo de módulo é bastante utilizado para verificação e controle de consumo de itens como motores, lâmpadas ou mesmo circuitos inteiros, em tempo real. Ele verifica a tensão e mede a corrente indiretamente, utilizando Resistores Shunt com resistência conhecida, presentes na PCB para realizar o cálculo:
I = U/R
Além disso, o módulo INA3221 também tem algumas outras funções, como alertas, mas não se assuste, pois existem bibliotecas muito úteis que irão nos ajudar a utilizar todas essas funcionalidades corretamente! Porém, antes de entrar nesse tema, precisamos falar sobre as…
Principais Características do Módulo INA3221:
Imagem 1 – Módulo Sensor de Tensão e Corrente DC 3 Canais INA3221
Primeiramente, as especificações técnicas do Módulo são as seguintes:
- Tensão de alimentação: 2,7V a 5,5V;
- Consumo de energia: 350µA;
- Tensão de leitura: 0 a 26V;
- Temperatura de trabalho: -40°C a 125°C;
- Interfaces: I2C e SMBus;
- Quantidade de canais: 3;
- Dimensões: 38 mm x 32mm.
Limitações:
Os lado positivo dos 3 canais do INA3221 são conectados entre si, portanto, eles terão a mesma tensão, devido a isso, se você quiser medir 3 itens, faz mais sentido utilizar uma única fonte para todos.
Sabendo dessas informações, podemos explorar mais as funções desse módulo, vamos mostrar um circuito e código básico que utilizam um Arduino e o INA3221 para medir a tensão, corrente, e calcular a potência de 1 motor DC sendo alimentado por uma fonte 5V, e após isso, vamos abordar os pinos de aviso e o qual o significado deles.
Então Vamos ao Trabalho!
Inicialmente, é importante notarmos que o INA3221 possui 4 endereços I2C disponíveis, e para começarmos a utilizá-lo, precisamos selecionar um deles! Mas como fazer isso ?
Precisamos conectar o pino A0 (que existe justamente para definir o endereço) a algumas dessas 4 opções:
Imagem 2 – Endereços I2C e conexões correspondentes
OBS: Note que a ordem listada não está igual à ordem na PCB, mas sim em ordem crescente dos endereços.
A parte da PCB mostrada na imagem serve justamente para facilitar essas conexões, com o A0 à esquerda e os outros pinos à direita, portanto basta aplicar um pouco de solda em um desses terminais indicados, no nosso caso, escolhemos o 0x40, portanto basta soldar o A0 ao GND, no pino mais abaixo, na ordem da imagem. Caso você escolha outro endereço, basta corrigir o código aqui fornecido, mas chegaremos nisso em breve…
Hora de Ver o Circuito!
Separamos o circuito em 2 partes para facilitar a visualização e entendimento, logo em seguida vamos mostrá-lo por completo. Portanto vamos iniciar com as ligações entre o INA3221 e um Arduino
Imagem 3 – Esquemático das conexões entre o INA3221 e o Arduino
Imagem 4 – Resumo das conexões entre o INA3221 e o Arduino
OBS* As conexões VPU e os GND’s que ficam próximos a ele na placa não são necessárias nessa aplicação, eles servem para alimentar os pinos de aviso, que são opcionais e serão abordados em breve
Agora vamos ver as ligações do INA3221 com o objeto em que desejamos realizar as medições e a fonte do mesmo.
Imagem 5 – Esquemático das conexões entre o INA3221 e a carga
Selecionamos um dos 3 canais do INA3221, cada canal tem um polo positivo (à direita) e um negativo (à esquerda), você pode se perguntar o motivo desses canais estarem em série com o circuito, visto que medidas de tensão são feitas em paralelo, mas na realidade, o polo positivo já realiza a medição de tensão, com base no GND do INA3221, de fato, em paralelo. Enquanto isso, a corrente passa pelo Resistor Shunt em série para realizar o cálculo de tensão previamente mencionado, finalmente saindo pelo polo negativo do canal!
Imagem 6 – Esquemático do Circuito completo com o INA3221 e Arduino
Finalmente chegamos no circuito completo! nosso próximo passo é falar sobre o código utilizado para essa aplicação.
Código base utilizado e considerações
#include "Adafruit_INA3221.h" #include <Wire.h> // Cria o objeto INA3221 Adafruit_INA3221 ina3221; void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("Iniciando medição..."); // Inicia o INA3221 if (!ina3221.begin(0x40, &Wire)) { // A0 conectado ao GND Serial.println("chip INA3221 não encontrado"); while (1) delay(10); } Serial.println("INA3221 encontrado!"); ina3221.setAveragingMode(INA3221_AVG_16_SAMPLES); // Define resistores Shunt como 0.1 ohms for (uint8_t i = 0; i < 3; i++) { ina3221.setShuntResistance(i, 0.1); } } void loop() { // Mostra tensão e corrente dos 3 canais, com 2 algarismos pós-vírgula for (uint8_t i = 0; i < 3; i++) { float voltage = ina3221.getBusVoltage(i); float current = ina3221.getCurrentAmps(i) * 1000; // Converte para mA Serial.print("Canal "); Serial.print(i+1); Serial.print(": Tensão = "); Serial.print(voltage, 2); Serial.print(" V, Corrente = "); Serial.print(current, 2); Serial.print(" mA, Potência "); Serial.print(voltage * current / 1000); Serial.println(" W"); } Serial.println(); delay(250); }
Considerações:
- O código utiliza a biblioteca Adafruit INA3221 Library, presente no Arduino IDE, basta acessar Tools (no menu superior) -> Manage Libraries, escrever o nome da biblioteca no campo de pesquisa e instalar
- Na linha num. 15, nós definimos o endereço I2C selecionado, é preciso alterar essa linha caso você conecte o A0 a outro pino diferente do GND, caso contrário, o Arduino não irá reconhecer o INA3221.
- Na linha num. 26, inserimos o valor dos Resistores Shunt, nesse caso, 0.1 Ohm, alguns módulos vêm com valores diferentes. Esse valor é indicado no próprio Resistor, “R100”, onde o R representa o início das casas decimais
- Esse código mostra os valores para os 3 canais para servir de base, mas caso você queira utilizar apenas 1 deles, basta alterá-lo, substituindo por um dos exemplos abaixo:
float voltage = ina3221.getBusVoltage(0) //Canal 1 float voltage = ina3221.getBusVoltage(1) //Canal 2 float voltage = ina3221.getBusVoltage(2) //Canal 3
Agora veja o funcionamento do INA3221!
Vídeo 1 – Funcionamento do INA3221
Bom, esses conceitos já são suficientes para utilizar o INA3221 em várias situações, mas se você achou que nesse circuito já tem fios demais, saiba que ainda não acabou! Pois agora ainda vamos falar sobre os…
Pinos de Aviso!
Imagem 7 – Pinos de Aviso do INA3221
Resolvemos abordar a funcionalidade desses pinos separadamente, pois na maioria dos casos eles não são essenciais, e também para facilitar a explicação. Eles servem, no geral para acionar alertas e medidas de segurança, mas nenhum deles vai interromper o funcionamento do dispositivo, servindo exclusivamente para sinalizar essas condições adversas, tanto para o usuário, quanto para sistemas externos de proteção do circuito. Você pode ligar todos eles em portas digitais da sua escolha no Arduino, em seguida vamos falar sobre cada um deles:
OBS* As funções apresentadas a seguir, são parte da biblioteca que usamos no projeto, a Adafruit INA3221 Library.
PV – Power Value
Esse pino nos permite definir uma faixa de tensão na carga medida, somente se o valor medido não pertencer a essa faixa, o pino PV entrará em estado LOW, para definir esse intervalo, basta usar essa função:
//Definir limite inferior e superior para PV ina3221.setPowerValidLimits(3.0 /* limite inferior */, 15.0 /* limite superior */);
CRI – Critical Limit Alert
O CRI avisa quando a corrente medida superou um limite crítico, assumindo o nível lógico LOW. É possível selecionar diferentes valores pra cada um dos canais e também descobrir qual valor está atualmente selecionado, para isso, podemos usar essas funções a seguir:
//Selecionar corrente limite de um canal específico ina3221.setCriticalAlertThreshold(0 /* Canal */, 0.325 /* Corrente em Amperes */); //Descobrir qual corrente limite está definida para um canal específico ina3221.getCriticalAlertThreshold(0 /* Canal */)
WAR – Warning
Funciona de forma muito parecida com o CRI, mas serve apenas como um alerta, adotando um nível lógico LOW para níveis de corrente que não sejam críticos, mas ainda sim ultrapassem certo limite de atenção, abaixo as funções para definir esse limite:
//Selecionar corrente limite de um canal específico ina3221.setWarningAlertThreshold(0 /*canal */, 0.325 /* limite em Amperes*/); //Descobrir qual a corrente limite está definida para um canal específico ina3221.setWarningAlertThreshold(0 /* canal */);
TC – Time Control
Esse pino serve para avisar quando a coleta e conversão de dados foi finalizada, também assumindo valor LOW quando isso acontece, podemos utilizar esse pino para garantir que o Arduino espere os dados ficarem prontos para realizar a leitura de forma correta. Devido a isso, não há uma função na biblioteca para lidar com ele, pois basta verificar seu estado lógico.
E finalmente…
O INA3221 é um chip muito versátil, além dos aspectos mencionados, também tem outras possibilidades, como realizar mais de uma medição e enviar a média para o Arduino e etc. Porém não vamos explorar essas capacidades nesse texto, pois são mais específicas. Eis aqui o datasheet do INA3221 em inglês, para os curiosos que querem se aprofundar nesse componente.
Visto isso, encerramos nosso artigo por aqui, muito obrigado pela atenção! Aproveite a seção de comentários para enviar quaisquer dúvidas ou considerações 🙂
Aproveite para ler outros artigos sobre eletrônica e robótica no nosso blog.