Ir ao conteúdo
  • Cadastre-se

Leitura analógica PIC16F886


Posts recomendados

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);
 
}
 
}
Link para o comentário
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

Link para o comentário
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!
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...