Página 1 de 2

COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 22 Mai 2016 23:46
por Vonnilmam
Olá a todos, estou com um grande problema e acredito que muitos já devam ter passado por ele também,

Preciso ler um potenciômetro (tensão estabilizada de 0 a 5vlts) e estou fazendo isso com um pic18, através da entrada analógica do conversor A/D ligada ao RA0.

Tudo funciona beleza, porém o grande problema esta na estabilidade da leitura, o que ocorre é que por razões mecânicas caracteristicas do próprio potenciômetro, o mesmo oscila sua resistência em algumas de suas posições. Aí a leitura vai acompanhar essa variação, assim há de vez em quando uma oscilação.

exemplo: A leitura do A/D esta entregando um númeral 100 decimal, derrepente esse numeral, se altera sozinho, indo para 99 ou 101...

Me ajudem, pois não estou conseguindo imaginar uma rotina para eliminar esse efeito. Eu pensei em algum tipo de filtro para estabilizar a leitura, tipo, qualquer número 1 acima ou abaixo do que estiver sendo lido,

Já fiz um regra para média de 3, mas nada...

Obrigado

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 08:00
por tcpipchip

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 08:14
por xultz
Existem algumas possibilidades, tudo vai depender de alguns fatores. O ponto mais provável de indução de ruído é na ligação do pino central do potenciômetro com o PIC, porque esta é uma linha de alta impedância. A primeira coisa que você pode fazer é colocar dois capacitores, um ligando esta linha ao GND e outro ao VCC (experimente valores entre 100nF e 10uF). Outra coisa é colocar um capacitor entre os dois pinos extremos do potenciômetro. Depois pode partir para filtros pi com dois capacitores e um resistor, dois capacitores e um indutor, cascatear filtros pi. Por fim, implementar filtros em firmware (o recurso de tirar média é um filtro passa-baixa, ele é bem meia-boca mas é um filtro, colocando índices melhores pode dar melhor resultado).
É uma tarefa bem ingrata limpar este sinal, a solução é achar a fonte do ruído e tentar eliminá-la.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 09:11
por ze
Na minha concepção eletro, mecânica, lógica (binária) lógica e artística, penso que uma unidade (bit zero) de ad é algo natural de qualquer sistema conviver com tal oscilação. Os fatores que provocam tal mini caos beiram a física quântica.
(Se for + que um bit, tua inquietação tem algum sentido)

Se for realmente importante tal estabilização, além dos capacitores, layout apropriado e etc, tente fazer média de leitura de 10 a 100 p.ex.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 09:18
por andre_luis
xultz escreveu:Por fim, implementar filtros em firmware (o recurso de tirar média é um filtro passa-baixa, ele é bem meia-boca mas é um filtro, colocando índices melhores pode dar melhor resultado)


Essa pra mim é a solução derradeira.

Tirando uma média móvel de por exemplo uma quantidade de numeros igual á potencia de 2 ( 16 valores por exemplo ), bastaria pegar a soma e deslocar 4 bits para a direita, consumindo quase nada de processamento do PIC, e além do mais o fato de ser uma media-movel, significa que para cada nova passada no calculo, basta apenas subtrair o valor mais antigo a ecrescentar o mais novo, como por exemplo:

Subtotal[15]=Subtotal[14];
Subtotal[14]=Subtotal[13];
Subtotal[13]=Subtotal[12];
...
...
Subtotal[0]=Novo_valor;

Media=(Subtotal[0]+Subtotal[1]+Subtotal[2]+ ... + Subtotal[15]) >>4 ;


Isso significa que para o seu caso acima da leitura de 100, o erro de ±1 seria dividido por 16 ( ~0,0625 )

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 10:39
por barboza
Uma solução simples de "filtro" é acumular as últimas medidas e tirar a média a cada apresentação.

Ex.: Leitura do AD a cada 50ms
Ex.: Update no LCD a cada 1s
AD de 10 bits
Acumulador de 16 bits (Poderia acumular até 64 medidas do AD)

Código: Selecionar todos
u16_AccADC += NovoValorADC();
u8_NLeiturasADC++;


Quando for apresentar no LCD, divide o valor acumulado por 20*, zera o acumulador para nova média.

Código: Selecionar todos
u16_MediaADC = (u16_AccADC / u8_NLeiturasADC);
u16_AccADC = 0;
u8_NLeiturasADC = 0;

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 10:53
por Vonnilmam
Bom dia a todos, e muito obrigado pela pronta resposta.

Realmente já quebrei a cabeça com esse problema.

O problema não é ruido, amigo xults, essa foi a primeira coisa que verifiquei...só para efeito de explicação, tenho vasta experiência na elaboração de PCIs, inclusive hiper atenção quanto a ligação de terras digitais e analógicos, inclusive com proteção EMI, etc..

O problema é mesmo na referencia de tensão fornecida pelo potenciômetro e a convesão do A/D, provocando essa oscilação (intermitente diga-se de passagem).

Porque preciso resolver esse problema? Porque no firmware, eu tenho o disparo de uma rotina, que esta atrelada a leitura desse potenciômetro, imagine agora, se ficar oscilando a grandeza medida....isso irá engarrafar a rotina de disparo, entenderam o rolo da birosca...rsss

