COMO ESTABILIZAR A LEITURA DE UM POT

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor Vonnilmam » 22 Mai 2016 23:46

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
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor tcpipchip » 23 Mai 2016 08:00

------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor xultz » 23 Mai 2016 08:14

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.
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

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor ze » 23 Mai 2016 09:11

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.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor andre_luis » 23 Mai 2016 09:18

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 )
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor barboza » 23 Mai 2016 10:39

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;
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor Vonnilmam » 23 Mai 2016 10:53

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
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor eletroinf » 23 Mai 2016 11:17

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
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor andre_luis » 23 Mai 2016 13:15

@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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor KrafT » 23 Mai 2016 21:03

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.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor Djalma Toledo » 24 Mai 2016 00:22

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.
Djalma Toledo
Bit
 
Mensagens: 39
Registrado em: 14 Abr 2016 21:59

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor eletroinf » 24 Mai 2016 15:17

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.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor eletroinf » 25 Mai 2016 15:37

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
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor Vonnilmam » 25 Mai 2016 21:08

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
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: COMO ESTABILIZAR A LEITURA DE UM POT

Mensagempor fabio_ » 20 Jun 2021 21:15

Vonnilmam,

Pode me ajudar nessa solução?
Estou com o mesmo problema.
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08

Próximo

Voltar para PIC

Quem está online

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

cron

x