Precisão do AD variando quando varia a amostragem

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Precisão do AD variando quando varia a amostragem

Mensagempor geraldomelo » 24 Jun 2008 05:39

bom pessoal , conforme prometido , mais bucha ... hehe ..

vamos lá.. estou usando o ad do pic16f876 com Vref.. .....minha referencia (pino an3) eu liguei diretamente no V+ do pic ... então vamos lá :

Valor da tensão medida no pino Vref : 5.03V portanto :
5.03 / 1023 = 0,0049 V para cada unidade do AD .

o fragmento do programa que faz as amostragens do ad estão aqui :

void le_ad (void)

{
int t;
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; }



os problemas começam aqui ... com essas 16 amostragens , quando o valor do AD esta em 100 , que teria que ser 0,49 V , a tensão medida com o multimetro no pino de entrada do AD eh 0,47V .... O problema vai se agravando ao passo que eu vou aumentando as amostragens .. se eu faço 64 amostragens , ai o valor bate , mas só para o valor 100 do ad ,conforme explico mais a frente . só que se eu faço por exemplo 128 , ou mesmo 512 amostragens ( lógico que mudo as variaveis para int32) esse valor de tensão vai subindo tbm .. com 128 amostras , ele tem 0,50V no pino do ad , mostrando no LCD o valor 100 para o ad ... bom , o pior ainda vem . se eu for aumentando a tensão , ai o negócio além de impreciso , não eh linear ... .. então aqui vai uma tabelinha dos valores para 64 amostragens ..

Valor AD ------Tensão teorica -------- tensão medida

34 ------------ 0,167 --------------- 0,175
100 ----------- 0,491 ---------------- 0,492
200 ----------- 0,983 ------------------ 0,978
300 ----------- 1,475 ----------------- 1,467
500 ------------ 2,458 ----------------- 2,431
700 ------------ 3,441 ------------------- 3,400
900 --------------4,420 ------------------- 4,340

*tensão teorica eh o valor do AD x 0,0049V e a tensão medida eh a tensão medida na entrada do pino do AD .


ou seja ... no inicio , a precisão eh aceitavel , mas vai chegando pro final , fica muito ruim ...

e agora pessoal ... alguma idéia ... qq pode tá acontecendo ??? alguém ajuda ??? ah , fora que esta fora de cogitação né ter que fazer 512 amostragens para obter uma precisão do AD , mas que mesmo assim não adianta , pois não tá sendo linear .... sei que posso ajustar a curva com uma formula , mas acho que não seria o caso , pois então eu não posso confiar nos parametros do AD do Pic então ... e pior, o AD não eh linear ??? ai enrolou ... ... Alguém ai ajuda ???

abs

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

Mensagempor EDSONCAN » 24 Jun 2008 06:50

Repete o teste lendo somente um canal e portanto não chavendo entre o canal 1 e 0.

Edson

set_adc_channel(0);
{
delay_us(40);
tensao=read_adc();
//tensao_total=tensao_total+tensao;
}
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor guest2003 » 24 Jun 2008 07:18

Fala Geraldo,

Linear, linear... nenhum AD realmente é... todos tem um certo desvio, sempre especificado os valores das imperfeicoes maximas no datasheet, normalmente flutuações de 1LSB são comuns.

Como diria o Jack, vamos por partes !

1- Que multimetro você esta usando ?!? Pode confiar totalmente nele como parametro ?? (Não se esqueça que o proprio multimetro tem problemas de linearidade e precisão tambem... mas vamos supor que seja um Fluke ai da pra confiar e usar como parametro :) )

2- Sua fonte é MUITO bem filtrada ? pois como você quer os 10 Bits mesmo qualquer flutuação da fonte influencia MUITO a medida, o ideal seria usar um zener de precisão para isso (bandgap). Ou se for usar o VCC mesmo configure isso no PIC para ele interligar internamente.. ai não precisa ligar o pino Vref externamente.

3- Veja por exemplo, você diz Vcc = 5.03, ai para 100ad temos 0,4917V supondo que sua fonte flutue para Vcc = 5.00, o que é perfeitamente normal (com um 7805 da vida por ex) ai para 100ad temos 0,4887V

