[DUVIDA] Como você estabiliza variações na leitura analogica ?

Olá Galera,

     Já li em alguns lugares que existem formulas para melhorar e estabilizar as oscilações em leituras analogicas no Arduino.

      Conheço e já usei a referencia interna,  mas isso não estabiiza, ao contrario, faz os valores oscilaresm até mais, melhora o resultado da leitura,  mas tambem aumenta as oscilações.

 

     Eu pessoalmente só conheço 2 formas de estabilizar, sendo:

1-Colocar um capacitor paralelo ao pino de leitura e o GND pra ajudar a estabilizar as oscilações.

2-Criar um sketch que lê diversas vezes o resultado e tira a media tipo

 

//  SKETCH PARA LER VALOR DO ANALOGICO MAIS ESTAVEL POR MEDIA

int valorA0=0;

int valor=0;

int valorfinal=0;  // seta variaveis

 

void setup(){

Serial.print(9600);  // inicia serial

}

void loop(){

for (int i=0; i <= 100; i++){   //  cria laço de 100 voltas

valorA0=analogRead(A0);  // lê o valor da porta analogica A0 a cada volta

valor= valor+valorA0;          // Soma os resultados obtidos

}

valorfinal= valor / 100;  //  tira a media dos valores lidos

Serial.print(valorfinal);   // imprime na serial os valores

}

 

 

A DUVIDA É:

 

   Você conheçe outras formas ?       

   Conheçe outros sketchs ou formulas pra melhorar e estabilizar a leitura do analogico ?

Exibições: 7725

Responder esta

Respostas a este tópico

Eu andei testando esta semana um do Wlip http://ustr.sancaleve.com/blog/xblog/ , eu gostei imagino que para medir temperatura por exemplo, que se tem normalmente uma taxa de amostragem alta em relação a varição da grandeza física medida, ele seja bom "usa pouca memoria, pouco processamento". Eu estava testando para uma balança com uma taxa de amostragem muito pequena, tive que fazer o tamanho do "balde" muito pequeno :( ... vou fazer outros testes ainda esta semana uma biblioteca  http://playground.arduino.cc/Main/Average 

Weider, bom dia.

Quanto tempo hein?! :) Seguinte, ao invés de usar somente o Capacitor, coloque também um resistor e forme um filtro RC, isso, certamente, vai melhorar muito. Procure na net como calcular.

Abraços.

Ao Alexandre Nogueira,

     Cara, a você só posso dizer uma coisa FAAAAANTASTICO,  muuuuuito obrigado,  nesse momento tô em um carro viajando, mas já dei uma pincelada na lida do assunto, e os links que você indicou são ótimos,  o site ustr tem muita coisa legal a ser lida,  vou dar uma bela sentada pra ler ele com toda certeza.

    Logo, muuuuito obrigado mesmo.

Ao Gustavão suim,

     Cara, é verdade grande amigo, quanto tempo,  você e seu projetos, eu e meus estudos há há há.

     Tô fazendo o curso de Xbee da Rogercom, ele já tá na 12aula,  eu tô na 5ª a razão é que tô com tanta vontade de aprender, que reviso a mesma aula mais de uma vez é fico parando pra aprender direito.

     Sinceramente não sabia que os xbee podiam ser tão complexos e tão completos,  tem muuuuuuiiiita coisa a ser aprendido sobre eles, fora uma simples comunicação ponto a ponto.

     O curioso é que descobri os NRF24L01 e andei estudando, e hoje tô devendo um tutorial a galera,  na verdade tô estudando os xbee pra ver realmente onde ficam os limites entre os nrf e os xbee visto que hoje temos bibliotecas mesh para os nrf,  a questão maior é que um xbee pro tá mais de R$ 250,00  enquanto um nrf de mesma potencia custa R$ 50,00 e um básico pra estudar meros R$ 5,00 é covardia.

      Tô me criar um tuto pra o pessoal, até porque a melhor forma de aprender é ensinando,  mas fica complicado misturar as coisas.

      Ah! sobre o uso do resistor,  na verdade eu tô usando um divisor de tensão, o que já contempla o uso dos resistores,  o lance é que tem uma variável a ser lida que o pico dela é 1,2v  e o arduino com referencia interna pede no máximo 1,1v   dai fiz um divisor de tensão com dois resistores de 330r o que derrubou a tensão para 0,60v,  e ficou possível a leitura.

    Dai a ligação atual é    POSITIVO>RESISTOR1>saída para A>RESISTOR2+CAPACITOR>GND

    Mas ainda assim ainda oscila, e preciso o resultado totalmente estável, principalmente no zero.

