Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, eu estou montando um medidor de corrente e estou utilizando o sensor hall acs712 de 5A para isso.. Mas na minha saída nuca sai uma valor exato (ou próximo) da real, tipo se a real for 1.70 a minha vai ser 1.5. Alguém que já utilizou esse sensor que passou por esse problema sabe como me ajudar???

  • Membro VIP
Postado

nunca usei. Melhor dizer como está comparando, se usa o mesmo instrumento, qual escala, confiabilidade dele, se ampop como perguntou o amigo Paulão e etc

você tem a alternativa de linearizar via sw. Afinal está usando mc.

Postado

Então estou usando um filtro na sua saída e a sua sensibilidade é de 185 mV/A. Devo utilizar o ampop? Como? 

 

Valeu pela atenção de vocês...

Postado

@Rafael_mais ,

 

Poste o esquema que você está usando, inclusive a ligação ao conversor A/D ou coisa parecida....

 

Não sei para que o filtro, todos os projetinhos que vejo usam apenas um simples capacitor na saída para dar uma "amenizada" na saída .... se você estiver usando algo mais do que isso, vai ter influência na sua medição.

 

Outra coisa, se você está medindo  corrente DC é uma situação, mas se sua corrente for AC, então a coisa complica ainda mais.

 

Fale mais sobre essa corrente, se o sinal é variável, se é uma senoide, se a frequência pode variar, etc.

 

A sensibilidade que você disse é a do CI ACS712 no modelo de 5A, e significa que se a corrente for de -5A ( sentido inverso ) , a tensão na saída será pouco maior do que 1,5 Volts; e se a corrente for de 5A , a tensão será pouco inferior a 3,5 Volts. Assim, a variação a ser medida é de apenas 2 volts. Como você vai ter de usar a referência do conversor A/D em 5 Volts, suas medidas vão ficar com baixa resolução.

 

Eu usaria um circuito com dois ou três amplificadores operacionais para poder fazer esses valores serem convertidos para uma nova faixa indo de 0 até 5 volts, ( tudo bem, de 0,5 a 4,5 já está ótimo... ) , e isso aumentaria a resolução das medidas.

 

Paulo

Postado

Paulo primeiramente muito obrigado pela sua ajuda... colocarei tanto a ligação como o código para você ver...

A minha medição será AC... Essa corrente será a da rede e a frequência será de 60Hz, mas para fazer os cálculos irei amostrar essa corrente no pic a 6000Hz, nos dando 101 amostras do sinal...

 

Eu não sabia dessa variação do acs entre 1.5 e 3.5V... eu achava que já era em 0 e 5V... Como eu posso resolver isso?? Você poderia me ajudar??

 

Então, como eu faria essa nova referência para o pic (0.5 a 4.5V)?

 

Código:

 

set_adc_channel(0);
delay_ms(20); 

while(true)
{

soma_corrente_quadratica = 0;

for (n=0; n<102; n++)
{

VreadADC_C = read_adc();
delay_us(83.5);

Corrente_instantanea = (5*(VreadADC_C - 511.5))/(1023.0*0.185);

corrente_quadratica = corrente_instantanea*corrente_instantanea ;

soma_corrente_quadratica = soma_corrente_quadratica+corrente_quadratica; 

 

delay_us(83.3);


}

Corrente_media_quadratica = soma_corrente_quadratica/101.0;
Valor_rms_C = (sqrt(Corrente_media_quadratica));

delay_ms(200);
printf(lcd_putc,"\f %1.2f",Valor_rms_C);
// lcd_gotoxy(14,2);lcd_putc("V"); // leva o cursor para a posição (x,y) do display (caracter 14 da linha 2)e coloca a unidade Volt (V)

}

corrente.png

  • Membro VIP
Postado

Então seu "instrumento de medição" é o mc directo? Que tal se colocasse um de verdade pra conferir e eventualmente fazer os ajustes no hw e sw?

 

Continuo achando que pra medir a rede, o hw pode fazer o trabalho matemático sujo = aos multímetros. Além do +, fazer um pic 8 bits trabalhar com ponto flutuante é forçar a amizade.

 

Se for só pra aprendizado, ignore os comentários supramencionados e toca o barco

 