4- Como não conheco o circuito em questão, fica um pouco dificil dizer mais coisas... mas vamos supor que seja uma fonte ou algo parecido (pois você mede corrente e tensão) Esta variação pode estar ligada ao aumento de carga, e como a regulação (quanto a saida varia de acordo com a entrada) do 7805 nao é la estas coisas, mais uma vez podemos entender que a fonte esteja sendo a raiz de todos os males :)

5- Sim ! quanto maior o numero de amostras maior a precisão de sua medida... se bem que ai entramos em outros problemas, como por exemplo, dependendo da frequencia do ruido, e do tempo das amostragens, fazer media pode nao adiantar nada... mas acho que esse nao é o caso.

6- Vale a pena da uma boa lida no datasheet, pois alguns parametros podem ajudar no aumento da precisão do AD, como impedancia de entrada, frequencia do OSC do AD que voce selecionou, etc.

ultima coisa, ufa :) Você REALMENTE precisa ficar chaveando entre os canais !?!? Não pode ler as 16 amostras de tensão e em seguida chavear ler as 16 de corrente !?!? Eu particularmente não gosto muito desse negocio de ficar chaveando a entrada do AD entre as medidas... (mas acho que isso não seria o causador do problema nao... apenas uma melhoria extra)

Bom eh por ai... são apenas uma ideias de onde vc pode investigar.

qquer coisa estamos por ae...

[]'s
Marcelo
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor ze » 24 Jun 2008 07:41

olá
+0: ler 1 canal 16x /16 por vez pode ajudar. como é int creio que pode ler 64x /64.
+1: se for dc pode colocar [resistor tip 1k +] capacitor [1+u]na entrada do ad pertim do pic.
+1:pra ler com multimetro, o gnd do mult deve estar no pino do pic.
+1:que seu 5V seja EXCLUSIVO pro pic + ad (ampop, etc). Use outro 5V pra gentalha (display, leds, comunicação, chaves, etc)
+1:se estiver em proto board, careful e vale a seguinte tbém:
+1:se estiver em pci, trilhas exclusivas pro circuito ANAL[lógico!]: sem passar correntes de outros setores.
+0: pra mim aquela sua leitura já está boa!

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 24 Jun 2008 08:40

ram ram ,, licença........

jenti, ja sufri muitisssiiimu cuiso..

Sabe o que passa, o AD em 10 bitus tem precisão de +/- 1 LSB dependendo da velocidade, o mardito do Mult_32_32 dos compiladores, enquato carcula X / 128 ou que seja, vai quebrando da seguinte forma.

101,3 << resu teorico |||| 101 << real
101,5 << resu teorico |||| 102 << real.

passou de =>0.5 intão é valor mais 1.

Se nao quer passar muita raiva com o AD do pic. Sugiro trabalhar com V ref que de valores exatos ex. 2mV,4mV etc.

E tomar muito cuidado da forma que esta a fazer para converter digital em String´s para amostragem no display, dependendo da conversão inplicita ele arredonda pra mais ou pra menos também.

Use V ref da micoxipe, pra Ad do pic eu só estou usando 4.096V que é encontravel. existe de 2.048 mais esse eu não achei em lugar algum.


Fabim
Editado pela última vez por fabim em 24 Jun 2008 10:47, em um total de 1 vez.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Orcino » 24 Jun 2008 08:46

Outra coisa Geraldo, pra vc ter uma precisão nas medidas use um CI especifico p/ gerar a tensão de referência como o TL431 e se os sinais a serem medidos são baixos utilize um VREF de 2.5v , o ideal é trabalhar no meio da faixa.

Orcino
Orcino
Bit
 
Mensagens: 19
Registrado em: 06 Dez 2006 22:07

Mensagempor xultz » 24 Jun 2008 10:38

Quando eu li pela primeira vez no datasheet do AD7730 que ele chega a ter 15 bits e meio de precisão, eu pensei "meio bit? cara, ferrou tudo agora..."
Mexer com AD e instrumentação é dor de cabeça na certa. Aliás, mexer com eletrônica dá sempre nisso...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor EDSONCAN » 24 Jun 2008 13:33

Faz um leitor de temperatura ou uma balança com 22 bits, ai fica divertido.

Edosn
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor Budweiser » 29 Jun 2008 01:07

Também quero dar pitaco!!!!