Weider, já ouviu falar em sample and hold

Todo circuito  conversor ADC pode usar um Sample and hold (mantém amostra). 

Já li no data sheet do ATmega que o ADC dele possui o sample and hold também. 

Esse circuito estabiliza a tensão em um nível CC para dar tempo do conversor fazer a conversão do sinal analógico em digital. Esse tempo pode ser calculado e ajustado, para determinada necessidade. 

Estudei tudo sobre conversores ADC e DAC a muitos anos atrás, e conheço um bocado sobre o assunto. 

Recomendo que leia os artigos da Analog Devices (melhor e mais experiente empresa nesse tipo de componentes).

http://www.analog.com/en/products/amplifiers/specialty-amplifiers/s...

http://www.analog.com/media/en/training-seminars/tutorials/MT-090.pdf

http://www.analog.com/en/education/search.html?q=sample%20and%20hold

Qual dificuldade esta tendo ? 

Olá ze gustavo,

    Cara, eu nunca tinha ouvido falar do Sample and Hold que significa amostrar e segurar o resultado.

    É um conceito um tanto estranho pra mim,  parece algo do tipo pegar a amostra entre tempos maiores e segurar o ultimo resultado lido como se fosse o atual, mesmo que o real fique oscilando,  bem é assim que entendi.

    Não sei se gostei muito do conceito,  acho que gostei mais do conceito proposto pelo Alexandre nogueira, em um dos links que propõe a MDM  ou seja,  a média aritmetica das médias,   eu não testei ainda, mas a coisa me parece ter potencial.

    Acho que o que foi mais legal e aprendi agora com vocês, é o nome correto do que estou buscando, que seria:  " Filtro para leitura de ADC ".

   Outra coisa foi que tendo o nome correto em mãos eu pude fazer uma busca na net e vi que muita gente busca o mesmo,  mas que a coisa não é tantão fácil assim,  que depende de muita matemática,   de muito raciocínio,  e que as soluções podem mudar de caso pra caso.

    Mas gostaria realmente de ver mais explicações.

OK Weider ! Vou explicar. 

Todo conversor ADC precisa de um tempo para fazer a conversão do dado analógico em digital. 

Existem vários tipos de conversores ADC, um para cada tipo de aplicação.

Qual tipo de sinal deseja converter? Qual frequência, qual é o tipo de onda? Tem muito ruido no sinal? 

Se o sinal tem muito ruido, aí sim irá precisar de um filtro de entrada para eliminar os ruidos. 

Como você mesmo citou. 

No caso dos  conversores Flash ADC, eles  fazem essa conversão quase que instantaneamente. 

Mas no caso do Arduino, o conversor usado é o de Aproximação sucessiva, ele "perde" um tempo fazendo a conversão dos dados. 

Como eu já disse, o próprio ATmega já tem um sample & Hold já adequado para o conversor ADC interno. Isto é, enquanto o conversor processa a conversão, ele "congela" a tensão durante esse tempo. 

Ele faz isso assim : 

- O amplificador de entrada deixa passar o sinal através da chave digital ( vide o diagrama citado no tópico anterior), 

- O capacitor do circuito é  carregado com a tensão. Logo após a carga, a chave digital abre o circuito,

