por ze » 16 Jul 2007 13:08
Além do tradicional filtro rc na entrada ad (quase que obrigatório) pode tentar algo como (filtro digital por sw):
unsigned int adc_read(unsigned char channel)
{
unsigned int soma;
unsigned char j,ch;
ch=channel;
soma=0;
//---------filtro---------
for (j=0;j<60;j++)
{
ch=channel;
ADCON0 = (ch << 3) + 0x81; // hab ADC, fosc/32
ADGO = 1;
while(ADGO); // aguarda conversão
soma+=(ADRESH*256 + ADRESL);
}
return soma/60;
}
A rotina acima faz 60 conversões e retorna a média delas.
Quanto maior o número de conv. melhor, mas o tempo de conv. aumenta.
Foi feita para sinal DC - termopar - que não precisa de velocidade de conversão.
Abraço....