Eu vi um equipamento comercial (americano) que é uma mesa de iluminação DMX512, onde há os potenciômetros (vários) e lá notei que não existe essa oscilação...como o cara fez para resolver esse B.O.

André, já fiz o que aconselhou, mas ainda continua havendo a oscilação

Bom, eu sou da turma antiga e aprendi programar em assembler (adoro), apesar de dar umas arranhadas em C, mas prefiro o assembler pela comodidade.

Eu pensei em fazer uma comparação para mais ou para menos e igualdade, ou seja, pegar o valor direto da conversão, guardar em um registrador, depois adiciono +1 e coloco em outro registrador e depois decremento em -1 e guardo em outro registrador.

Na próxima conversão comparo se é igual, se for, não aciona a rotina atrelada, depois comparo o número acima e o número abaixo, caso sejam iguais, não dispara.

Será que funciona?
Obrigado

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 11:17
por eletroinf
O código abaixo estabiliza bem as Leituras, testei com o próprio tmp 36.
Em relação ao seu problema, como foi comentado, eu também já fiz testes com uma Vref estável (gerada por CI dedicado) através dos quais comprovei que uma referência estável deixa até um ADC ruim parecendo bom...

Tu pode tentar ajustar o código abaixo, inclusive alguma elaboração melhor com a transformada delta para escapar dos float

Código: Selecionar todos
// Kalman filter setup
// Baseado no vídeo do Youtube "Temperature Sensor Kalman Filtering on an Arduino Uno"
float X = 0.0;
float P = 1.0;            // Predição da Covariancia
float kg = 1.0;            // Kalman gain


// Defines for TMP36
#define   Q   1e-8   // or 1e-9 -> Covariance
#define   R   1.22e-5   // Variance

loop:
   Mostra_temp(X)         // Temperatura atual (X(t-1)).
   P = P + Q;             // Predição da covariância
   kg = P/(P + R);         // Kalman Gain
   P = (1 - kg)*P;         // Update covariance estimation
   X = X + (kg*(LeituraAD - X));   // Update the state estimate.
end

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 13:15
por andre_luis
@Vonnilmam,


Se o disparo é feito por um nivel especifico, a 1a coisa que vem à cabeça é a utilização de uma histereze por software.

Uma outra alternativa com uma abordagem analógica seria tentar outras opções de potenciometros. Há aqueles usados em equipamentos de Som, que apesar de serem logaritmos por terem um curso pesado, acredito que isso dê mais firmeza mecanica e consequentemente estabilidade.

Ainda mais uma alternativa analogica é reduzir o range de ajuste, como por exemplo colocando resistores acima e abaixo, e assim esse divisor resistivo também estaria dividindo a variação, minimizando seu efeito.

Uma outra opção, mas agora "digital" é utilizar aquelas chaves baseados em encoders rotativos de baixa resolução, com passos fixos ( semelhante ao disco central do mouse ), bastando apenas 2 pinos do PIC. Já usei isso e é muito bacana.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 23 Mai 2016 21:03
por KrafT
Nesse teu caso pode-se colocar um timer para validar transições de um único bit (ou quantos você quiser), que só são validados após x tempo no mesmo nível. Funciona muito bem com sinais que cruzam rapidamente os níveis de histerese.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 24 Mai 2016 00:22
por Djalma Toledo
Sugestão:
Use Potenciômetro de Qualidade: Multivoltas ou Potenciômetro de fio tipo Fead.

Desacople com filtro R C, inclusive a alimentação do uC .

------------
Também prefiro o Assembler

Dj.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 24 Mai 2016 15:17
por eletroinf
Sugestão(n): Se não for muito complicado, faça um log dos valores lidos, enviando-os pela serial e salvando.
Daí se pode analisar todas as possibilidades sugeridas em um software matemático ou mesmo numa planilha, dependendo do que seria feito.

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 25 Mai 2016 15:37
por eletroinf
Another way is to use the Savitzky-Golay filter. I didn't use it yet, but it happens to work. See the example below, in python:

http://stackoverflow.com/questions/2298 ... -in-python

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 25 Mai 2016 21:08
por Vonnilmam
Eu sou muito grato a todos os amigos do forum.

O problema foi resolvido, a idéia de todos foi muito importante para chegar no resultado final.

Em especial o raciocinio de se criar uma "ESTERESE" foi a que deu certo.

O principio foi o seguinte, peguei o valor colhido pelo A/D (no meu caso 8bits de resolução), copiei em uma variavel (DATA_IN) e fiz um bkp em mais duas variáveis (DATA_MENOS E DATA_MAIS). Decrementei a variável DATA_MENOS e incremente a variável DATA_MAIS.

Com esses valores, criei uma tabela com vetores de comparação, espaçados em 6 casas (ESTERESE), e pronto.

A rotina ficou simples e funcionou perfeitamente, mesmo que o pot seja de baixa qualidade, o resultado fica estável e não oscila...

Quem desejar a rotina, solicite pelo email : contato@grupoagi.com.br, terei o maior prazer em enviar

Lembrando, que o veio vonnilmam, só escreve em assembler :P

Re: COMO ESTABILIZAR A LEITURA DE UM POT

MensagemEnviado: 20 Jun 2021 21:15
por fabio_
Vonnilmam,

Pode me ajudar nessa solução?
Estou com o mesmo problema.