- Como a impedância de entrada do amplificador de saída é alta, o capacitor mantém o nível da tensão, 

- a chave digital fica aberta, enquanto o conversor processa a conversão - nível congelado de tensão.

- Após o tempo de conversão (esse tempo é sempre igual, para manter a regularidade), a chave digital é novamente fechada, e o capacitor é carregado com o novo nível de tensão. 

- Assim o processo se repete, até que o conversor seja parado. . 

Imagine o sample hold como uma foto! Você tem algo em movimento por exemplo uma pessoa em um balanço, quando você bate a foto aparece a pessoa em uma posição fixa... se você aumenta muito o tempo de exposição da câmera a pessoa vira um borrão, ai você perde completamente a informação que te interessaria "a pessoa". Agora imagine você tentando capturar um sinal que oscila com um processador/conversor que demora uma eternidade para ler o valor (tempo de exposição grande)... quando ele leu o primeiro bit o terceiro já trocou, o dado já se perdeu "borrão"... agora se ele tirar uma foto (sample & hold) da medida, ele pode gastar mais tempo para "ver a amostra" ler o valor amostrado.  

Beleza Alexandre e gustavo,

   A explicação usando fotografia foi ótima, até porque entre as dezenas de cursos que fiz pela vida, tem o curso de fotografo profissional, logo, entendo bem de tempo de captura por abertura do obturador.

   Agora vamos a questão:   Como trazer isso para a prática ?   Seria com com hardware(utilizando capacitores para segurar o sinal)  ou daria pra fazer com software(criando alguma rotina matematica).

    Como trazer o conceito pra o mundo do arduino prático ?

  

Eu tentei passar o conceito do uso do sample hold.. o importante para mim e ter em mente que,, o conversor usa uma fatia bem menor que o tempo de conversão, para "capturar" a tensão.... Quando a variação da tensão de entrada é muito rápida até para esse tempo do sample vc não terá dados validos....

Usar um filtro passa baixa (físico) na entrada é regra! Se você pretende fazer 10 leituras por segundo em um canal, calcula um filtro para deixar passar só variações na tensão abaixo de uns 3 Hertz na entrada analógica. Tem muita matemática ai.... aliasing, nyquist, fourier.....

 Outra coisa a se pensar é que para carregar o cap do sample hold, tem que mandar energia para o circuito de amostra (observar a impedância de entrada no pino do adc)..., que com mais de uma leitura consecutiva no mesmo canal "mesmo valor " provavelmente o circuito do sample hold fica com um valor mais próximo da realidade.. o circuito do hold carregou um valor muito próximo na primeira captura na segunda vai aproximar ainda mais pois já estava carregado com o valor da primeira..!

Valeu alexandre,

    Vou ler sobre filtros passa baixa fisicos,   se você tiver alguma dica, passa ai ok.

É o filtro rc  comum (não por software), tem que ser por Hardware resistor + capacitor!

https://pt.wikipedia.org/wiki/Filtro_passa-baixo

http://sim.okawa-denshi.jp/en/CRlowkeisan.htm

http://www.microchip.com/pagehandler/en_us/devtools/filterlab-filte...

______________________________________________________________

Isso que foi falado é para capturar o valor corretamente. mas mesmo o valor estando correto depois você pode decidir filtrar (por software) de forma a obter um dado mais estável, ou uma media temporal, etc.... ai entra os algoritimos de filtro la do Wlip, a biblioteca AVERAGE, etc

Weider, recomendo que leia o topico anteiror que eu postei.

Nele estou explicando como o hardware do sample anda hold funciona.

A chave digital de HOLD pode ser acionada por SW ou HW. 

Vai depender da necessidade.

Continuo com a dúvida:

Qual tipo de sinal deseja converter? Qual frequência, qual é o tipo de onda? Tem muito ruido no sinal? 

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2020   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço