Página 1 de 8

Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 11:11
por carlucio
Galera,

Queria medir tensão e corrente alternada com o pic, configurações ou modulos para esse fim?

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 12:01
por andre_luis
Pra refinar um pouco os requisitos...

  • Que familia de PIC, 16F, 18F, ... ?
  • Que compilador ?
  • Tensão AC retificada ou RMS ?

Serve qualquer uma dessas opções ?

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 12:10
por carlucio
Esqueci dos dados basicos:

Pic16f876A
Compilador CCS-C
Qual a diferença da ac retificada com rms? Eu quero no caso a mesma que um multimetro apresenta.


O projeto basico que quero desenvolver é acompanhar o tensão recebida e o consumo de corrente geral e/ou individual de equipamentos da minha casa. Isso devido a constantes falhas eletricas na minha regiao quando chove e o transformador operando com 2 fases fazendo a tensão da mesma ficar em torno de 130 a 170 volts. Quero criar um sistema de proteção por ramal no Quadro de distribuição e no caso da corrente fazer acompanhamento de determinados equipamentos (ex: chuveiro).

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 13:49
por xultz
A tensão que o medidor de energia mede é RMS. Existem dois tipos de medição RMS: a certa e a errada. A errada mede a tensão de pico da senóide, multiplica por 0,707 e diz que é RMS. Se a senóide for perfeita, o cálculo fica perfeito. Para medir tensão, é uma aproximação razoável. Prá medir corrente, pode esquecer, porque as cargas raramente são lineares, e a corrente raramente é uma senóide.
A forma correta de medir RMS precisa de um integrador. Isso porque a fórmula do cáculo de RMS é:
Imagem
Parece complicado, mas é só um pouco. Na prática, substitua o dt por um período de tempo bem curto, tipo o período que o A/D do microcontrolador precisa prá fazer uma conversão. O f na fórmula é aquilo que você está medindo, no teu caso uma tensão em volts ou uma corrente em amperes. E T é o período de tempo em segundos do ciclo da rede, no nosso caso, 1/60 s. Assim, durante um ciclo, você fica convertendo, elevando ao quadrado, multiplica pelo período de tempo da conversão, e soma tudo. Quando o ciclo da rede termina, multiplica por 1/60, e tira a raiz quadrado. Um PIC pede prá sair nessa hora, tendo que fazer tanto cálculo, ele não foi feito prá isso.
O último medidor de energia que projetei, usei um ADE7763, que basicamente tem circuito de conformação de sinal, conversor A/D, e bloco de cálculo de RMS prá tensão, corrente, fator de potência, etc, e sai tudo mastigadinho prontinho pela porta SPI. Um doce.

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 14:19
por carlucio
caro xultz

Esse componete e usado em conjunto com o pic?

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 15:06
por xultz
Pode ser usado, sim.

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 15:27
por menegola
Poxa meu!!!
Que componente paulada.
Que super datashtees

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 16:24
por ze
opção de pobre...há séculos (pra vc ter uma ideia, consultei livros) fiz um medidor de corrente medindo a tensão que fica nuns 10cm de um fio de cobre mais ou menos da grossura de um lápis. Era +- assim: um trafinho isolador 1:1 que na verdade era aquele indutor de filtro de linha que fica na entrada ac: um lado nos 10cm. o outro num ampop que dava um ganhozinho e depois passava por um retificador ideal com ampop também formando um condiocionadorzinho meiaboca básico. Apesar de pobre, deu precisão e linearidade aceitáveis até uns 60A e atendeu a proposta do projeto.
Um pouco menos antigo é outro projeto onde meço uma corrente toda distorcida. Quase estudei as fórmulas e quase coloquei num pic em uma ou duas semanas. Alguns (muitos) fios de cabelos pretos a menos depois, concluí que bastava um capacitor 10uF pra fazer a média pra mim deixando a tensão (corrente) lizinha dando menos trabalho pro avr (não pic). Bom, pelo menos o valor ficou = ao do multímetro do cliente e fiz a média com ele
Mas os tempos mudaram... vá de ci especialista mesmo

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 17:17
por edsont
Aqui tem um projeto de analisador de carga AC, só que usa um LPC e não PIC.
http://elm-chan.org/works/heco/report_e.html

