Ir ao conteúdo
  • Cadastre-se
Luan Borges

PIC Multímetro com PIC18F4550 em um LCD16x02

Recommended Posts

Então galera, é o seguinte, eu to fazendo um projeto aqui, e uma parte dele, tem o monitoramento de uma bateria 14,91v, eu ja fiz a conversão AD e tudo mais, no proteus, funciona que é uma beleza, (A tensão é visualizada em um lcd 16x02) Só que... kk Quando vou testa na pratica, fica variando muito a tensão da bateria, tipo, no multímetro mesmo, dar uns 14.88, e no multímetro q eu fiz com o pic, fica dando 14.67...14.95....14.55....14,79... e por ai vai, e essa variação é constante, ele não estabiliza em nenhuma, e é muito rápido, eu já tentei por delays para ver se poderia ser isso, mas da na mesma, ja configurei a porta ADC de varias formas  diferentes e nada, detalhe, eu uso duas portas adc, a outra é pra ver a temperatura, já essa funciona que é uma beleza. Queria ver se vocês conseguem me ajudar, eu não sei mais o que fazer, se quiserem, eu posto a parte do código responsável por isso, pra vcs darem uma olhada e me dizer o que acham.

 

 

Alguém Por Favor??

adicionado 16 minutos depois

eu uso um divisor de tensão com dois resistor de 20k, em conjunto com um trimpot para abaixar o a tesão da bateria para entrar na porta ADC do pic, ja que não podemos ligar os 14v direto na porta dele 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Primeiro, em vez de 20K, use resistores de 4k7. Senão o erro devido à impedância de entrada do ADC vai ser grande.

 

Depois, coloque um capacitor de 4.7 uF entre a entrada do ADC e o GND. Isso vai ajudar bastante a estabilizar a variação.

 

Se isso ainda não resolver satisfatóriamente, voce tem muito ruído induzido, ou Algum dos famosos Loops de terra , cada caso tem um tratamento diferente.

 

Se tiver ruído induzido de 60 Hz, vai ter de caprichar bem mais no seu software.....

 

Se for Loop de terra, tem de melhorar o lay-out ou as conexões ( se for protoboard ) para eliminar.

 

Paulo

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce está imprimindo direto a leitura do ADC apos os calculos no LCD..voce  poderia tirar medias da leitura assim creio que ajude tambem..

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 26/05/2018 às 10:59, aphawk disse:

@Luan Borges ,

 

Primeiro, em vez de 20K, use resistores de 4k7. Senão o erro devido à impedância de entrada do ADC vai ser grande.

 

Depois, coloque um capacitor de 4.7 uF entre a entrada do ADC e o GND. Isso vai ajudar bastante a estabilizar a variação.

 

Se isso ainda não resolver satisfatóriamente, voce tem muito ruído induzido, ou Algum dos famosos Loops de terra , cada caso tem um tratamento diferente.

 

Se tiver ruído induzido de 60 Hz, vai ter de caprichar bem mais no seu software.....

 

Se for Loop de terra, tem de melhorar o lay-out ou as conexões ( se for protoboard ) para eliminar.

 

Paulo

Cara, eu sair colocando capacitor em tudo kkkkkkkk E estabilizou legal, mas ainda está oscilando, vou tentar amanhã cedo colocar o capacitor na entrada ADC e reduzir o resistor como dito e ver o que vai acontecer, e torce pra ser isso, porque software ta bem complexo e acho bem difícil de ser, ja que realizei todos os teste e de todas as formas possíveis de conserta esse erro. Maaas obrigado, vou tentar isso ai. 

 

(os capacitores que coloquei foi na linha de 5V que alimenta todo o circuito)

 

adicionado 1 minuto depois
Em 27/05/2018 às 15:05, rodrigocirilo disse:

voce está imprimindo direto a leitura do ADC apos os calculos no LCD..voce  poderia tirar medias da leitura assim creio que ajude tambem..

eu tenho medo de perde um pouco da precisão da leitura com essas medias, ou eu to sendo ignorante e não tem nada a ver?

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, Luan Borges disse:

