Ir ao conteúdo
  • Cadastre-se
Vinicius Cintra

Leitura analógica PIC16F886

Recommended Posts

Boa tarde

 

 Estou tentando fazer uma leitura analógica de um potenciômetro através do microcontrolador PIC16F886, entretanto o resultado que ele responde é apenas 0.

Quero usar as portas B1,B2 e B3 como sendo estas entradas.

 

Código:

 

#include <16F886.h>
#device adc=10
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
 
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
 
 
float leitura,leitura2,leitura3;
 
void main()
{
 
   setup_adc_ports(ALL_ANALOG | VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
 
while(1){
 
 set_adc_channel(sAN8);
 delay_ms(20);
 leitura = read_adc();
 delay_ms(100);
 set_adc_channel(sAN9);
 delay_ms(20);
 leitura2=read_adc();
 delay_ms(100);
 set_adc_channel(sAN10);
 delay_ms(20);
 leitura3=read_adc();
 delay_ms(100);
 
 leitura = 5*leitura/1023;
 leitura2 = 5*leitura2/1023;
 leitura3 = 5*leitura3/1023;
 printf("\r\nleitura= %f",leitura);
 delay_ms(1000);
 printf("\r\nleitura2= %f",leitura2);
 delay_ms(1000);
 printf("\r\nleitura3= %f",leitura3);
 delay_ms(1000);
 
}
 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Vinicius Cintra

Seu código não está o mais otimizado, mas deveria funcionar. Te pergunto como ligou o potenciômetro no PIC.

Outra coisa é como q você está vendo o resultado? Está usando o terminal do Proteus? Como está as ligações?

O Pic foi configurado para 8 MHz no Proteus também?

Não utilize essa linha: setup_adc(ADC_CLOCK_INTERNAL);

O tempo da captura do capacitor do AD não está suficiente. Veja no cabeçalho do PIC usado as opções de dividir o clock do AD.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Vinicius Cintra

Me lembrei de um detalhe e acho q vai resolver seu problema.

Na linha:

leitura = 5*leitura/1023

Troque por:

leitura = 5*leitura/1023.0

Ou

leitura = 5.0*leitura/1023

Ou

leitura = (float) (5*leitura/1023)

Testa em todas as divisões.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

@MatheusLPS

 

Fiz as modificações que você sugeriu, entretanto não mudou o resultado.

Mais consegui fazer funcionar, o erro estava nas linhas onde eu colocava "set_adc_channel(__);"

Mudei e ficou funcionando assim:

 

 set_adc_channel(8);
 delay_ms(10);
 leitura = read_adc();
 delay_ms(100);
 set_adc_channel(9);
 delay_ms(10);
 leitura2=read_adc();
 delay_ms(100);
 set_adc_channel(10);
 delay_ms(10);
 leitura3=read_adc();
 delay_ms(100);
 
Também modifiquei a conversão da forma com que você sugeriu, acredito que fica melhor mesmo.
 
Obrigado!

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

×