Paulão está num nível superior e num dá muita bola pro pic e c kk. Mas claro, pode te orientar direitinho. Vou sair pra deixar vocês se conhecerem melhor kk

 

abç & felicidades!

  • Curtir 2
Postado

Valeu Isadora, mas esse circuito de Paulo vai me servir justamente para eu colocar na entrada do pic a referencia certa, que vai de 0 a 5v... tomara que ele me ajude mesmo kkkk

 

Valeu pela sua ajuda...

Postado
1 hora atrás, Isadora Ferraz disse:

 

Paulão está num nível superior e num dá muita bola pro pic e c kk

 

KKKK não é "nivel superior" .... desse jeito você me deixa sem jeito, Isadora !!!!

 

Eu usei os Pics também até 2009, escrevi um tutorial aqui no CDH sobre programar Pics com Basic também .... mas  percebí que em termos de hardware, os Avrs tem uma relação custo/benefício muito superior aos Pics. Mas como só programava em Basic ( sinceramente, embora me sinta em casa com vários tipos de Assembly de diversas famílias de microcontroladores, nunca consegui entender esse troço de bancos nos Pics .... ) tive de esperar por uma linguagem que eu entendesse , e quando fui "apresentado" ao Bascom logo ví que todos os meus problemas com linguagem de programação havia acabado, e adotei de vez os Avrs, mas sempre programados pelo Bascom e recentemente com um mix de Assembler em alguns programas onde preciso do controle da temporização de forma muito precisa.

 

Assim, deixo o C para quem gosta dele .....

 

Mas sempre dou alguns palpites no hardware de projetos com Pic quando posso, a teoria é quase a mesma da dos Avrs, mas no C deixo para os "entendidos" nela ajudarem a todos.

 

@Rafael_mais ,

 

O truque é aproveitar os modos existentes no Pic16f877 ! Igual aos Avrs, ele tem alguns truques muito legais !

 

Existe um modo de trabalhar no conversor A/D onde colocamos duas referências de tensão, sendo uma utilizada com limite inferior, ( leitura 0 do conversor A/D ) , e outra utilizada como limite superior ( Leitura 1023 do conversor A/D ) !

 

Assim, você tem um intervalo linear, e fica muito fácil calcular qual a tensão que você mediu !

 

Outra coisa, veja as tensões que seriam ideais como referência :

 

tensão mínima = 2,5 - 0,185*5 = 1,575 Volts

tensão máxima = 2,5 + 0,185*5 = 3,425 Volts

 

Veja aqui, página 6, no final da página, onde tem os bits PCFG3:PCFG0 =  1000 :

 

http://www.mwftr.com/ucF08/LEC15%20PIC%20AD.pdf

 

Basta programar essa maneira de trabalhar no conversor A/D , e pronto ! Sem nenhum hardware adicional, seu problema foi resolvido.

 

Caso você não precise de muita precisaão na sua medida, podemos usar os mesmos 5 Volts de sua alimentação, e fazer dois divisores resistivos, um para gerar a tensão máxima ( 3,425 Volts ), e outro para gerar a tensão mínima ( 1,575 Volts ) , e aplique aos pinos RA3 e RA2 respectivamente, e pronto, não precisamos utilizar nenhum amp op ! Use resistores de baixo valor, por exemplo a soma dos dois não pode ultrapassar 1 K. Se não conseguir os valores exatos, use um trimpot para ajustar, fazendo parte de um dos resistores do divisor, para que não circule muita corrente nele.

 

Se precisar de mais precisaão, aí recomendo usar um CI de referência de tensão de precisaão tipo um TL431 que pelo ajuste de 2 resistores permite você obter a tensão exata desejada. Vale aqui também usar um trimpot para ajuste fino.

 

 

Agora, no software :

 

Não precisa tanta leitura assim, e até acho que o Pic não consegue aguentar essas 6100 leituras com cálculos de ponto flutuantes em 1 segundo !

 

Além do que, a teoria exige que você sempre tenha as amostragens com o mesmo intervalo de tempo, e o tempo total da amostragem deve ser um múltiplo EXATO do período da forma de onda !

 

