Como medir tensao e corrente ac com pic

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como medir tensao e corrente ac com pic

Mensagempor carlucio » 05 Jan 2015 11:11

Galera,

Queria medir tensão e corrente alternada com o pic, configurações ou modulos para esse fim?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor andre_luis » 05 Jan 2015 12:01

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 ?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 05 Jan 2015 12:10

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).
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor xultz » 05 Jan 2015 13:49

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.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 05 Jan 2015 14:19

caro xultz

Esse componete e usado em conjunto com o pic?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor xultz » 05 Jan 2015 15:06

Pode ser usado, sim.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Como medir tensao e corrente ac com pic

Mensagempor menegola » 05 Jan 2015 15:27

Poxa meu!!!
Que componente paulada.
Que super datashtees
menegola
Word
 
Mensagens: 683
Registrado em: 08 Dez 2008 12:11

Re: Como medir tensao e corrente ac com pic

Mensagempor ze » 05 Jan 2015 16:24

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Como medir tensao e corrente ac com pic

Mensagempor edsont » 05 Jan 2015 17:17

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.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Como medir tensao e corrente ac com pic

Mensagempor nagkiller » 05 Jan 2015 21:19

Experimente as aulas desse cara!!!

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

Flw...
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 06 Jan 2015 15:25

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

}





carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor ze » 06 Jan 2015 15:57

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Como medir tensao e corrente ac com pic

Mensagempor xultz » 07 Jan 2015 07:54

Valeu, Zé...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 07 Jan 2015 09:43

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?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor ze » 07 Jan 2015 10:19

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.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x