Entrar    Registrar

Como medir tensao e corrente ac com pic

Software e Hardware para uC PIC

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Re: Como medir tensao e corrente ac com pic

Mensagempor MOR_AL » 08 Fev 2015 06:55

carlucio escreveu:Moral,

Esqueci de dizer que a tensao retificada de 180vcc (220vca passando pela ponte de diodo), com esses resistores acima citados e problema na certa, não suportariam temperatura. A formula nesse caso para a potencia especifica seria P= V² / R. Calcule para 220vca e vera que é em torno de 3w.


Sugiro que aprendas a:

1 - Calcular as tensões em resistores com divisores resistivos.
2 - Calcular a potência dos resistores.

Depois calcule as potências nos resistores com os valores que eu forneci. Você vai concluir que encontram-se dentro do valor especificado.

Melhor ainda!!!
Monte apenas o divisor resistivo que eu mencionei e teste quanto a temperatura.
Se queimar, só vai custar o preço de dois resistores. Algo em torno de R$ 0,30.


Em tempo:
220Vca passando pela ponte de diodos não fornece 180Vcc!!!

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2889
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 08 Fev 2015 09:48

Moral,

O circuito do projeto é baseado no livro mede fase rms com pic da cerne tecnologia.

Em conversas com o autor recebi as formulas relacionadas anteriormente.

Ja com os resistores estou achando que comprei gato por lebre ou seja me venderam um resistor de 2w em vez de 3w (aqueles resistores com fundo marrom). Eu que não sei ainda como se posta um foto aqui senão voce veria o que estou falando.

Com relação a tensão com 220Vca na entrada da ponte ele fornece sim 180VCC aproximandamente (pode testar no proteus que vai ver esse mesmo resultado) pois logo apos a ponte não tem capacitor de filtragem, somente apos os divisores resistivos tem capacitor de filtro para um tensão abaixo de 5vcc.


Aldss mandei mensagem particular com os dados pedidos.

Sobre o acs712 é em linguagem c ccs e na net ainda não achei um programa especifico com trabalho neste componente. Achei em micro c que neste caso não ajuda por ser mais dificil de entende-lo.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor EvandrPic » 08 Fev 2015 16:39

Acho que você está querendo dar um passo maior que a sua perna, por isso está encontrando tanta dificuldade.
Se continuar assim, daqui há uns 3 anos ainda vai estar tentando fazer esse projeto.
A não ser que o que você esteja pedindo seja um circuito pronto com o programa comentado.

Perguntei se você já tinha usado o conversor A/D do PIC e você não respondeu. Sem saber qual o teu conhecimento de programação e de hardware fica difícil ajudar.
Coloque um potenciômetro na entrada RA0 daquele circuito que postei e tente apresentar os valores de tensão de 0 a 5 volts no display conforme gira o potenciômetro pra direita ou esquerda.
Depois disso será fácil mudar para o ACS712.

ACS712_CKT-550x452.png


Aqui você tem a informação de como usar o conversor A/D no PIC em CCS.
Quando você for pesquisar sobre algum projeto no google não limite suas buscas a encontrar tudo mastigado exatamente como você gostaria de fazer. Procure resolver por partes e vá adaptando ao seu projeto.
Como disse anteriormente, me parece que o seu principal problema é não saber usar o A/D do PIC, então aprenda primeiro isso. Um passo de cada vez!!





carlucio escreveu:Sobre o acs712 é em linguagem c ccs e na net ainda não achei um programa especifico com trabalho neste componente. Achei em micro c que neste caso não ajuda por ser mais dificil de entende-lo.
Você não está autorizado a ver ou baixar esse anexo.
EvandrPic
Dword
 
Mensagens: 2083
Registrado em: 31 Mar 2010 15:05

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 09 Fev 2015 14:29

aldss o email : carluciorodrigues@ibest.com.br

Evandro pic, tem um pouco de razão que não sei utilizar muito bem o a/d do pic principalmente no que se refere a varredura de leitura que utilize interrupção. Tem um conhecimento basico de pic, não de iniciante e a respeito do codigo não quero pronto, quero aprender a fazer. Com relação a pesquisa nunca a gente acha o que precisa mastigado, sempre buscando fazer adaptações. Mas se for procurar sobre o componte acs712 95 a 99% dos programas são voltados para arduino.

Vou tentar o que me pediu anteriormente so que o pic referido no projeto não tenho possuo aqui, tenho somente os pic16f876a / 877a e 870 com a/d. Tenho que adaptar, por isso o codigo que vem no projeto indicado, esta em micro c e eu teria que instalar o compilador especifico. Mas valeu pelas dicas
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor EvandrPic » 09 Fev 2015 17:05


NÃO DISSE PRA VOCÊ USAR AQUELE PIC... DISSE PRA VOCÊ COLOCAR UM POTENCIÔMETRO NA ENTRADA ANALÓGICA RA0 DO PIC QUE VOCÊ VAI USAR.
DEPOIS DE FAZER FUNCIONAR COM O POTENCIÔMETRO, VOCÊ FAZ COM O ACS712.
ISSO É ADAPTAR AO SEU PROJETO ALGO QUE ESTÁ DISPONÍVEL AOS MONTES NA INTERNET!!!

OS VÍDEOS ESTÃO ENSINANDO A USAR O CONVERSOR ANALÓGICO/DIGITAL DO PIC 16F877A E 16F876A COM O COMPILADOR CCS.
VEJA PELO MENOS O PRIMEIRO VÌDEO!!


A/D COM PIC 16F877A E CCS


A/D COM PIC 16F876A E CCS


carlucio escreveu:aldss o email : carluciorodrigues@ibest.com.br

Evandro pic, tem um pouco de razão que não sei utilizar muito bem o a/d do pic principalmente no que se refere a varredura de leitura que utilize interrupção. Tem um conhecimento basico de pic, não de iniciante e a respeito do codigo não quero pronto, quero aprender a fazer. Com relação a pesquisa nunca a gente acha o que precisa mastigado, sempre buscando fazer adaptações. Mas se for procurar sobre o componte acs712 95 a 99% dos programas são voltados para arduino.

Vou tentar o que me pediu anteriormente so que o pic referido no projeto não tenho possuo aqui, tenho somente os pic16f876a / 877a e 870 com a/d. Tenho que adaptar, por isso o codigo que vem no projeto indicado, esta em micro c e eu teria que instalar o compilador especifico. Mas valeu pelas dicas
EvandrPic
Dword
 
Mensagens: 2083
Registrado em: 31 Mar 2010 15:05

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 22 Mar 2015 00:40

Ola,

Neste momento estou tentando agora ver se consigo montar uma tabela de linearilidade para usar no codigo do pic (para medir e apresentar no lcd a tensao da rede).

O circuito utilizado para fazer a linearização da tensao

esquema elétrico.jpg


Abaixo assim que conseguir pelo menos apresentar o valor real no display, tentarei apresentar o valor correto atraves de comparações para tambem usar um fator de multiplicação para fazer a devida correção em descrepancias.

O problema e que estou esbarrando na maneira correta de fazer o codigo para representar isto no display.
Na maneira citado abaixo esta acontecendo que quando utilizo a esta equação o display fica indicando valores como 249, 409, 363, etc... Não esta ficando marcando o valor original que neste caso deveria ser em torno de 212 "volts", fica oscilando e longe do real.



O trecho do codigo a parte da conversao usado abaixo.

Código: Selecionar todos
float leitura_tensao_conv=0.0;
 float leitura_tensao=0.0;
 