Eu sugiro você fazer isso via uma interrupção no Timer , e faça nela apenas a captura dos valores do conversor A/D. Por exemplo, crie uma tabela, e faça 32 capturas ( se quiser, 64 fica ainda melhor ! ), sempre usando a interrupção do Timer. Um bom valor para a frequência da interrupção do Timer é 60 x 32 = 1920 Hertz , assim você vai ter como resultado um cálculo da corrente RMS a cada segundo.

 

Depois, quando você tiver a tabela preenchida, pode parar o Timer, e proceda ao cálculo, convertendo a leitura do conversor A/D para a corrente instantânea medida, e a partir daí fazendo os quadrados, totalizando e fazendo a média,  que vai te dar o valor certinho.

 

Paulo

  • Curtir 2
Postado

Beleza Paulo... Muito obrigado... Nem pensei nisso.. na verdade sou leigo nesse assunto, estou no básico...

 

Tem como você me passar seu email? me faça esse favor...

 

Muito obrigado mesmo mais uma vez...

 

Se você achar melhor me envie uma email para : [email protected] ou no facebook também.

Postado

Mas Paulo, se eu alterar a referência pra minha corrente, eu vou acabar alterando pra minha tensão... Nesse caso é melhorando um e prejudicando o outro... Ou pode alterar a referencia apenas para uma entrada analógica?

 

Postado

@Rafael_mais .

 

Eu estou aqui no CDH para ajudar a todos, pode perguntar o que você precisa aqui mesmo que eu lhe responderei ( se souber kkk ) !

 

Quanto ao seu ultimo post, ao mudar a referência, todas as outras entradas do conversor A/D irão seguir a nova referência também.

 

Se você ainda pretende medir a tensão em uma outra entrada analógica ( digamos que você quer calcular também a potência RMS ... ) , então teremos problemas , pois o conversor só irá aceitar converter valores na faixa das novas referências, isto é, se aplicar uma tensão menor do que 1,575, o conversor irá sempre retornar 0. E se for maior do que 3,425, sempre irá retornar 1023.

 

Se você realmente precisa ler a tensão em uma outra entrada analógica e que varie entre 0 e 5 volts, a única solução é usar os amp ops para converter a tensão como havia falado lá no começo.... mas se não precisar, vale a ideia !

 

 

Por exemplo, no seu projeto que você postou :

 

O seu conversor A/D usa como referencia superior e inferior as tensões VREF+ de 5 Volts e VREF- de 0 volts.

 

A saída do ACS712 para uma corrente de 0 Amperes vai apresentar 2,5 volts, ou seja, o seu conversor A/D vai retornar o valor de 512 nesse caso porque os 2,5 volts são exatamente a metade da diferença entre o valor VREF+ e VERF- .

 

Ou seja, existe uma escala onde  para uma tensão de 0 volts na entrada do conversor A/D retorna o valor 0, subindo até o valor de 1023 quando a tensão for de 5 volts, certo ?

 

Imagine que a corrente que esteja passando no ACS712 seja de +2 Amperes. Na saída, teremos 2,5 + 0,185 x 2 = 2,870 Volts.

 

Ao ler o seu conversor, você terá a leitura de 2,870 / 5 * 1023 = 587. Como o valor é maior do que 512, sabemos que a corrente é positiva. 

 

Veja que temos uma faixa de variação possível no conversor A/D de apenas valores entre 322 e  700 para correntes entre -5A e +5A, respectivamente, então é igual a fazer uma conta numa equação de reta, lembra ? temos uma variação de contagem de 700-322 = 378 para uma variação de 10 Amperes , o que nos dá o valor de 37,8 para cada Ampere.

 

Para termos a corrente, é só fazer a conta : 587 - 512 = 75 / 37,8 =  1,98 A .

 

Repare que temos um erro devido à baixa resolução da conversão.

 

 

 

Agora, fazendo que eu falei para você fazer :

 

Perceba que para uma corrente de 0 Amperes, o conversor A/D também vai retornar o valor de 512 !

 

Uma corrente de +2A vai dar a tensão de 2,870 Volts, que o conversor A/D vai retornar o seguinte valor :

 

(2,870 - 1,575) / ( 3,425 - 1,575) *1023 = 716, que é maior do que 512, e então sabemos que a corrente é positiva.

 

Com as nossas tensões de referência, sabemos que temos uma faixa de variação da contagem de 1023 - 0 = 1023  para a mesma variação total de 10 Amperes, o que nos dá uma resolução bem maior, de 102,3 para cada Ampere.

 