E o Vref- tah aonde? Em alguns datasheets é muito recomendável usar os pinos Vref+ e Vref- (AN0 e AN1 em alugns dsPIC/PIC) com um resistor de 10R em série e capacitores de desacoplamento...

Você disse que é 10 bits? Quando o AD é 10 bits ele não faz aquisição simultânea? Dai não precisava ficar chaveando... Ou usa o scan automático... Os valores estarão em ADCBUF0, ADCBUF1, ...

E, é claro, fazer divisões é sempre um problema... Você começa com um inteiro e terminará também com um inteiro...

Espero ter ajudado...
Abraços!
Budweiser
Nibble
 
Mensagens: 68
Registrado em: 28 Mar 2008 15:37
Localização: Florianópolis - SC

Mensagempor MOR_AL » 29 Jun 2008 07:37

Bom. Enquanto o Geraldo não se manifesta, eu também quero dar um pitaco!!! Hehe! :lol:

Se a suas amostragens ocorrerem em um tempo reduzido, digamos cerca de 1 ms, e as médias dos resultados entre dois ou mais grupos de amostragens forem bem diferentes (mais de 1% para CAD de 10 bits), então é ruído ou na referência ou na tensão a ser amostrada. E este ruído não é aleatório, pois se fosse, o valor da média tenderia a convergir para um valor fixo.

1 - Tente colocar os terras do circuito do CAD para um ponto só. Sem criar loops de terra.
2 - Filtre a tensão de referência que está retirada diretamente da alimentação do PIC. Coloque um filtro RC. Não sei qual seria a resistência máxima permitida para a entrada Vref, mas se der para colocar um resistor de 10k, use um capacitor de 100.000pf, aqueles para desacoplamento. A constante de tempo deste filtro seria de
"tal = 1e4 * 1e-7 = 1e-3".
Isso dá uma frequência de corte superior de 160 Hz. Se o valor do resistor for proibitivo, coloque um eletrolítico de 10uF em paralelo com o capacitor de 100nF e reduza o valor do resistor para um valor aceitável.
3 - O PIC tem um capacitor de 100nF junto ao Vcc e o terra?

Refaça as medidas. Com o aumento do número de amostragens o valor da média tem que "melhorar". O "Desvio Padrão" tem que diminuir.

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor geraldomelo » 01 Jul 2008 07:07

Bom pessoal , então vamos lá .. respondendo um a um ..

- fiz o teste como mandaram , chaveando somente um canal ... nada aconteceu .. não fez diferença nenhuma , mas mesmo assim , eu deixei lendo primeiro um canal , depois chaveando e lendo o outro .

O multimetro que estou utilizando não eh um fluke , mas ele tem ainda uma casa decimal a mais para as medidas em questão , e também usei um segundo multimetro e os resultados foram semelhantes .

Minha fonte está filtrada , não sei se está muito bem , mas acho que não vem muito ao caso , pois estou fazendo essas medidas com e sem carga e os resultados são os mesmos. e já respondendo a seguintes questões : a placa com o pic tem alimentação só dela e alimenta só o LCD ... o AO , tbm tá em outra plaquinha , onde vem alimentação só pra ele tbm atraves de outro regulador (7812) e quando faço as medidas , para valores baixos e para valores maiores de tensão na saida , tbm vou sempre verificando o V ref , que nunca está sempre cravado em 5.03 V ..

Sim , eh uma fonte , mas quanto a carga , tbm acho que não tem muito haver , pois estou fazendo as medições com e sem carga .. O Vref não muda como já disse , pois está com um regulador só para a plaquinha do pic e ele dá sempre os 5.03 com ou sem carga , para a alimentar o pic e tbm para o Vref.

5 - Quanto o maior numero de amostras , maior a precisão de minha medida ..... AQUI QUE ESTA O PROBLEMA ... quanto mais eu aumento o numero de minhas amostragens , mais ele vai aumentando a constante de multiplicação do AD ...

+1 .. ler 16/16 .. até 64/64 ... aqui que está o problema ... quando altero isso , altera a sua linearidade ..

+1 vou testar com esse resistor +capacitor de 1uf .. depois falo os resultados ..

