Medindo Corrente com PIC 16F877A

 

       Bom, darei aqui uma explicação de como fazer um medidor de corrente com um PIC 16F877A (programando em C). Estarei usando como simulador o Proteus ISIS e como IDE o CCS C.

          Aqui está o circuito ao qual mediremos a corrente:

 

      Uma bateria de 12V ligada a uma lâmpada de 12V com 24 Ω de resistencia e seus respectivos medidores de tensão e corrente. Ligando esse circuito obtemos os valores de 0,5A (mais precisamente 496mA) e 12V na lâmpada.

     Para medirmos a corrente, é nescessario um shunt, que neste caso podemos usar um resistor de resistencia relativamente baixa, como 0,1Ω. Este resistor será colocado em série com a lâmpada, no polo negativo. Ao ligar obtemos os seguintes valores:

 

    49,6mV no resistor. Usando a Lei de Ohm como U = R * I podemos chegar a corrente:

49,6 * 10^-3 = 0,1 * I

49,6 * 10^-3 / 0,1 = I

496 * 10^-3 = I

I = 496 mA

 

Ok, na entrada analógica do microcontrolador PIC16F877A, há uma especificação de tensão maxima. No caso, é +Vcc a GND caso não seja acertada a referencia. Com Vcc = 5V e GND = 0 temos 5V de espaço, porém o valor 49,6mV é muito baixo para isto, logo nescessitaremos aumenta-lo com um Amplificador Operacional.

Com o modo Amplificador Inversor do amplificador operacional podemos facilmente multiplicar a tensão de entrada, no simular as tensões  de alimentação do amplificador operacional estão acertadas para +15V e -15V, muito mais altas do que o que nescessitamos.

Podemos calcular o Ganho de Tensão do amplificador operacional da seguinte maneira:

Vout =  - ( Vin * ( R2 / R1 ) )

Como a tensão maxima da entrada analógica do PIC sendo 5V, podemos multiplicar por 10 nesse primeiro estagio. Selecionamos os resistores R1 e R2  para 100Ω e 10kΩ respectivamente.

Porém assim, temos uma tensão negativa, não podendo ser usada para o PIC, e caso queiramos uma lampada de maior potência estaremos muito proximo do limite maximo do PIC (4,95V), então colocaremos outro amplificador operacional no modo inversor para dividir a tensão por 2.

Então a saida é 2,48V, metade da entrada do PIC, podendo assim usar uma lâmpada do dobro da potência. Então agora vamos descobrir a formula geral desse circuito para acharmos a corrente apartir da tensão de saida.

Para corrente I no resistor de 0,1Ω temos uma saida V temos: I = V / 0 , 1

Após isso, com amplificadores operacionais multiplicamos por 100 e dividimos por 2. Logo multiplicamos por 50. Logo Vout = Vin * 50.

Assim Vin = Vout / 50. Jogando isso na formula anterior temos:

I = Vout / 50 * 0,1

I = Vout / 5

Chegamos ai a formula final que precisaremos usar no programa do PIC para calcular a corrente apartir da tensão na entrada dele.

 

CCS C

 

Para a visualização dos valores recebidos pelo microcontrolador, estarei usando um LCD HD44780 (o mais comum) ligado a PORTD do PIC16F877A. No CCS C, o driver de LCD já está configurado para essa porta. O circuito para simulação será este:

Tudo acertado iremos começar o programa no CCS C então:

Iremos em Project Wizard e acertaremos as configurações como nas imagens abaixo:

Após tudo acertado, iremos para uma tela semelhante a essa:

O que configuramos foi o seguinte:

- O modelo pic para 16F877A

- O pic para rodar em 4Mhz

- O pic para usar Oscilador a Cristal

- O pic para usar Ponteiros de 16Bit para uso da Ram inteira.

Começaremos então colocando uma linha que incluirá o driver do LCD do CCS C e também variaveis que vamos usar no programa. Adicionaremos está linha abaixo do primeiro #include:

#include

long int valor;

float tensao;

Após feito isso, podemos começar a escrever o código, exatamente onde o CCS C deixou escrito // TODO: USER CODE!!