Para termos a corrente medida, é só fazer a conta : 716 - 512 = 204 / 102,3 = 1,99 A.

 

Repare que o erro percentual é 3 vezes menor agora, devido à podermos utilizar uma maior resolução do conversor A/D.

 

Parece complicado, mas depois que você entende o princípio fica bem simples !

 

 

Rafael, mesmo sendo leigo, preste atenção : só se aprende assim, da maneira que você está fazendo, que é pondo a mão na massa, simulando no Proteus, e aprendendo, lendo os datasheets, e perguntando quando algo dá errado kkkk !

 

Não tem nada de se envergonhar por ser leigo, todos começamos sendo leigos, até que tenhamos bastante aprendizado !

 

Pode perguntar as suas dúvidas, que as respostas ficam aqui no Fórum, e assim outros podem ser ajudados ao lerem todo o tópico !

 

Parece fácil para mim, não é ?

 

Mas lembre que me formei em 1983 e sempre trabalhei com microprocessadores, microcontroladores, programação  e e eletrônica industrial !  São 33 anos de experiência, e isso faz muiiita diferença mesmo !

 

Vá em frente, meu amigo, simule, mude, invente, pergunte, TENTE SEMPRE, que você tem futuro !

 

 

Paulo

  • Curtir 3
Postado

Muito obrigado Paulo pela explicação... Estou fazendo exatamente isso, simulando e testando.....

 

Quando eu colocar no protoboard te digo como foi o resultado...

  • Curtir 1
Postado

@Rafael_mais ,

 

Bom, o seu trabalho é sobre medir o fator de potência em cargas de baixa tensão e corrigir, certo ?

 

Que tal voce medir a tensão na carga, com um divisor resistivo ou transformador, assim você poderá detectar o instante exato em que a tensão passa pelo zero, e se está subindo ou descendo.

 

Ao mesmo tempo, você mede também a tensão na saída do ACS712, que é proporcional à corrente, e você também sabe o instante exato em que a corrente passa por zero ( isto é, tensão = 2,5 volts ) , e também sabe se está subindo ou descendo.

 

Pelo tempo entre os cruzamentos por zero, e pela subida ou descida de cada um, você sabe qual a defasagem em graus e também se a defasagem é indutiva ou capacitava, correto ?

 

Aí voce pode ir chaveando um banco de capacitares ou de indutores para corrigir.

 

Se precisar saber o valor RMS da tensão e da corrente, aí não dá para fazer o truque de mudar a referência de tensão do conversor A/D. É mais viável fazer o circuitinho com alguns amp ops para poder converter a saída do ACS712 em uma tensão entre 0 e 5 volts.

 

Mas existe também a possibilidade de você fazer um circuito simples que meça a defasagem para você, e você usa o microcontrolador apenas para ler esse valor e tomar as atitudes para correção.

 

Eu ví uma vez um circuitinho que era relativamente simples e usava um medidor analógico na saída para indicar a defasagem. Vou ver se acho isso e posto aqui pra você.

 

Edit : Achei alguns que utilizam dois transformadores e trabalham pelo principio que te falei, passagem por zero :

 

http://microcontrollerslab.com/power-factor-measurement-using-microcontroller/

 

https://electrosome.com/automatic-power-factor-controller-using-microcontroller/

 

voce até pode manter o ACS712, mas vai ter de usar um circuitinho com amp op na saída dele para converter a saída em uma tensão AC que cruze por zero também .... acho mais fácil usar um pequeno transformador de corrente para 5A !

 

Paulo

  • Curtir 1
Postado

Isso mesmo @aphawk , a ideia do meu projeto é esse mesmo... Então, comecei hoje os testes com o ACS na prática... Dando alguns erros, mas vou continuar vendo o que posso fazer pra melhorar... Qualquer coisa falo aqui pra todos... Ahh sei que proteus é uma coisa e na práica é outra, mas realizando os testes no proteus eu consegui uma aproximação muito boa da corrente real... Diminui bastante o ruido... Aquelas noites que a gente mexe aqui e mexe ali... kkkkk. Sim, outra novidade boa, já estou medindo a tensão da rede! Também consegui hoje...