+1 estou lendo os valores com o multimetro nas patas do pic e tbm antes, nas entradas e as tensões são as mesmas .. não muda ...... 5V esta exclusivo , não esta na protoboard , tá na pci interia só para o pic , e outra só para o AO .. outra para a fonte e demais ..

Fabim , entedo seu raciocínio , mas esse resto eh acumulativo ?? se for , pode ser ai o problema , mas se não , acho que tbm não eh por ai , pois como eu disse , no começo da escala , quase não tem erro , e no final , o erro eh bem grande , vai aumentando ... o problema de linearidade que eu to falando , e que não eh pequeno como disseram , e também aqui no caso , tá variando , conforme vario a quantidade de amostragens , mas que , quanto maior o numero de amostragens também não esta convergindo para uma linearidade , e sim , para um erro em outra faixa de leitura .. (COMPLICADO !!!!!!) ..

Não estou convertendo para string , estou mostrando os valores das variaveis mesmo .... não estou usando o Vref. como já dito , mas a referencia não esta variando conforme já disse .

Orcino , para toda a minha faixa de leitura , o Vref fica em 5.03

BUD ... do jeito que está configurado , o Vref - , está ligado internamente ao Vss ..

Mor_al .. entendi seu raciocinio ... pode ser que seja isso ... não tenho um osciloscópio por aqui para ver se tem esses ruidos mesmo , mas pode se considerar essa idéia ... vou testar aqui como vc disse ..

bom , fiz umas tabelas de medidas aqui , mas não vou colocar inteiras , vou colocar apenas a primeira e ultima leitura para as seguintes situações :

aqui foram feitas 16 amostragens ... percebam que já esta fora , pois 5,03V/1023=0,0049 e como o ad tá em 104 , era pra ter na entrada 0,512V ... percebam também , que para ter 0,487V na entrada do ad , o valor dele teria que ser menor que 100 .. :

Valor do AD----tensão medida na entrada do ad-----tensão q deveria ser
104 0,487V 0,512
.
.
.
904 4,170V 4,453

percebam que a diferença aumenta demais aqui no final ..

bom ... eh isso .... to vendo que vou ter que fazer uma gambiarra tipo y=Ax+B para corrigir isso ... mas que tá errado tá ...

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

Mensagempor fabim » 01 Jul 2008 08:10

bom experimenta fazer esse calculo aqui, mais nao sei como é definido em C.

var
X : real;
y : real;
z : word;
u : string[0...5];

begin
Z := adc_read(canal)-1;
X := 5.00/1024.00; //primeiro tente 5.00 veja resul, depois apenas 5 ;
Y := z * X;
z := Y;

IntToStr(z,u);
u[5] := u[4];
u[4] := u[3];
u[3] := u[2];
u[2] := u[1];
u[1] := '.' ;

lcd_out(1,1,u);

Veja os resultados no lcd e compare com os resultados anteriores.


Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Sergio38br » 01 Jul 2008 08:40

Vc sabe qual a impedancia do circuito que vc esta medindo??

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor MOR_AL » 01 Jul 2008 17:42

Olá geraldomelo.

Se você precisar apenas mostrar em um display o valor convertido, sem entrar em maiores cálculos com este valor, há um "caminho das pedras" neste rio.
Depois que o seu AD estiver funcionando, você poderá fazer 5,115V corresponderem à solução 11 1111 1111. Fazendo isso, cada variação de um bit menos significativo valerá 5,0 mV (5,115/1023). 5,000 V corresponderão ao valor decimal 1000. As contas ficam bem mais fáceis, pois qualquer conversão fornecerá um valor inteiro de mV, e o que é melhor, múltiplo de 5 (10/2) ou 10. Se for múltiplo de 10, basta posicionar a vírgula no momento da visualização. Se for 5, basta "shiftar" o valor binário e posicionar a vírgula no momento da visualização.
Eu já fiz isso, com 8 bits, e funciona legal.
Boa sorte!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor turuna » 02 Jul 2008 12:47

Olha Geraldomelo tive um problema com o AD do pic 16f876 sem o "A" mas só descobri que o problema era por causa dessa letrinha porque antes estava utilizando um com a versão "A", pode ser ou não o seu caso.

Turuna
turuna
Nibble
 
Mensagens: 97
Registrado em: 10 Mar 2008 12:50

Próximo

Voltar para PIC

Quem está online

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

cron

x