Tem alguns poucos erros de inglês.

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 05 Jan 2015 21:19
por nagkiller
Experimente as aulas desse cara!!!

https://www.youtube.com/watch?v=JXuSAsC ... 7&index=10

Flw...

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 06 Jan 2015 15:25
por carlucio
Eu tenho ate um codigo que poderia ser utilizado mas o processo em si não sei se é o melhor. A respeito do componente ADE7763 e não consegui encontrar um exemplo com pic. Preciso de orientação para saber a maneira mas facil e eficiente de se fazer a leitura do tensão e no caso da corrente o compontente acs712 de 30A não serviria para medir a corrente de forma constante?

O codigo abaixo:

Código: Selecionar todos

#include <16F876A.h>
#device adc=10
#use delay(clock=4000000)
#fuses xt,nolvp,nowdt

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                          Definição de Saídas                            *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#define  RS    PIN_B0    // Pino de seleção de modo do display
#define  EN    PIN_B1    // Pino de habilitação do display
#define  D7    PIN_B5    // Pino de dados 7
#define  D6    PIN_B4    // Pino de dados 6
#define  D5    PIN_B3    // Pino de dados 5
#define  D4    PIN_B2    // Pino de dados 4

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                       Prototipagem de Funções                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void inicializa_lcd(void);
void lcd_inst4(unsigned char dado);
void lcd_inst(unsigned char dado);
void lcd_dado(char dado);

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                       Bloco Principal de Programa                       *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 void main(void)
 {     
           
      inicializa_lcd();                       //Chama função de inicialização lcd     
     
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //Frequência Externa
                                              //Prescaler 1:1           
      setup_adc(ADC_CLOCK_DIV_8);              // Configura clock da conversão
      setup_adc_ports(RA0_ANALOG);     // Configura A/D
      set_adc_channel(0);                      // Lê a entrada 0

      while(1)
      {
         long frequencia=0;
         float tensao;
         
         tensao=read_adc()*0.1212;              //Lê tensão e multiplica por constante
                                              //para achar tensão AC
         lcd_inst(0x86);                      //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%03.2f V",tensao);  //Mostra a tensão medida
         
         set_timer1(0);                       //Inicia com contador zerado
         delay_ms(1000);                      //Delay de 1 segundo
         frequencia=get_timer1();             //Pega a frequência medida
         lcd_inst(0xC6);                      //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%03lu Hz",frequencia);//Mostra a frequência medida         
         
      }           
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                      Rotina de Inicialização de LCD                 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void inicializa_lcd(void)
{

   lcd_inst4(0b00000011);
   delay_ms(15);
   lcd_inst4(0b00000011);
   delay_ms(15);
   lcd_inst4(0b00000011);
   delay_ms(15);
   lcd_inst4(0b00000010);
   delay_ms(15);

   lcd_inst(0b00101000);
   delay_ms(15);
   lcd_inst(0b00001100);
   delay_ms(15);
   lcd_inst(0b00000110);
   delay_ms(15);
   lcd_inst(0b00000001);
   delay_ms(100);
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                  Rotina de Envio de Comando para o LCD              *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void lcd_inst4(unsigned char dado)
{

   output_low(RS);                                //Limpa o pino RS, modo comando
   delay_us(100);

   if (dado & 0b00001000) output_high(D7);        //Se o bit estiver em 1 liga a saída
   else                   output_low(D7);         //Caso contrário desliga a linha

   if (dado & 0b00000100) output_high(D6);        //Se o bit estiver em 1 liga a saída
   else                   output_low(D6);         //Caso contrário desliga a linha

   if (dado & 0b00000010) output_high(D5);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D5);         //Caso contrário desliga a linha

   if (dado & 0b00000001) output_high(D4);        //Se o bit estiver em 1 liga a saída
   else                   output_low(D4);         //Caso contrário desliga a linha

   delay_us(100);

   output_high(EN);                               //Gera pulso de enable
   delay_us(150);                                 //Aguarda 150 us
   output_low(EN);

   delay_ms(5);                                   //Faz a inicialização do display

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                  Rotina de Envio de Comando para o LCD              *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void lcd_inst(unsigned char dado)
{
   output_low(RS);                                 //Limpa o pino RS, modo comando
   delay_us(100);

   if (dado & 0b10000000) output_high(D7);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D7);          //Caso contrário desliga a linha

   if (dado & 0b01000000) output_high(D6);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D6);          //Caso contrário desliga a linha
 
   if (dado & 0b00100000) output_high(D5);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D5);          //Caso contrário desliga a linha

   if (dado & 0b00010000) output_high(D4);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D4);          //Caso contrário desliga a linha

   delay_us(100);

   output_high(EN);                                //Gera pulso de enable
   delay_us(1);                                    //Aguarda 150 us
   output_low(EN);

   if (dado & 0b00001000) output_high(D7);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D7);          //Caso contrário desliga a linha

   if (dado & 0b00000100) output_high(D6);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D6);          //Caso contrário desliga a linha

   if (dado & 0b00000010) output_high(D5);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D5);          //Caso contrário desliga a linha

   if (dado & 0b00000001) output_high(D4);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D4);          //Caso contrário desliga a linha


   delay_us(10);

   output_high(EN);                                //Gera pulso de enable
   delay_us(150);                                  //Aguarda 150 us
   output_low(EN);

   delay_ms(5);                                    //Faz a inicialização do display

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                  Rotina de Envio de Dados para o LCD                *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void lcd_Dado(char dado)
{
   
   output_high(RS);                                //Limpa o pino RS, modo comando
   delay_us(100);

   if (dado & 0b10000000) output_high(D7);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D7);          //Caso contrário desliga a linha

   if (dado & 0b01000000) output_high(D6);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D6);          //Caso contrário desliga a linha

   if (dado & 0b00100000) output_high(D5);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D5);          //Caso contrário desliga a linha

   if (dado & 0b00010000) output_high(D4);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D4);          //Caso contrário desliga a linha

   delay_us(10);

   output_high(EN);                                //Gera pulso de enable
   delay_us(1);                                    //Aguarda 150 us
   output_low(EN);

   if (dado & 0b00001000) output_high(D7);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D7);          //Caso contrário desliga a linha

   if (dado & 0b00000100) output_high(D6);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D6);          //Caso contrário desliga a linha

   if (dado & 0b00000010) output_high(D5);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D5);          //Caso contrário desliga a linha

   if (dado & 0b00000001) output_high(D4);         //Se o bit estiver em 1 liga a saída
   else                   output_low(D4);          //Caso contrário desliga a linha


   delay_us(10);

   output_high(EN);                                 //Gera pulso de enable
   delay_us(150);                                   //Aguarda 150 us
   output_low(EN);

   delay_ms(3);                                     //Faz a inicialização do display

}






Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 06 Jan 2015 15:57
por ze
seu código pode servir sim amigo. (sqn analisei ele) Mas acho que o momento é de vc definir uma forma de apresentar a informação ao mc. Pode ser analógica na entrada ad ou digital na spi como disseram os amigos. Ambas têm suas peculiaridades. Diga o que vc tem ao seu dispor
Nunca vi mais gordo o ad7763 e nem sei se vai achar algo pronto. O bacana disso é que vc vai ter que ler o datashit dele pra fazê-lo conversar com o mc. Mas se até o xuts conseguiu, então aff.. mamão com açúcar

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 07 Jan 2015 07:54
por xultz
Valeu, Zé...

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 07 Jan 2015 09:43
por carlucio
Esse compontente pelo que vi é dificil de achar e usar.

E pra medir a corrente como faço? Da pra usar o acs712 de 30A de maneira a medir constantemente a corrente?

Alguem ja usou ele?

Re: Como medir tensao e corrente ac com pic

MensagemEnviado: 07 Jan 2015 10:19
por ze
Então tá

Pra medir a corrente basta ler o valor analógico. Numa olhadela no d.s. acho que vi que o máximo é 30A. Atenção ao p.n. ACS712ELCTR-30A-T

Sim alguém já usou. Eu não.