Vamos lá: pra coletar os dados de tensão estou utilizando um divisor resistivo.  A saída do meu divisor vai para um buffer para garantir a tensão na entrada do meu somador.. Mas porque um somador? Na saída do meu divisor vou ter uma uma senoidal de +2.5 a -2.5V. Sabemos que o Pic não ler sinal negativo, então entro com um somador inversor, mostrando em sua saída uma onda senoidal de 0 a -5v. continuo com um sinal negativo né? Pois bem, nesse caso estou utilizando um inversor, para na entrada do pic entrar a onda de 0 a 5v. Esse sinal Dc que inserir na entrada é retirado nessa minha linha do código: tensao_instantanea = (5*((VreadADC_T/1023)))-2.5. Agora o pic "trabalha" com a onda senoidal da entrada de novo.

 

Ok! Vou ler cada trabalho com bastante calma, porque talvez seja a solução para os problemas que estou tendo.

 

Valeu mesmo amigo Paulo... 

 

Amanhã digo como foram as medições da corrente com o ACS...

Postado

@Rafael_mais ,

 

Legal que os resultados estão aparecendo.

 

Sobre a sua conversão com os amp ops, fez certinho.

 

Não sei o porquê voce está querendo ler a tensão .... Repare que os outros dois projetos que postei não leem nenhum valor, eles usam comparadores que informam quando a tensão está bem próxima de zero ou não, apenas essa informação tipo sim/não. Afinal o que importa é a diferença de tempo entre o sinal de tensão e o sinal de corrente quando eles passam por zero.

 

Sobre o Timer :

 

Seu Pic tem um módulo interno chamado de Timer, ele pode ser programado para gerar uma interrupção de tempos em tempos, e essa temporização é muito precisa !

 

voce pode programar essa interrupção para que cada vez que ocorra faça a leitura do conversor A/D e preencha a sua tabela de leituras até o final. Nesse momento, seta uma variável para indicar que o buffer de leitura está cheio, e assim o programa principal pode fazer as contas e chegar ao valor correto.

 

A vantagem é que a temporização é feita de uma maneira precisa, e isso garante que o algoritmo de conversão em RMS funcione corretamente.

 

Hoje pelo que eu percebí do seu código voce gera um delay por software, mas teria de levar em conta os tempos que seu programa perde para fazer todo o processo ANTES de cada leitura do A/D, senao pode dar erro no resultado.

 

Lembre da teoria básica : O seu tempo de amostragem de todas as suas amostras deve ser sempre um multiplo inteiro da frequência usada na rede. 

 

Nada é melhor do que usar a interrupção do Timer para isso.

 

Sobre o Proteus : 

 

Se na simulação está funcionando bem, na prática voce deve tomar cuidado com ruidos induzidos, seja na alimentação ou nos sinais de tensão e corrente.

 

Mas acredito que voce não vai ter problemas ! Tudo me parece muito simples para ter alguma surpresa.

 

Mantenha a gente informado ok ?

 

Paulo

  • Curtir 2
Postado

Olhe aqui @aphawk  e pessoal o meu código para calcular o valor RMS de corrente e tensão. o medidor de corrente tem na sua saída um ruido de 0.05, já o de tensão marca certinho... se eu utilizar a interrupção por timer acho que resolveria o problema... Alguém aqui no grupo a partir desse meu código saberia me dizer como fazer isso?

 

Já li algumas coisas sobre o timer, mas acabo não sabendo colocar no meu código. Se alguém puder ajudar fico grato.

 

int n;
float Corrente_media_quadratica, Valor_rms_C, Corrente_instantanea, soma_corrente_quadratica, corrente_quadratica, VreadADC_C;
float Tensao_media_quadratica, Valor_rms_T, tensao_instantanea, soma_tensao_quadratica, tensao_quadratica, VreadADC_T;
 

