LOGO
 
 
Você está em: Documento => PIC: Medindo Corrente com ADC - Translate this page to English

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!
 
Site melhor visualizado em 1280x800 no Mozilla Firefox - Tempo de execução: 0.038646 segundos. -
 
 
Login
Registrar-se



Destrua a EnergyLabs!