eu tenho medo de perde um pouco da precisão da leitura com essas medias, ou eu to sendo ignorante e não tem nada a ver?

 

Se você estiver usando a referência de 5V no adc, com 10 bits deveria poder medir cerca de 5/1023 = 4,9 milivolts .....  um simples ruído induzido de 20 milivolts ( o que é MUITO comum quando fazemos projetos simples ... ) fará sua leitura variar 5 unidades ..... e se estiver variando mais do que isso, o ruído é ainda maior.

 

Fazer várias leituras a todo instante e ir calculando a média a cada 8 ou 16 leituras vai te ajudar a chegar cada vez mais perto do valor real que deveria ser medido.

 

Por isso que eu disse antes lá em cima que a maneira correta de eliminar ruídos induzidos de 60 Hz era usando uma interrupção de um dos Timers ...  assim você faria 32 leituras ao longo do período da senóide de 60 Hz, e  iria somando as leituras e na média ( soma dividido por 32 ) esses ruídos induzidos iam se cancelar.

 

Simplesmente medir e apresentar no LCD é um erro primário, meu amigo. A melhor maneira é fazer várias leituras, mas não todas uma em seguida da outra, o ideal é sempre dar um tempo entre elas de maneira que entre a primeira e a ultima coincida com o período da senóide de 60 Hz (   16,67 milisegundos ) .

 

Sei que você não quer mexer no software, mas não vai conseguir estabilizar a leitura .... se você usar capacitores maiores na entrada do ADC vai melhorar, mas tem de tomar cuidado com a velocidade com que o sinal na entrada pode variar, versus a constante de tempo RC que está servindo de filtro na entrada do ADC !

 

Parece fácil né ? kkkkkkkkk

 

A prática vai te ajudar no aprendizado....

 

Paulo

 

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, aphawk disse:

 

Se você estiver usando a referência de 5V no adc, com 10 bits deveria poder medir cerca de 5/1023 = 4,9 milivolts .....  um simples ruído induzido de 20 milivolts ( o que é MUITO comum quando fazemos projetos simples ... ) fará sua leitura variar 5 unidades ..... e se estiver variando mais do que isso, o ruído é ainda maior.

 

Fazer várias leituras a todo instante e ir calculando a média a cada 8 ou 16 leituras vai te ajudar a chegar cada vez mais perto do valor real que deveria ser medido.

 

Por isso que eu disse antes lá em cima que a maneira correta de eliminar ruídos induzidos de 60 Hz era usando uma interrupção de um dos Timers ...  assim você faria 32 leituras ao longo do período da senóide de 60 Hz, e  iria somando as leituras e na média ( soma dividido por 32 ) esses ruídos induzidos iam se cancelar.

 

Simplesmente medir e apresentar no LCD é um erro primário, meu amigo. A melhor maneira é fazer várias leituras, mas não todas uma em seguida da outra, o ideal é sempre dar um tempo entre elas de maneira que entre a primeira e a ultima coincida com o período da senóide de 60 Hz (   16,67 milisegundos ) .

 

Sei que você não quer mexer no software, mas não vai conseguir estabilizar a leitura .... se você usar capacitores maiores na entrada do ADC vai melhorar, mas tem de tomar cuidado com a velocidade com que o sinal na entrada pode variar, versus a constante de tempo RC que está servindo de filtro na entrada do ADC !

 

Parece fácil né ? kkkkkkkkk

 

A prática vai te ajudar no aprendizado....

 

Paulo

 

 

 

 

