Ir ao conteúdo
  • Cadastre-se

Instabilidade em leitura com an0 e an1 em pic


Posts recomendados

Boa noite.

Estou precisando de  ajuda com um voltímetro duplo com o pic16f876a, onde uso 6 displays led, sendo que três no canal an0 para leitura de tensão e três no an1 também para leitura de tensão. Ocorre que quando uso um só canal no programa a conversão ocorre normal, tanto em an0 e an1, se uso os dois  há uma  mistura nos canais. Se an0 está com 3v e an1 com 0v os displays apresentam 043 e 000. segue o programa.

include<16f876a.h>
#device ADC=10
#use delay( clock=8000000)
#fuses HS,NOWDT,PUT,BROWNOUT,NOWDT

int clock=0;
int16 d1, d2, d3, d4, d5, d6;

int digito[10]={

 

                 0b11000000 // 0
                 0b11111001 // 1
                 0b10100100 // 2
                 0b10110000 // 3
                 0b10011001 // 4
                 0b10010010 // 5
                 0b10000010 // 6
                 0b11111000 // 7
                 0b10000000 // 8
                 0b10010000 // 9
};

#INT_RTCC
void trata_t0 ()

{
clock++;
if (clock>6) clock=1;

switch(clock)
{
            case 1:  output_C(digito[d1]) | (0b01111111);
                     output_C(digito[d1]);
                     output_B(0b00000001);
                     Break;

 

            case 2: output_C(digito[d2]);
                    output_B(0b00000010);

                     break;

            case 3:  output_C(digito [d3]);
                     output_B(0b00000100);
                     BREAK;

            case 4:  output_C(digito[d4]);
                     output_B(0b00001000);
                     BREAK;

            case 5:  output_C(digito[d5]);
                     output_B(0b00010000);
                     BREAK;

            case 6:  output_C(digito[d6]);
                     output_B(0b00100000);
                     BREAK;
}
  SET_TIMER0(25);

}
 void volt (){
 int32 adc;
{
SET_ADC_CHANNEL(0);
adc=READ_ADC();
adc=(adc*2500)/1023;
delay_us(10);

       d1= adc/1000;
       d2= (adc/100)%10;
       d3= (adc/10)%10;
       delay_ms (10);
}
}

void amp ()
{int32  adc1;

{
SET_ADC_CHANNEL(1);
adc1=READ_ADC();
adc1=(adc1*2500)/1023;
delay_us(10);

       d4= adc1/1000;
       d5= (adc1/100)%10;
       d6= (adc1/10)%10;
       delay_ms (10);
}}

void main()
{
 set_tris_A(0b00000011);
 set_tris_B(0b00000000);
 set_tris_C(0b00000000);
ENABLE_INTERRUPTS(GLOBAL|INT_TIMER0);
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_16);
SET_TIMER0(100);

 setup_ADC_ports(AN0_AN1_AN3);
 setup_ADC(ADC_CLOCK_INTERNAL);
 delay_us(10);

 

 while(true)
{

 

 

volt();
 delay_ms (500);
amp();
delay_ms(500);
 }
}

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Perdao nao entendi. Nao era isso que tinha que ocorrer mesmo?

Se an0 está com 3v e an1 com 0v os displays apresentam 043 e 000.

 

E você nao precisa usar variavel de 32 bits sabia? Tente usnigned int. No caso da tabela, nem de 16. Tente unsigned char

abç

Link para o comentário
Compartilhar em outros sites

Olá Isadora, obrigado pela resposta.

                         Não é o que deveria acontecer; vou explicar melhor. tenho 6 displays com seus segmentos ligados em C e  seus catodos controlados B . No programa  ds1~3 estão em an0 e ds4~6 em an1.  O que está acontecendo que quando  coloco uma tensão ( Ex. 5V.) em an0 com an1 desligado, a tensão aparece correta, mas quando ligo an1 a tensão apresentada  vai para 0043 e em an1 fica em 0000. e vice e versa. Vou fazer as mudanças que sugeriu, vou postar os resultados, segue em anexo o esquema.