Começaremos com a inicialização do LCD e após isso faremos um programa de teste para escrever no LCD.

   lcd_init();
   lcd_putc("Teste do LCD!");
   while(true) {}

Aperte F9 para compilar o programa, e vamos agora configurar no ISIS para a simulação do programa compilado.

Clicaremos uma vez com botão direito, e uma  vez com botão esquerdo em cima do pic, e irá abrir uma janela igual a esta:

No campo marcado na imagem, selecione o arquivo compilado (nome_do_programa.hex) e após isso acerte o Processor Clock Frequency para 4Mhz:

Após feito isso podemos já simular e ver se deu certo. Clique no botão play na barra inferior do ISIS:

Hmm, muito bom! Funciona! Agora vamos a parte do conversor analógico-digital. Iremos escrever as seguintes linhas dentro do laço while ( dentro das chaves {  } )

      SET_ADC_CHANNEL(0);
   delay_ms(10);
   valor = READ_ADC(7);
   delay_ms(10);
   printf(lcd_putc,"\f Valor: %LU",valor);

Fazendo isso, acertar o canal de leitura do ADC para o 0 (primeiro), esperar 10ms, iniciar e ler (7), e colocar o conteudo na variável valor, esperar 10ms novamente, e depois mostrar o valor no lcd. Compile o programa, mas antes de rodar, é nescessário a ligação do sinal de saida do amplificador operacional no pino A0 do PIC.

Após ligado isso, podemos testar:

Certo, funcionou. Mas e esse valor 507? Bom, este seria o valor que o ADC forneceu. Para sabermos a tensão da entrada, precisamos saber de onde o ADC tirou isso. Antes falamos que a tensão que teriamos seria de 0V a 5V, e nas definições acertamos a precisão do ADC para 1024bit. logo temos 5 / 1024 V de precisão, ou seja, cada bit será equivalente a 5 / 1024 V.

5 / 1024 = 0.0048828125

Logo faremos o seguinte, multiplicaremos o valor que conseguimos por esse numero, assim teremos em volts a tensão na entrada do pic.

Ok, trocaremos as linhas dentro do laço while pelo seguinte:

   SET_ADC_CHANNEL(0);
   delay_ms(10);
   valor = READ_ADC(7);
   delay_ms(10);
   tensao = valor * 0.0048828125;
   printf(lcd_putc,"\f Tensao: %F",tensao);

Mesma coisa do que o anterior, apenas usando a float valor para casas depois da virgula. A saida da float será arredondada para 2 casas decimais. Compilando e rodando, temos:

Temos 2,47V, algo bem proxim dos 2,48V medidos com voltimetro. Ok, temos a tensão certinha, agora precisamos aplicar a fórmula dada la em cima. Porém, a corrente está abaixo de 1 Amper, logo podemos fazer a visualização em mA apenas multiplicando tudo por 1000. Faremos o seguinte então:

   SET_ADC_CHANNEL(0);
   delay_ms(10);
   valor = READ_ADC(7);
   delay_ms(10);
   tensao = valor * 0.0048828125 / 5 * 1000;
   printf(lcd_putc,"\f I: %FmA",tensao);

Divindindo a tensão que foi conseguida por 5 e multiplicando por 1000, compilando e rodando temos:

Temos 495,11mA, proximo dos 496mA medidos com Miliamperimetro. Para verificar a funcionalidade do circuito, alteremos a resistencia da lampada para 12 Ohms (em teoria, a corrente irá dobrar), no campo indicado, trocar 24 por 12

Testando:

Pronto =), tudo funcionando nos conformes. Simples não?

Quer uma sugestão para projeto de aprendizagem? Tente fazer um circuito que meça a potência na carga, medindo a tensão na carga e a corrente, e multiplicando as duas.

Código final:

 

Documento por: Lucas Teske

Licença Creative Commons
Esta obra de EnergyLabs Brasil, foi licenciada com uma Licença Creative Commons - Atribuição - Partilha nos Mesmos Termos 3.0 Não Adaptada.
Permissões adicionais ao âmbito desta licença podem estar disponíveis em http://www.energylabs.com.br.


Comente este conteúdo!





Você está em: Documento => - Translate this page to English