void bateria()
{

  limpar_lcd();

     switch(screen2)
     {
     case 0x01:BatTemp();break;
     case 0x02:BatTensao();break;
     default:


      //== VOLTS
      
      
      
        Media = 0;
        for(y=0;y<=38;y++){
            delay_us(100);
            Media = Media + adc_get_sample(0);}
       q1 = (media/38);
       p1 =(q1*5)/1024.0;
       q2 = p1*3.1;

       
       
       
       
       
       FloatToStr_FixLen(q2,txt,5);
       lcd_out(1,1,"BATERIA:");
       Lcd_out(2,11,txt);
       Lcd_Chr_Cp('v');


    //PORCENTAGEM DA BATERIA
      leitura = adc_get_sample(0);
      lp  = (leitura*5)/1023.0;
      lp2 = lp*100-400;
      if(lp2 < 1)lp2 = 0x00;

      ByteToStrWithZeros (lp2,txt70);
      Lcd_out(1,11,txt70);
      Lcd_Chr_Cp('%');

 

 

    //CARREGADOR
    if(q2 > 14.89){ch = 0x00; D1 = 0x00;}
    if(q2 < 13.40) {ch = 0x01;D1 = 0x01; }

 


    //ICONE DE "CARREGANDO"
    if(D1)
    CustomChar2(1,16);
    bats++;

    if(bats >5) bats = 0x00;
    if(q2 <= 6.65){fl = 0x01;bst= 0x01;}
    else if(q2 >= 12.00) bst = 0x00;


    //==== ENCONOMIA DE BATERIA
    if(q2 < 11.7)DL = 0x00;
    else DL = 0x01;

 

 

    //TENSÃO MINIMA DA BATERIA REGISTRADA
    if(q2 < batm) batm = q2;
    else batmn = batmn;
    //TENSÃO MÁXIMA DA BATERIA REGISTRADA
    if(q2 > batmn) batmn = q2;
    else batm = batm;


                          ;break;
 }
}

 

///================================

 

eu fiz assim

 

 Eu deu uma procurada sobre a media, confesso que não vi muita diferencia, vou testa agora nesse momento a sua dica dos resistores e  o capacitor  e ver o que rola 

adicionado 41 minutos depois

Fiz os teste aqui, e olha, vou ter que ver o software mesmo (eu acho) fiz o que você pediu pra eu fazer, tá melhor? Tá, mas ainda a oscilação está grande.

 

Mas eu notei uma coisa bem interessante, a maior leitura que ele faz, é a mesma que dar no montimetro, que nem agora, está dando cerca de 14.27(no montimetro) e já no pic, dar exatamente 14.28. E esssa leitura, fica por alguns ms e sai, mas não passa disso, no caso, ele oscila pra menos, tipo, 14.29....14.20....14.21.... Mas não passa dos 14.29, e tem vez que cai pra casa dos 13V mas é bem rápido isso, e volta a oscilar na entre os 14.29 e 14.10.

 

Coloquei um delay ali dentro de 200Ms 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Não adianta essa maneira de calcular a média. A maneira correta é a que eu falei acima , fazer várias leituras DENTRO do tempo de 1/60 segundos.

 

Fazer várias a cada 200 mseg não resolve nada.

 

Eu não programo em C, então não posso te ajudar no software, mas ajudo nos conceitos.

 

Coloca logo o resistor e o capacitor , e veja se estabilizou.

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, aphawk disse:

@Luan Borges ,

 

Não adianta essa maneira de calcular a média. A maneira correta é a que eu falei acima , fazer várias leituras DENTRO do tempo de 1/60 segundos.

 

Fazer várias a cada 200 mseg não resolve nada.

 

Eu não programo em C, então não posso te ajudar no software, mas ajudo nos conceitos.

 

Coloca logo o resistor e o capacitor , e veja se estabilizou.

 

Paulo

Então Paulo, eu coloquei, continua na mesma, como funcionaria essa de 1/60 segundos? Não entendi muito bem 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que foi em? kkkkk O que eu fiz, como estava pra joga fogo em tudo, eu resolvi desmontar a proto, e refazer todas as ligações, com um porém, como a proto tem duas linhas de tensão(uma em casa lado dela) um lado eu vou deixa por ser responsável apenas para alimentação dos dois PIC, e o GND da bateria e o Positivo do LM35, e no outro lado da proto vou deixa o restante ligado, (leds, mosfets, transistores, teclado, LCD e etc..) E nas extremidades  dessas linhas, eu fiz a ligação, interligando as duas. Olhaaaaa até agora eu só to com o 4550 ligado na proto, fazendo todas as funções que o programei para fazer, e estabilizou LEGAAAAAL kkkk (to feliz, serio). Eu vou ligar o outro pic que está responsável pelo bluetooth e ver ser vai continuar a mesma coisa. E posto o resultado aqui.

 

 

 