Desculpe , anexei o arquivo errado.  

Duplo Volt 3+3 dg.txt

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Agora que percebi. Do jeito que está fazendo precisa sim ser 32 bits. Mas não necessariamente. Digamos que quando 5V (1023) você vai querer 500 (5.00) no display. Tente fazer

...unsigned int adc1;...adc1=READ_ADC()/2.046;...

O compilador vai xiar mas deve dar um resultado aceitável.

Só que só isso não deve resolver seu problema. Dê uma analisada no circuito principalmente no gnd analógico e gnd digital. Sim é a lesma lerda mas veja as conexões principalmente se estiver em protoboard


Outra coisa, não entendo (e não quero) este compilador e não sei como ele faz o mc reagir. Mas aparentemente você seta e lê imediatamente o canal depois. Tente dar um tempo entre um e outro

Link para o comentário
Compartilhar em outros sites

@Reipas,

 

Uma pergunta, qual o valor das resistências ligadas aos pinos an0 e an1 ? Uma boa recomendação é nunca ultrapassar cerca de 5K ohms. Se usar valores maiores, existe um efeito RC interno ao Pic que pode fazer exatamente esse tipo de problema....

 

Uma coisa que pode ajudar é colocar um delay entre o SET_ADC_CHANNEL e o comando seguinte que é o READ_ADC. Experimente um delay de uns 20 milisegundos para começar.

 

Paulo

Link para o comentário
Compartilhar em outros sites

@Reipas,

 

Uma pergunta, qual o valor das resistências ligadas aos pinos an0 e an1 ? Uma boa recomendação é nunca ultrapassar cerca de 5K ohms. Se usar valores maiores, existe um efeito RC interno ao Pic que pode fazer exatamente esse tipo de problema....

 

Uma coisa que pode ajudar é colocar um delay entre o SET_ADC_CHANNEL e o comando seguinte que é o READ_ADC. Experimente um delay de uns 20 milisegundos para começar.

 

Paulo

Boa noite Paulo.

Estou usando um resistor de 22k pois as tensões a serem lidas são de 16V. vou fazer as modificações que sugeriu e postar o resultado junto com o diagrama, assim que possível. obrigado pela atenção

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

pow @aphawk ! eu deixo subentendido e você literaliza!!? Dar o peixe ou ensinar a pescar? kk brinc.

Algo que pode ajudar é você colocar um capacitor eletrolítico chute 10uF pertin das entradas an. Pro gnd claro. E no PINO gnd do mc não do 7805

Algo me diz que mastigamos d+

abç

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz,

 

kkkkk eu ia dizer esse post apenas com os resistores, normalmente eu espero o pessoal falar antes porque já esquecí quase tudo que sabia de Pic.....aí como ninguém deu o palpite, resolví entrar de abelhudo .... mas depois que olhei esse código em C percebí que esse comando SET_ADC_CHANNEL pode reconfigurar tudo de novo para cada canal selecionado, e a leitura feita logo em seguida poderia estar compromentendo o tempo de carregamento do capacitor interno do conversor A/D .... se for isso mesmo que imaginei, o problema pode ser exatamente esse. Vamos esperar e ver se deu certo....

 

Paulo

Link para o comentário
Compartilhar em outros sites

Boa tarde, desculpem a demora é que só tenho tempo no final de semana.

 

Fiz as alterações que a Isadora recomendou. O GND bem próximo do micro e a colocação dos capacitores nas entradas.

Também reduzi o valor do resistor para 4k7 nas entradas, coloquei um resistor de 820R das entradas para o GND e em paralelo

com este o capacitor eletrolítico de 100uf x 35V. A faixa de tensão que devo monitorar é 0 ~ 18V. Nos testes que fiz hoje; a tensão

lida em an0 ficou estável e precisa já em an1 notei uma diferença de -0,8V , os resistores usados são de 5% talvez ai a diferença.

e no programa  coloque o delay de 50ms.

 

Portanto dou como resolvido;

e agradeço a colaboração da Isadora e do Paulo.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!