void main()
{

   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(1023);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();

   // TODO: USER CODE!!
       
    while(true)
   {
   
   soma_corrente_quadratica = 0;
   soma_tensao_quadratica = 0;

 

      for (n=0; n<101; n++)
      {
                      
          set_adc_channel(0);
          delay_us(20);
          
          VreadADC_C = read_adc();
    
          set_adc_channel(1);
          delay_us(20); 
          
          VreadADC_T = read_adc();
          
                
          Corrente_instantanea = (5*(VreadADC_C - 511.5))/(1023);
         
          corrente_quadratica  =  corrente_instantanea*corrente_instantanea ;
          soma_corrente_quadratica = soma_corrente_quadratica+corrente_quadratica;


          tensao_instantanea = (5*((VreadADC_T/1023)))-2.5;   //retira o ofsset inserido,  como resultado uma senoide que varia de +2.5 à -2.5
      
          tensao_quadratica  =  tensao_instantanea*tensao_instantanea ;       
          soma_tensao_quadratica = soma_tensao_quadratica+tensao_quadratica;
        
         delay_us(127);
      
      }
      
      Corrente_media_quadratica = soma_corrente_quadratica/100.0;
      Valor_rms_C = (sqrt(Corrente_media_quadratica))/(0.185);
      
      Tensao_media_quadratica = soma_tensao_quadratica/100;
      Valor_rms_T = (sqrt(Tensao_media_quadratica));

      delay_ms(200);
      printf(lcd_putc,"\f %1.2f",Valor_rms_C);
      printf(lcd_putc,"\nVrms: %1.3f",Valor_rms_T);   
      
   }

}

 

Segue o circuito também mostrando os resultador.

 

 

TensaoCorrente.png

Valores.png

Postado

@Rafael_mais ,

 

Veja se é possível você postar o arquivo do Proteus para que outros possam simular e te ajudar.

 

Quem sabe a @Isadora Ferraz possa te ajudar nisso ?

 

Creio que essa diferença pequena nas suas medidas seja relativo ao fato de você não usar a interrupção por Timer para garantir a amostragem em períodos exatos.

 

Infelizmente eu não quis comprar o módulo de simulação de Pics, então não posso nem ver o funcionamento do projeto.

 

E quanto ao software que você postou .... para mim é língua alienígena kkkkk !

 

Paulo

 

  • Curtir 1
  • Membro VIP
Postado

É que não queria me intrometer nesta linda amizade entre vocês 2 kk

 

Permiti-me não rodar nem baixar seu projeto ok?

 

Bom.. até o momento só percebo medidas simples de ac. Se você não fosse medir fator de potência eu ia insistir no condicionamento de sinal via hw mesmo. Sei-lá.. talvez duas capturas na passagem por zero - uma da corrente, outra da tensão -  pode ser uma alternativa pra otimizar a coisa. Só um conceito. Pensei isso agora. Nunca fiz nada =

 

Só por curiosidade, quando de memória o codigo ocupou até agora? E quanto tempo leva pra fazer uma conta?  Viu só? É o que as contas com float comem. talvez seja isso que está zoando o barraco. Tente usar no máximo int. Afinal, o resultado do ad é uma int.

 

Tem métodos que podem fazer um int se comportar como um float p.ex. se você dividir um float 1023/2.5 você var ter 409.2 mas se fosse int ia ser 511. Mas se você multiplicar por 10 vai ser

10230/25=409.2 e vai caber 409 num int. Dependendo do projeto este erro é suportável e o mc vai ficar bem mais confortável. De fato ele preferia char pois ele é 8 bits

 

Foi só pra você entender o conceito. O ideal ao invés de 10, é fazer contas com base2 (2,4,8,16,32...): o mundo dos mc

 

 

  • Curtir 2
Postado

@Isadora Ferraz ,

 

voce consegue postar algum código que crie uma interrupção de Timer e faça algo tipo mudar uma saída nessa interrupção ? 

 

Só para o nosso amigo aprender como se faz isso no C ....

 

Paulo

  • Membro VIP
Postado

consigo. mas não hoje sexta super né. e neste horário ainda.. esquece! kk

 

Considerações...

-obviamente não depende SÓ do c

-depende do compilador. ccs num rola.

-o (meu) c apenas vai escrever nos registros do mc portanto...

-depende de sujar as mãos e dar uma olhadela no d.s. do mc pra ver como o timer funciona

-se quiser algo mais fácil, ouvi dizer que o ccs tem funções mastigadas que não engulo. ccs num rola

 

Tente este caminho 1º. Paulão mostra pra ele como uma interrupçao pode agregar valor ao projeto do guri

Postado

@Isadora Ferraz ,

 

Hehehe combinado.