Segue as imagens para ver como tava e como to deixando. 

 

a segunda é de como  estava 

86591582-2627-4d07-ab1a-34947ea9fa31.jpg

2aea29bd-1193-4a6d-aeb3-8e8b9637acff.jpg

adicionado 0 minutos depois

Acho que foi em? kkkkk O que eu fiz, como estava pra joga fogo em tudo, eu resolvi desmontar a proto, e refazer todas as ligações, com um porém, como a proto tem duas linhas de tensão(uma em casa lado dela) um lado eu vou deixa por ser responsável apenas para alimentação dos dois PIC, e o GND da bateria e o Positivo do LM35, e no outro lado da proto vou deixa o restante ligado, (leds, mosfets, transistores, teclado, LCD e etc..) E nas extremidades  dessas linhas, eu fiz a ligação, interligando as duas. Olhaaaaa até agora eu só to com o 4550 ligado na proto, fazendo todas as funções que o programei para fazer, e estabilizou LEGAAAAAL kkkk (to feliz, serio). Eu vou ligar o outro pic que está responsável pelo bluetooth e ver ser vai continuar a mesma coisa. E posto o resultado aqui.

 

 

 

Segue as imagens para ver como tava e como to deixando. 

 

a segunda é de como  estava 

Compartilhar este post


Link para o post
Compartilhar em outros sites

como eu posso saber se meu LCD queimou? Ele só fica aparecendo aqueles quadrados, e sem querer um fio d bateria bateu na proto, não sei onde, mas quando liguei, o LCD tava meio doido e não apareceu mais nada, porém o resto está tudo ok

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Uau que bela teia de aranha esse protoboard kkkkk

 

Bom se estabilizou menos mal assim você nao precisa mexer no software.

 

Agora, o LCD .... geralmente isso de acender caracteres estranhos costuma ser mau contato ou algum fio que escapou.

 

Não tem outra maneira de saber se pifou... 

 

Se a leitura que você estava querendo estabilizar é a saída do LM35, basta um capacitor de 47 uF e pronto kkkkkk  

 

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites
20 minutos atrás, aphawk disse:

@Luan Borges ,

 

Uau que bela teia de aranha esse protoboard kkkkk

 

Bom se estabilizou menos mal assim você nao precisa mexer no software.

 

Agora, o LCD .... geralmente isso de acender caracteres estranhos costuma ser mau contato ou algum fio que escapou.

 

Não tem outra maneira de saber se pifou... 

 

Se a leitura que você estava querendo estabilizar é a saída do LM35, basta um capacitor de 47 uF e pronto kkkkkk  

 

Paulo

Estabilizou siim, mas quando ligo o pic18f46k20, bagunça tudo, vou usar o ponto de  referencia externo, e tenho certeza q vai dar certo, já pensei em um jeito de bolar o circuito pra fica 100%, ja que agora tenho certeza que é hardware, e o porque de não ter estabilizado.  

 

Mas não por agora né, já que queimei meu LDC e não tem como ficar vendo certinho a tensão kkkkkkkkk </3

 

 

Mas obrigado pela sua atenção. valeu obrigado 

Compartilhar este post


Link para o post
Compartilhar em outros sites
27 minutos atrás, Luan Borges disse:

Estabilizou siim, mas quando ligo o pic18f46k20, bagunça tudo, vou usar o ponto de  referencia externo, e tenho certeza q vai dar certo, já pensei em um jeito de bolar o circuito pra fica 100%, ja que agora tenho certeza que é hardware, e o porque de não ter estabilizado.  

 

A referência de GND para o conversor A/D é muito importante. A maioria dos Pics possuem dois sistemas de GND , um para a parte digital, e outro para a  parte analógica. Como não uso Pics desde 2010, não conheço esses que você está usando.

 

Separe ambos, e una os dois apenas no local de entrada do GND que vem da fonte de alimentação.

é importante também usar um pequeno capacitor de 10 ou 100 nF na referencia de tensão do conversor A/D.

 

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×