Precisão do AD variando quando varia a amostragem

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor geraldomelo » 29 Jul 2008 03:16

Pessoal , agora demorei bastante para responder , pois estava esperando o meu scope chegar para realizar os testes ....bom , testes realizados com o scope para verificar ruidos ; tinha um ruido em um canal que eu resolvi , mas ai que tá , mesmo assim o problema continuava ... a falta de linearidade .... se vcs perceberem nas tabelas o negócio eh exponencial ... ... bom , então eu decobri a pegadinha , mas confesso que não entendi ... quebrem a cabeça agora ... se quiserem né ... hehe ... eh o seguinte :

reparem então de novo no programa :

t=16;
while(t)
{
set_adc_channel(0);
delay_us(40);
tensao=read_adc();
set_adc_channel(1);
delay_us(40);
corrente=read_adc();
tensao_total=tensao_total+tensao;
corrente_total=corrente_total+corrente;
t--; }

tensao_total=tensao_total/16;
corrente_total=corrente_total/16; }

então fiz o seguinte ... tirei o read_adc , e coloquei valores fixos para a variavel tensão ... então coloquei
tensão =200;
o resultado logicamente teria que ser 200 depois das 16 iterações , mas não , era 202 , e pra piorar , quando eu colocava um valor mais alto , tipo tensão = 900; o valor depois das iterações era tipo 915 ... pronto , tava ai o problema , e também a variação exponencial ... ... só resolvi quando coloquei mais uma variavel lá embaixo , quando efetuava a divisão para obter a média ... então isso não funcionava :


tensao_total=tensao_total/16; ... isso dá o problema

já assim fica perfeito e linear :

nova_variavel=tensão_total/16 ...

heheheheh agora pessoal ... qual o problema/erro de lógica tem ai , e mesmo assim , dá uma variação exponencial pq ??? agora só vcs mesmo que são mais experto que eu .. hehehe

abs.

geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor Jorge_Francisco » 29 Jul 2008 11:41

Configurou o adc em quantos bits? se fosse em 10 bits ia precisar para fazer a média de uma variavel com tamanho de no minimo= 10*16(interações) bytes,ou seja, um int16 resolveria.

Sem contar que não postou se está zerando as variaveis antes da soma e da média. Porque não posta o código completo incluindo as declarações?Poderia ajudar bastante.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 29 Jul 2008 11:50

Tenta assim:

Código: Selecionar todos
int i, media_tensao=0,media_corrente=0;
int16 tensao_total,corrente_total;

tensao_total = 0;
corrente_total = 0;

media_tensao = 0;
media_corrente=0

for(i=0;i<16;i++)
{
set_adc_channel(0);
delay_us(40);
tensao=read_adc();

set_adc_channel(1);
delay_us(40);
corrente=read_adc();

tensao_total=tensao_total+tensao;
corrente_total=corrente_total+corrente;
}

media_tensao =  tensao_total/16;
media_corrente = corrente_total/16;

Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x