float fm1= 80.30;
 
 
 void main(void)
 {     
           
      inicializa_lcd();                       //Chama função de inicialização lcd     
     
           
      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)
      { 
         leitura_tensao=read_adc();
         
         if((leitura_tensao >=540)) {;//&& (leitura_tensao<= 539)){
         leitura_tensao_conv = ((leitura_tensao * 0.4) * 1); //(leitura_tensao * 5 / 1024) * fm1;
         }
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%03.1f",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando..."



Achei um trecho de um codigo no arduino, que se refere mais ou menos o que queria, so que dessa maneira não da certo no pic.

Código: Selecionar todos
//----- Leitura e Conversão do Sensor de tensão -----------------
  leituraTensao = analogRead(sensorTensaoPin);                   // Lê entrada analógica do sensor de tensão

  if ((leituraTensao < 172)){                                    // leitura menor que 49V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM1;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 172) && (leituraTensao < 241)){          // leitura entre 49 e 67V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM1;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 241) && (leituraTensao < 309)){          // leitura entre 67 e 84V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM2;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 309) && (leituraTensao < 384)){          // leitura entre 84 e 103V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM3;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 384) && (leituraTensao < 459)){          // leitura entre 103 e 122V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM4;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 459) && (leituraTensao < 503)){          // leitura entre 122 e 129V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM5;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 503) && (leituraTensao < 547)){          // leitura entre 129 e 135V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM6;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 547) && (leituraTensao < 644)){          // leitura entre 135 e 161V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM7;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 644) && (leituraTensao < 741)){          // leitura entre 161 e 186V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM8;      // Converte a leitura para volts e aplica "fator de multiplicação"
  }
  if ((leituraTensao >= 741)){                                   // leitura igual ou maior que 186V
  leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM9;      // Converte a leitura para volts e aplica "fator de multiplicação"
  } 
//---------------------------------------------------------------



Sera que alguem me ajuda a montar a equação correta para fazer a tabela de linearização?

A tabela ficara quase igual a essa abaixo

tabela3.jpg


E essa com o fator de multiplicação que necessariamente não sera esse

tabela2.JPG


Aguardando alguma orientação.
Você não está autorizado a ver ou baixar esse anexo.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor aluis-rcastro » 22 Mar 2015 09:46

carlucio,


A dica que dou nesse ponto, é que meça com um multimetro ou osciloscopio pra confirmar se a saída DC do circuito acima está realmente com um ripple alto devido á alguma retificação mal feita. Outro ponto, é que provavelmente possa estar havendo algum problema com a conversão float no printf. Minha dica é voce /*comentar*/ as partes que manipulam float no código acima e passa a usar char ou int. Caso prefira uma alternativa ainda melhor, coloca uma saída serial aí pra enviar os dados lidos pela UART e ir debugando também pela serial.

Quanto á abordagem da tabela, é por aí mesmo, tem de medir ponto á ponto e depois converter dentro do PIC, com o que se chama de acesso á look-up table, mas a idéia não é converter por cálculo no PIC, mas apresentar o próprio valor, eximindo o PIC de quaisquer contas que envolvam operação de divisão, que são muito custosas para o processamento de um uC de 8 bits.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
aluis-rcastro
Dword
 
Mensagens: 5338
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Como medir tensao e corrente ac com pic

Mensagempor ze » 23 Mar 2015 11:56

amigo ao deixar o mc fazer a conta pra converter do jeito que vc fez ele vai dar saltos mesmo. Imagine se 241 ele multiplica por FM1, se 242, por FM2. Aqui tem um pulinho considerável. O verdadeiro pulo do gato é vc fazer como o amigo andré disse e capturar os dados direto da tabela, sem fazer contas
algo como
Código: Selecionar todos
leituratensao=adcread();
leituratensaoconv=tabela[leituratensao];

De fato nem sei se precisa tabela pra linearizar. Tenta ir aumentando a corrente por steps, meça com multimetro e anote e ao lado anote também o resultado do ad in natura. Depois divida um pelo outro pra ver o resultado. Umas 10 medições devem ser suficientes. Claro que pra isso o hw tem que estar filé.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1645
Registrado em: 05 Jun 2007 14:32

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 25 Mar 2015 16:29

Ola,

Conforme orientado pelo andre e o ze fiz algumas modificações no circuito, mas agora o mesmo não esta mostrando o valor da tensao lida e convertida no display.

a mensagem no display que fica é esta e não altera independente da tensao de entrada alterar :
Código: Selecionar todos
         
V=   0
Monitorando....


Não sei onde errei e porque não esta aparecendo o valor no display, sera que alguem consegue ver o problema o codigo esta abaixo.


Com a ajuda do variac fiz a tabela de conversão utilizando um transformador de 12 + 12 / 400ma ( a corrente / potencia influencia nas medidas para criar a tabela) e montei a tabela da tensao lida e a conversão para o ad do pic utilizando o circuito abaixo:

Imagem


So pra exemplo da tabela ficou assim:

Código: Selecionar todos
Vac                Vconvertida         ad         FM (fator de multiplicação)
220V                   2,74              561                   0.393   (220v / 561 )
210V                   2,66              544                   0.386
200V                   2,57              526                   0.380

etc.....




a parte do codigo da conversão ficou assim:

Código: Selecionar todos

int leitura_tensao_conv=0;
int leitura_tensao=0;
 
 
 
 void main(void)
 {     
           
      inicializa_lcd();                       //Chama função de inicialização lcd     
     
           
      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)
      { 
         leitura_tensao=read_adc();
         
         if((leitura_tensao >=563)){  // tensao maior que 220v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v
         leitura_tensao_conv = ((leitura_tensao * 0.386));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=543)&& (leitura_tensao<=526)){ // tensao maior ou igual 200v e menor ou igual a 190v
         leitura_tensao_conv = ((leitura_tensao * 0.380));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=525)&& (leitura_tensao<=509)){ // tensao maior ou igual 190v e menor ou igual a 180v
         leitura_tensao_conv = ((leitura_tensao * 0.373));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=508)&& (leitura_tensao<=487)){ // tensao maior ou igual 180v e menor ou igual a 170v
         leitura_tensao_conv = ((leitura_tensao * 0.370));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=486)&& (leitura_tensao<=464)){ // tensao maior ou igual 170v e menor ou igual a 160v
         leitura_tensao_conv = ((leitura_tensao * 0.366));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=463)&& (leitura_tensao<=438)){ // tensao maior ou igual 160v e menor ou igual a 150v
         leitura_tensao_conv = ((leitura_tensao * 0.366));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=437)&& (leitura_tensao<=411)){ // tensao maior ou igual 150v e menor ou igual a 140v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=410)&& (leitura_tensao<=385)){ // tensao maior ou igual 140v e menor ou igual a 130v
         leitura_tensao_conv = ((leitura_tensao * 0.364));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=384)&& (leitura_tensao<=359)){ // tensao maior ou igual 130v e menor ou igual a 120v
         leitura_tensao_conv = ((leitura_tensao * 0.362));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=358)&& (leitura_tensao<=329)){ // tensao maior ou igual 120v e menor ou igual a 110v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
                 
         
         if((leitura_tensao >=328)&& (leitura_tensao<=301)){ // tensao maior ou igual 110v e menor ou igual a 100v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=300)&& (leitura_tensao<=272)){ // tensao maior ou igual 100v e menor ou igual a 90v
         leitura_tensao_conv = ((leitura_tensao * 0.368));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         if((leitura_tensao <=272)){
         leitura_tensao_conv = ((leitura_tensao * 0.362)); // tensao menor que 90v
                         
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           


 }




o codigo completo é este abaixo:


Código: Selecionar todos
#include <16F876A.h>
#device adc=10
#include "lcd.c"
//#device adc=10
#use delay(clock=4000000)
#fuses xt,nolvp,nowdt
//#device adc=10

int leitura_tensao_conv=0;
int leitura_tensao=0;
 
 
 
 void main(void)
 {     
           
      inicializa_lcd();                       //Chama função de inicialização lcd     
     
           
      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)
      { 
         leitura_tensao=read_adc();
         
         if((leitura_tensao >=563)){  // tensao maior que 220v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v
         leitura_tensao_conv = ((leitura_tensao * 0.386));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=543)&& (leitura_tensao<=526)){ // tensao maior ou igual 200v e menor ou igual a 190v
         leitura_tensao_conv = ((leitura_tensao * 0.380));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=525)&& (leitura_tensao<=509)){ // tensao maior ou igual 190v e menor ou igual a 180v
         leitura_tensao_conv = ((leitura_tensao * 0.373));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=508)&& (leitura_tensao<=487)){ // tensao maior ou igual 180v e menor ou igual a 170v
         leitura_tensao_conv = ((leitura_tensao * 0.370));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=486)&& (leitura_tensao<=464)){ // tensao maior ou igual 170v e menor ou igual a 160v
         leitura_tensao_conv = ((leitura_tensao * 0.366));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=463)&& (leitura_tensao<=438)){ // tensao maior ou igual 160v e menor ou igual a 150v
         leitura_tensao_conv = ((leitura_tensao * 0.366));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=437)&& (leitura_tensao<=411)){ // tensao maior ou igual 150v e menor ou igual a 140v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=410)&& (leitura_tensao<=385)){ // tensao maior ou igual 140v e menor ou igual a 130v
         leitura_tensao_conv = ((leitura_tensao * 0.364));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=384)&& (leitura_tensao<=359)){ // tensao maior ou igual 130v e menor ou igual a 120v
         leitura_tensao_conv = ((leitura_tensao * 0.362));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=358)&& (leitura_tensao<=329)){ // tensao maior ou igual 120v e menor ou igual a 110v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
                 
         
         if((leitura_tensao >=328)&& (leitura_tensao<=301)){ // tensao maior ou igual 110v e menor ou igual a 100v
         leitura_tensao_conv = ((leitura_tensao * 0.365));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=300)&& (leitura_tensao<=272)){ // tensao maior ou igual 100v e menor ou igual a 90v
         leitura_tensao_conv = ((leitura_tensao * 0.368));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         if((leitura_tensao <=272)){
         leitura_tensao_conv = ((leitura_tensao * 0.362)); // tensao menor que 90v
                         
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           


 }



Sera que alguem esclarece meu erro? Com float no lugar do int na declaração das variaveis o compilador xiou dizendo a mensagem : " out of rom".
Existe outra forma de apresentar os dados?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor MOR_AL » 25 Mar 2015 16:56

Aquele resistor R2 = 100k está muito estranho. Principalmente depois com um resistor de 330 ohms em série.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2889
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 25 Mar 2015 17:10

Moral,

o circuito conversor funciona muito bem e é deste projeto abaixo no link.
Com relação a ele, funciona perfeitamente. O problema creio eu esta no codigo que eu não sei porque nao apresenta o valor da leitura.


http://www.seriallink.com.br/forum/view ... RMIX_nF91Z

Veja fotos do projeto funcionando neste link, o problema e que é do arduino, não da muito para ser aproveitado.
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor carlucio » 25 Mar 2015 22:49

Sera que o problema esta na maneira de se solicitar a apresentação no display logo apos uma comparação.

Código: Selecionar todos
if((leitura_tensao >=563)){  // tensao maior que 220v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
         delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }         

if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v
         leitura_tensao_conv = ((leitura_tensao * 0.393));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         
         
         if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v
         leitura_tensao_conv = ((leitura_tensao * 0.386));
         
          delay_ms(3000);
         lcd_locate(1,0);
         printf(lcd_dado,"V=");
         lcd_locate(1,2);                     //Posiciona o cursor na segunda linha
         printf(lcd_dado,"%3u",leitura_tensao_conv);  //Mostra a tensão medida

         lcd_locate(2,0);
         printf(lcd_dado,"Monitorando...");
      }           
         




