Medindo tensão AC com Transformador

Medindo tensão elétrica com Arduino e Transformador

Alguns projetos exigem que seja feita a medição de grandezas elétricas referentes a algum determinado aparelho ou circuito, visando assim monitorar suas condições de funcionamento, para assim prevenir alguma falha, ou mensurar seu consumo de energia. Neste tutorial, estaremos ensinando como realizar a medição da tensão alternada da rede elétrica utilizando um transformador 127/220 para 12 V em conjunto com um Arduino Uno. 

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Por que medimos tensão elétrica?

Em ambientes industriais, o monitoramento da tensão elétrica é de suma importância para o funcionamento da indústria, pois por meio da análise tanto da tensão quanto da corrente, é possível realizar manutenções preventivas e evitar que máquinas venham a sofrer algum tipo de danificação proveniente de sobrecarga ou outras possíveis causas de falha.

Imagem meramente ilustrativa

Visto o cenário atual, no qual muitos desejam automatizar suas casas controlando a iluminação, controlando o ar condicionado, dentre outros comandos, tudo pelo celular, ocorre-se a necessidade de se monitorar o consumo de energia, seja individualmente ou de maneira geral em sua residencial, e para isso faz-se necessário efetuar a leitura de grandezas elétricas como tensão e corrente, para assim poderem fazer os cálculos de consumo de potência elétrica e assim monitorarem seu consumo de energia.

Imagem meramente ilustrativa

Para acrescentar-lhe conhecimento a respeito da medição de corrente elétrica, citada como parte vital tanto de um sistema de automação industrial quanto residencial, recomendamos que vejam o tutorial relacionado ao sensor SCT-013 e ao módulo ACS712.

Transformador

O transformador é uma máquina elétrica capaz de reduzir e elevar tensões elétricas AC (corrente alternada) por meio da indução eletromagnética. Existem diversos modelos de transformadores, de modo que, o que utilizaremos neste tutorial é semelhante ao representado logo abaixo.

Exemplo de um transformador
Exemplo de um transformador

O transformador em questão é empregado em sistemas elétricos AC, pois depende da variação constante do valor da corrente para que, por meio da indução, ele possa rebaixar ou elevar os valores de tensão.

A vantagem do transformador comparado aos outros métodos consiste no motivo que por meio dele podemos fazer com que o arduino "veja" a forma de onda senoidal que deverá ser medida, possibilitando não só o cálculo do valor RMS da tensão como também permite análises mais profundas a respeito da forma de onda da tensão.

Esse tutorial envolve conceitos de eletricidade e programação que serão explicados no  no tópico Entendendo a fundo.


Mãos à obra - Medindo a Tensão Elétrica AC da Rede com transformador

Neste projeto, iremos monitorar o valor de tensão de um equipamento, podendo assim perceber se ele está ligado ou desligado. 

Componentes necessários

Montando o projeto

Primeiro é necessário identificar quais fios do transformador devem ser conectados à fonte de tensão. Esta informação normalmente está contida no próprio transformador. Caso não seja possível distinguir quais fios são do primário e quais são do secundário, basta ver qual lado possui a mesma cor de fios para todos, pois, o lado que possuir essa característica corresponderá ao secundário do transformador.

Indicação do lado secundário do transformador
Indicação do lado secundário do transformador

Após identificar os fios, é necessário conectá-los em PARALELO com a fonte de tensão a ser monitorada.

Agora é necessário montar o seguinte circuito na protoboard para que o arduino possa ler os valores de tensão da saída do transformador.

Esquema para montagem prática do projeto para medição de tensão AC com transformador e Arduino Uno
Esquema para montagem prática do projeto para medição de tensão AC com transformador e Arduino Uno

Feito isso, só nos resta programar o arduino para que ele possa interpretar os valores que serão lidos em sua porta analógica.

Programando

Com o arduino conectado ao computador, faça upload do seguinte programa:

void setup() {
  
  Serial.begin(115200);  

  ADCSRA = 0;
  ADCSRB = 0;

  ADMUX |= (0 & 0b0000);

  ADMUX |= (1 << REFS0);
  ADMUX |= (1 << ADLAR);

  ADCSRA |= (1 << ADPS2);

  ADCSRA |= (1 << ADEN);
  ADCSRA |= (1 << ADSC);

}

void loop() {

  float amostras[200];          // Variável criada para armazenar as amostras lidas pelo arduino
  float tensaoPROTO[200];       // Utilizada para armazenar os valores correspondentes a tensão na protoboard
  float tensaoREAL[200];        // Valores reais de tensão
  
  int i;
  float soma = 0;

  float tensaoRMS;

  for(i = 0; i < 200; i++)
  {
    amostras[i] = analogRead(A0);
    delayMicroseconds(63);
  }
  
  for(i = 0; i < 200; i++)
  {
    tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;
    
    tensaoREAL[i] = tensaoPROTO[i] * 221.73;

    tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];
    soma = tensaoREAL[i] + soma;
  }

  tensaoRMS = soma / 200;
  tensaoRMS = sqrt(tensaoRMS);
  
  Serial.print("Tensao: ");
  Serial.println(tensaoRMS);

  Serial.println("");
}

Com porta e placa selecionados corretamente, basta realizar o upload código.

Colocando pra funcionar

Montagem e programação concluídos, só nos resta conectar o aparelho a ser monitorado na tomada.

ATENÇÃO: Cuidado ao realizar este projeto, pois você estará trabalhando diretamente com energia elétrica.

O resultado pode ser conferido logo abaixo:

Vista superior da montagem prática
Vista superior da montagem prática

 

Montagem prática na protoboard
Montagem prática na protoboard

 

Informações apresentadas no monitor serial

Entendendo a fundo - Hardware

Conceitos básicos de Eletricidade e Eletromagnetismo

Para esse conteúdo é importante que o leitor entenda alguns conceitos de Eletricidade Básica e Electromagnetismo.

- Corrente Alternada

É uma corrente elétrica no qual seu valor varia com o tempo, mudando seu sentido constantemente. Sua forma de onda muitas vezes se assemelha a uma senoide, como podemos ver na imagem logo abaixo.

Corrente Alternada
Corrente Alternada

- Lei de Ampère

Segundo esta lei, todo condutor percorrido por corrente elétrica variante no tempo faz surgir em seu entorno um campo magnético variante proporcional ao valor da corrente elétrica. A lei em questão estabelece uma relação matemática entre o campo magnético, a corrente elétrica e a distância do condutor. A equação pode ser vista logo abaixo:

B = ( μ × i ) ÷ ( 2π × R )

É possível descobrir o sentido das linhas de campo geradas pela corrente elétrica variante no condutor seguindo a Regra da Mão Direita, no qual o polegar da mão direita indica o sentido da corrente, e os outros dedos indicam o sentido das linhas de campo. Isso pode ser melhor entendido com a imagem logo abaixo.

Ilustração da Regra da Mão Direita

- Lei de Faraday

A Lei de Faraday estabelece uma relação entre a variação do fluxo magnético e a força eletromotriz induzida em uma espira. Do mesmo modo que a corrente elétrica variante faz surgir um campo magnético variante, ocorre o mesmo quando expomos um condutor a uma variação de campo magnético.

Lei de Faraday
Lei de Faraday

Como observado logo acima, surge uma diferença de potencial entre os terminais da bobina conforme ocorra a variação do campo magnético (movimentação do imã).

Entendendo o Transformador

- Transformador 127/220 para 12V

O transformador em questão é composto de duas partes principais: o enrolamento e o núcleo. O enrolamento consiste em várias bobinas que serão responsáveis por realizar a indução eletromagnética. O núcleo é por onde as linhas de campo provenientes das bobinas transitam, onde normalmente é constituído por um material ferromagnético.

Esquemático do funcionamento de um trasnformador
Esquemático do funcionamento de um trasnformador

Quando conectamos em sua bobina primária (linhas vermelhas) uma tensão elétrica, pela Lei de Faraday, surge um campo magnético, no qual suas linhas de campo passarão pelo material ferromagnético (estrutura cinza), e induzirá uma corrente na bobina secundária (linhas azuis), fazendo surgir uma diferença de potencial entre seus terminais.

Representação das linhas de campo em um transformador
Representação das linhas de campo em um transformador

- Circuito do medidor de tensão

Neste tópico iremos explicar os detalhes que compõem o circuito proposto nesse tutorial.

Primeiramente temos um circuito divisor de tensão entre os terminais do transformador, que tem por objetivo diminuir o valor de pico da tensão de saída para que o arduino possa ler os valores de tensão. Abaixo é possível ver o diagrama que indica o circuito divisor de tensão.

Circuito divisor de tensão

Com este divisor de tensão, as formas de onda encontradas em cada resistor serão as seguintes:

Formas de onda em cada resistor

Utilizando a Lei de Ohm, podemos também calcular os valores de pico de tensão nos resistores, levando em conta que o secundário do transformador possua uma tensão de saída de 12V. Fazendo os cálculos, descobriremos o seguinte.

V = R × I

12 = 21000 × I

I = 12 ÷ 21000

I = 0,57 mA

Com isso, descobrimos que a corrente do circuito equivale a 0,57 mA. Com este valor, podemos descobrir a queda de tensão sobre o resistor R3.

V = 1000 × 0,00057

V = 0,57 V

Precisamos transformar esse valor, que corresponde ao rms, em valor de pico. Para isso, multiplicaremos o resultado anterior por √2.

V = 0,57 × √2

V = 0,81 V ou 810 mV

Sabemos agora que o valor de pico, ou seja, o valor mais alto que a tensão sobre esse resistor atinge, é de 800 mV.

Necessitamos agora de um circuito que irá adicionar uma tensão de offset sobre esse resistor, para que o arduino também possa ler os valores que correspondem ao semiciclo negativo da forma de onda, visto que se conectarmos esse resistor diretamente nele, o arduino não conseguirá ler esses valores negativos. Para isso, foi montado um segundo divisor de tensão, no qual utiliza a alimentação do arduino (5V e GND) para gerar o valor de tensão DC que será adicionado a forma de onda do resistor R3. O circuito equivalente a este divisor pode ser visualizado logo abaixo.

Divisor de tensão para offset

Com o acréscimo de uma tensão de offset na forma de onda presente no resistor R3, teremos o seguinte resultado:

Forma de onda resultante

O esquemático do circuito final pode ser visualizado logo abaixo.

Esquemático do circuito apresentado neste tutorial

 


Entendendo a fundo - Software

Será abordado neste tópico os detalhes sobre cada linha de programação, vista na seção Mãos à obra

Abaixo está o diagrama geral informando como ocorre o processo de conversão dos valores analógicos para digitais, visto que ele será necessário para a explicação dos registradores. Durante as explicações, serão apresentados partes específicas desse diagrama. Ele também poderá ser consultado indo diretamente ao datasheet do microcontrolador ATmega328p.

Diagrama de blocos representando a operação de conversão analógica para digital

- ADMUX

ADMUX é um registrador composto por 8 bits no qual ele contém a tensão de referência a ser utilizada para a leitura dos terminais analógicos e qual terminal será utilizado para as leituras. Abaixo está a tabela que informa os bits correspondentes a cada informação do registrador.

Tabela geral das informações que compõem o byte ADMUX
  • MUX3...0

Os primeiros 4 bits correspondem ao pino responsável pela leitura analógica. Abaixo está a tabela com as informações referentes para setar o pino desejado.

Tabela referente aos pinos e sua representação binária no registrador ADMUX

Pelo diagrama abaixo vemos que os bits relacionados a seleção dos pinos de entrada são conectados a um decodificador, no qual sua saída é conectada ao multiplexador, onde os terminais A0...A5 estão conectados nas entradas desse multiplexador.

Diagrama relacionado aos pinos de leitura analógica

- REFS1 e REFS0

Os dois bits mais significativos (7º e o 6º bit) corresponde a tensão de referência que deverá ser utilizada para a leitura do valor analógico. Assim como anteriormente, o datasheet do ATmega328p apresenta uma tabela para auxiliar a configuração desta informação.

Tabela referente a seleção da tensão de referência

O padrão é utilizar AREF, no qual não conectamos nada ao terminal.

Pelo diagrama abaixo podemos entender melhor o funcionamento a respeito do 6º e 7º bit do ADMUX, para a seleção da tensão de referência.

Diagrama relacionado ao 6º e 7º bit

O bit REFS1 é conectado ao multiplexador, no qual esse bit definirá qual entrada será direcionada a saída. Se o REFS1 seja 0, a saída será o AVCC, mas  se o bit for 1, será a tensão interna de referência 1,1V. Já o bit REFS0 é responsável por controlar a conexão entre a saída do multiplexador acima e o AREF, onde caso seja esse bit seja 0, não haverá conexão, mas caso seja 1, haverá conexão entre eles.

- ADLAR

O bit referente ao ADLAR é responsável pela configuração da forma de exibição dos resultados (/da conversão feita pelo ADC) no Registrador de Dados ADC. Setando ele em 1, o resultado será alinhado a esquerda, e setando 0, se alinhará a direita. Ele é composto por dois registradores, chamados: Registrador de Dados ADC Low e High. Abaixo está o diagrama com sua localização na operação de conversão. Veja que abaixo do nome principal do registrador está entre parênteses os nomes ADCH e ADCL, que correspondem a siglas correspondentes de Low (ADCL) e High (ADCH).

obs: o registrador principal do Registrador de Dados ADC possui 16 bits, pois se trata da união dos dois registradores.

Diagrama referente ao registrador ADC Data Register

- ADCL

ADCL corresponde ao registrador localizado a direita do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCL quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCL quando setado em 1

- ADCH

ADCH corresponde ao registrador localizado a esquerda do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCH quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCH quando setado em 1

Os valores ADC9...ADC0 equivalem aos bits resultantes da conversão AD realizada anteriormente.

Processo de conversão

O ADC irá gerar um resultado de 10 bits que será apresentado nos Registradores de Dados ADC, ADCH e ADCL. Dependendo do valor de ADLAR, o resultado será apresentado a esquerda ou a direita. Caso o resultado seja ajustado a direita e apresente 8 bits, basta ler o valor presente no registrador ADCH. Caso contrário, o ADCL deverá ser lido primeiro, e logo após o ADCH, pois após a sua leitura, não será possível modificar os valores desses registradores. Já quando é efetuada a leitura no registrador ADCH, o acesso para modificação é reativado. Com isso, pode ocorrer as seguinte situações:

  • Efetuar a leitura do ADCL, e ocorrer uma conversão antes do registrador ADCH ser lido, tanto os dados desse registrador quanto os novos valores que foram convertidos serão perdidos;
  • Caso seja feita uma inversão na ordem de leitura dos registradores (ler ADCH antes de ADCL), após efetuar a leitura de ADCL, o acesso aos valores serão bloqueados e nenhuma alteração poderá ser feita, perdendo com isso os dados de conversões futuras.

ADCSRA e ADCSRB

Os registradores ADCSRA e ADCSRB são responsáveis pelo processo de conversão analógica para digital no arduino. ADCSR é a sigla do termo inglês ADC (Analog Digital Converter) Control and Status Register (Registrador de Status e Controle ADC), no qual o microcontrolador do arduino apresenta dois, A e B.

O ADCSRA é composto pelos seguintes bits:

Byte referente ao registrador ADCSRA

Os bits que compõem o byte do registrador ADCSRA são:

  • ADEN: ativa o sistema ADC. É necessário estar setado em 1 para que o processo de conversão ocorra. Quando o processo se encerra, ele retornará ao valor 0.
  • ADSC: quando 1 ele inicia o processo de conversão, já quando for 0, encerra-se o processo.
  • ADATE: é utilizado para configurar o trigger do arduino. Caso seja setado em 1, o auto trigger do conversor AD é habilitado.
  • ADIF: Este bit é definido quando uma conversão de ADC é concluída e os registros de dados são atualizados.
  • ADIE: Quando esse bit é gravado em um e o bit 1 em SREG é definido, a interrupção completa de conversão do ADC é ativada.
  • ADPS2...0: Esses bits determinam o fator de divisão entre a freqüência do clock do sistema e o clock de entrada para o ADC.

É necessário manipular diretamente os registradores no void setup() pois desse modo o arduino conseguirá fazer um maior número de leituras durante o tempo de 16,66 ms (equivalente a um período da frequência de 60 Hz da rede elétrica).

Até aqui poderia ir para outro tutorial


- Iniciando a comunicação serial

É iniciado uma comunicação serial com baud rate de 115200. Caso você não conheça bem os recursos da comunicação serial, recomendamos que veja o tutorial Comunicação Serial Arduino.

Serial.begin(115200);

- Limpando registradores

É atribuído o valor 0 aos registradores ADCSRA e ADCSRB:

ADCSRA = 0;
ADCSRB = 0;

- Setando o pino de entrada analógica

É definido o pino A0 como INPUT, assim como a tensão de referência:

ADMUX |= (0 & 0b0000);
ADMUX |= (1 << REFS0);

- Configurando a forma de exibição

Alinha o valor ADC a esquerda, para que seja lido somente os 8 bits mais significativos do registrador ADCH:

ADMUX |= (1 << ADLAR);

- Determinando o fator de divisão

É determinado o fator de divisão entre o clock do sistema e a entrada de clock do ADC. Neste caso, como ADPS0 e ADPS1 estão em estado lógico 0, e o ADPS2 é setado com estado lógico 1, o valor do fator de divisão será 16.

ADCSRA |= (1 << ADPS2);

- Ativação do conversor ADC

O conversor ADC presente no arduino é habilitado:

ADCSRA |= (1 << ADEN);

- Iniciando as medições ADC

É iniciado as medições ADC:

ADCSRA |= (1 << ADSC);

- Criando variáveis locais para o código

São criados vetores que serão responsáveis por armazenar o valor bruto lido, e de mesmo modo, os valores convertidos e tratados. Foi criado vetores com 200 pontos pois estes já serão suficientes para que seja realizado o cálculo do valor quadrático médio da tensão.

float amostras[200];
float tensaoPROTO[200];
float tensaoREAL[200];

Também são criados outras variáveis auxiliares e a variável em que será armazenado o valor final.

int i;
float soma = 0;
 
float tensaoRMS;

- Captação dos valores instantâneos da tensão

É realizado um laço for para realizar a leitura das 200 amostras que serão lidas pelo pino analógico A0. O delay foi utilizada para que ao final da leitura das 200 amostras, o tempo gasto fosse próximo dos 16,66 ms, que equivale ao tempo de duração de um ciclo da senoide de 60 Hz.

for(i = 0; i < 200; i++)
{
  amostras[i] = analogRead(A0);
  delayMicroseconds(63);
}

- Tratamento dos valores armazenados na variável "amostra[200]"

Da mesma maneira que o tópico anterior, é realizado um laço for para que seja feito o tratamento em todos os 200 valores armazenados na variável amostra, para que sejam utilizados após isso no processo de encontro do valor quadrático médio.

for(i = 0; i < 200; i++)
{
  tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;
  
  tensaoREAL[i] = tensaoPROTO[i] * 221.73;

  tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];
  soma = tensaoREAL[i] + soma;
}

De início, é feito a conversão de número decimal binário para o valor real de tensão de 0 à 5V, multiplicando-o por 0,004882812, que equivale a 5 dividido por 1024.Após isso, é necessário subtrair este valor por 2,5, que equivale ao valor da tensão de offset que foi adicionado propositalmente para que o arduino pudesse ler os semiciclos negativos da forma de onda da tensão.

tensaoPROTO[i] = (amostras[i] * 0.004882812) - 2.5;

O próximo passo consiste em realizar um cálculo que corresponde a proporção dos valores na protoboard com os valores reais da tensão elétrica.

Como foi explicado anteriormente, o valor de pico que o resistor R3 terá será de 0,81 mV, e isso nos quer dizer que quando a tensão sobre o primário do transformador for de 127 V, o valor de pico sobre o resistor R3 será de 0,81 mV. Com esta informação, podemos traçar uma regra de três que fará a proporção conforme ocorra variação dos valores instantâneos colhidos pelo pino A0, já que a proporção entre os valores de pico será a mesma para todas as outras amostras. Desse modo, é realizado o seguinte cálculo:

(127 × √2)     -     0,81 mV

                                            x     -     valor da amostra lida

Realizando a multiplicação em forma de x, podemos ver que o valor da amostra lida será multiplicado pela divisão de 179,60 (127 × √2) por 0,00081. Realizando essa divisão, teremos o seguinte valor:

(127 × √2) ÷ 0,00081

221,73

Logo, para convertermos o valor correspondente a tensão sobre o resistor R3 para a tensão equivalente no transformador, basta multiplicarmos esse valor por 221,73, e é isso que o código faz, como mostrado logo abaixo.

tensaoREAL[i] = tensaoPROTO[i] * 221.73;

Concluído esse processo, o cálculo que deve ser realizado agora corresponde a raiz da média quadrática, no qual sua fórmula pode ser visualizada logo abaixo.

Fórmula da raiz média quadrática

Com isso, a primeira coisa a ser feita é a elevação ao quadrado de cada termo dentro do vetor, no qual esse processo pode ser visualizado abaixo.

tensaoREAL[i] = tensaoREAL[i] * tensaoREAL[i];

Após isso é necessário realizar a soma de todos os termos presentes no vetor, e para isso foi realizado o seguinte comando:

soma = tensaoREAL[i] + soma;

E com isso terminamos o último laço for do código.

- Descobrindo o valor RMS

Dando prosseguimento ao processo citado no tópico anterior, é necessário dividir a soma de todos os termos pelo número de termos (que equivale a 200, o número total de amostras presente no vetor) e realizar a raiz quadrada dessa divisão. O comando sqrt() é responsável por efetuar o cálculo da raiz quadrada na programação de arduino.

tensaoRMS = soma / 200;
tensaoRMS = sqrt(tensaoRMS);

- Mostrando no monitor serial

É realizado o print do valor RMS da tensão no monitor serial.

Serial.print("Tensao: ");
Serial.println(tensaoRMS);
 
Serial.println("");

E com isso, encerramos as explicações a respeito do hardware e software deste tutorial.


Considerações finais

Esperamos que este tutorial tenha lhe acrescentado conhecimento tanto na área da eletrônica assim como na área de programação.

Obrigado pela atenção e continuem buscando conhecimento no portal Vida de Silício.