O problema que eu estou vendo é o mesmo que você falou ... CCS não tem muita gente aqui no Fórum que utiliza.

 

Vou fazer um programinha no Bascom e coloco para ele ver a simulação, com o fonte comentado.

 

Paulo

 

Postado

@Rafael_mais ,

 

Bom, deu um pouco mais de trabalho do que imaginei... desde as 9 da noite até agora, 3:15 da manhã.... mas já consigo calcular o fator de potência para você. Tive de mudar o hardware umas 5 vezes...

 

Apresento no display os valores da tensão RMS, da corrente RMS, o Fator de Potência, e a potência total.

 

Segue no arquivo anexo o fonte do Bascom, o arquivo .obj para a simulação, e o arquivo do Proteus 8 contendo o esquema que eu fiz.

 

Resolvi fazer da maneira mais difícil, que é através do cálculo da tensão e da corrente, chegando na potencia total e a potência ativa, de onde calculo o fator de potência. Creio que esse é o caminho que você está fazendo, embora o da medida da diferença de tempos entre as passagens or zero seja muito , muito mais fácil kkkk !

 

Primeira coisa, eu reparei que usando o ACS712 no Proteus, a saída dele tem uma defasagem em relação à entrada de mais ou menos uns 5 graus, então no calculo da potencia ativa eu faço um truque para compensar isso.

 

Para não te complicar muito, em vez da interrupção eu usei uma saída do Timer1, configurada para mudar o nível dela a uma frequência de 3.840 Hz ( ou seja, em 1 segundo faço 64 ( 60 *64 = 3840 ) capturas dos conversores A/D de tensão e de corrente ). Ou seja, uma captura a cada 6,25 graus da forma de onda.

 

Fico monitorando quando esse pino muda de estado, e então faço as capturas. Quando termino as 64 capturas, procedo aos cálculos. Obtive uma precisaão nos valores calculados de cerca de 1% !

 

Demorei para entender o calculo da potencia ativa a partir dos valores instantâneos da tensão e da corrente, levei um baile para lembrar que não precisava tirar a raiz quadrada desse cálculo no final !

 

Ah, fiz uma conversão usando amp ops, e no caso da corrente tive de mudar um pouco o valor do resistor de ganho, porque tem alguma coisa errada nesse modelo do ACS712, ele está considerando 0,190 em vez de 0.185... sugiro verificar na bancada a necessidade de mudar o valor do resistor que define o ganho do conversor de corrente, ok ?

 

Existem duas fontes, uma é a de corrente, que nada mais é do que uma fonte de tensão aplicada em cima de um resistor, como você já havia feito.

 

A outra fonte é a de tensão, eu tirei o divisor resistivo que você tinha colocado e coloquei a fonte direto, fica mais fácil de testar os valores.

 

Para verificar a defasagem, mude o angulo nessa fonte, que é a de tensão, ok ?

 

Fiz vários testes e o angulo calculado para valores entre 0 e 90 graus está com erro menor do que 2 graus !

 

O circuito foi projetado para trabalhar com correntes entre -5 e +5A , e com tensão de entrada de 5V pico a pico. Caso deseje mudar para outro valor, use um divisor resistivo e mude o valor final calculado para levar em conta essa divisão.

 

Como usei um AVR, consigo fazer tudo com o clock de 16 Mhz, que é o usado nos Arduinos.

 

No caso de você utilizar um Pic ( kkk se ferrou né ), mude o Timer para gerar 1920 Hz , e mude para apenas 32 capturas. Isso se você utilizar o PIC na máxima velocidade possível, senão nada feito !

 

Mesmo assim vai aparecer um erro maior do que eu obtive, mas ainda será satisfatório.

 

Detalhe : se você fizesse pela maneira de medir apenas a diferença de tempo e calcular o FP a partir disso, o programa fica muito, mas muito mais simples, e o hardware também !

 

Acho que daqui você já embala bem o seu projeto !

 

Paulo

 

 

 

 

 

medidor fp.rar

  • Curtir 1
  • Obrigado 2
Postado

Valeu pela Ajuda@Isadora Ferraz@aphawk . eu baixei seu arquivo e fui abrindo um por um com o bloco de notas para ver o código, mas quando eu abro não mostra código nenhum... tem como você enviar como bloco de notas? O projeto no proteus também não abre...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...