Sera que alguem me da uma dica?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Como medir tensao e corrente ac com pic

Mensagempor KrafT » 26 Mar 2015 07:44

Há muitos anos quando eu brincava com essas coisas, usava números inteiros...

Por exemplo em vez de você usar 0.393 como fator de multiplicação, eu usaria 393. Depois, antes de colocar no display, fazia o ajuste decimal, colocando a virgula no local desejado.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2153
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Como medir tensao e corrente ac com pic

Mensagempor ze » 26 Mar 2015 09:10

Amigo pra deixar mais estável, coloque + 1 capacitor chute 10uF em paralelo com o zener. Out of rom provavelmente não está cabendo na memória. Float & mc 8 bits = não têm afinidade. Tente algo como o kraft disse.
Esquece o valor do trafo. Foque no ac e ad. tipo assim.. 220 = ad 561 e quero 220. p.ex multiplicando valor ad por 50 561*50=28500 cabe dentro de um unsigned int. /220 =127.5 que cabe até num unsigned char
Portanto para mostrar 220 faça (ad*50)/127 e esqueça float. (o bom mesmo é operações com base 2. 2,4,8,16,32,64. Pro mc é como se pra nós fosse base 10)
Bom esta foi só a essência. Tem como melhorar, claro.
Teste mais valores com teu variac. Pode ser que fique linearzinho. Coloque os dados do ad no excel e crie um gráfico pra ver se formam uma reta. Também pode colocar os do multímetro
De fato nem trafo precisa. Pode ligar direto na rede ac. A ideia: 2 resistores 2M2 um em cada fase na entrada de um amp diferencial + retificador ideal com ampop e .. esquece isso nesta sua fase. Dx pra mais tarde...
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1645
Registrado em: 05 Jun 2007 14:32

Re: Como medir tensao e corrente ac com pic

Mensagempor aluis-rcastro » 26 Mar 2015 21:43

Faço coro com o KrafT, não usa float.

Embora ainda não tenhamos determinado o motivo do problema, a formatação float pode ser uma fonte pra dor de cabeça, pois é dificil de debugar já que não é um formato natural para o microcontrolador, e algum arredondamento ou casting pode estar sendo feito a partir de algum valor sem percebermos.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
aluis-rcastro
Dword
 
Mensagens: 5338
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron