Estou tentando obter mais de 10 bits de precisão do meu Arduino ADC, mas não consigo descobrir a teoria por trás disso. Uma nota de aplicação Atmel frequentemente citada ( http://www.atmel.com/Images/doc8003.pdf ) diz que
É importante lembrar que a média normal não aumenta a resolução da conversão. Decimação, ou Interpolação, é o método de média, que combinado com a superamostragem, aumenta a resolução
Então, o que eles propõem para 'dizimação' é mover o ponto decimal. O que equivale a reduzir a leitura binária pela metade para cada lugar em que você a move, assim você pode dividir o valor da base 10 por 2 ou 4 ou 8 ou o que você tem. Estou entendendo que dizimação está errada?
Respostas:
Dei uma olhada na nota e essa é realmente uma afirmação estranha (ou uma maneira confusa de dizer o que eles realmente querem dizer).
Talvez o que eles realmente querem dizer é que, se você quiser obter mais resolução, não poderá dividir / mudar o número posteriormente para a mesma escala de uma única amostra, porque (na aritmética inteira) isso jogaria fora os bits que você ganhou.
Se suas amostras de ADC são barulhentas , é claro que você pode dividir para obter um valor menos barulhento na escala original.
A outra coisa em que pensei apenas na sua pergunta foi o ponto de que para fazer a sobre amostragem correta, você precisa usar um filtro passa-baixas eficaz, e uma média móvel direta não é tão boa em ser um filtro passa-baixa quanto um FIR adequadamente projetado (ou IIR) - mas isso não parece ser suportado pelo texto da nota.
fonte
Se você pedir a alguém para medir uma placa de 45,2 cm com precisão no centímetro mais próximo, ela responderá (ou deveria) responder 45. Se você pedir para medir novamente, ela responderá 45 novamente. Repita o exercício mais 8 vezes e a média de todas as medições deve ser exatamente 45. Não importa quantas vezes uma amostra seja digitada, uma terminará com um valor de 45. A média de todas essas leituras seria, obviamente, 45 (mesmo que a placa tenha 45,2 cm de comprimento).
Se a pessoa ajustasse o aparelho de medição para ler 0,45 cm antes da primeira medição, 0,35 cm antes da segunda, 0,05 cm antes da quinta, 0,05 cm antes da sexta, etc. até 0,45 cm antes no décimo, duas das medidas seriam 46 e as outras oito seriam 45. A média de todas elas seria 45,2.
Na prática, conseguir desviar as coisas com tanta precisão é difícil. Se alguém ajustar aleatoriamente o aparelho de medição antes de cada medição para ler algo entre 0,5 cm de comprimento e 0,5 cm de comprimento, cerca de 1/5 das medições lerá 46 e o restante 45, mas como os ajustes são aleatórios, a fração real pode ser maior ou inferior. Fazer dez medições não acrescentaria um valor significativo de precisão, mas uma média de aproximadamente 100.
Não sei se entendi bem a lógica do artigo para a distinção entre média e deslocamento à direita. É preciso estar ciente de que a precisão aparente alcançada pela média pode exceder o nível significativo de precisão, mas, pela minha experiência, a questão de quando e quanto a mudança à direita deve ser conduzida pelos limites da faixa numérica do processador. Trabalhar com números que são redimensionados o máximo que puderem sem causar estouro geralmente minimiza os efeitos dos erros de arredondamento, desde que não se atribua significado indevido a pequenas quantidades de ruído.
Aliás, no uso original, "dizimar" um exército era matar 1/10 dos soldados nele. Dizimar os dados de um ADC é descartar parte deles. O prefixo comum com a frase "ponto decimal" não implica uma associação.
fonte
A resposta curta é o ruído, e não é necessariamente o ruído que importa, mas o tipo de ruído . O outro problema são os efeitos não-lineares, como o INL, que diminuem o valor médio
Primeiro sobre o ruído:
Se amostrássemos uma distribuição gaussiana, seria algo assim:
A linha vermelha está mais próxima da distribuição térmica real (média ao longo do tempo) e o histograma azul representa muitas amostras de ADC. Se amostrássemos continuamente essa distribuição, obteríamos melhores estatísticas e poderíamos encontrar o valor médio ou a média com melhor precisão (que geralmente é o que procurávamos, sim, percebo que os sinais se movem, há filtragem e sinal para ruído dependendo do conteúdo da frequência, mas vamos considerar o caso DC em que o sinal não está se movendo no momento).
O problema é o ruído de cintilação ou 1 / f, muda a média gaussiana e causa a quebra das estatísticas, porque a distribuição não é mais gaussiana.
Este é um modelo ruim, mas você pode considerar que algo parecido com este INL também é um problema, pois pode introduzir alguns bits de erro, o que também diminui a média.
Provavelmente isso é confuso, vamos ver o domínio do tempo, como mostrado abaixo
Na imagem superior, você pode ver um sinal com ruído gaussiano, seria fácil "traçar uma linha" no meio e encontrar a média. Quanto mais amostra você tiver de um sinal como esse, maior precisão e conhecimento você terá da média.
Na imagem inferior, você pode ver como é o ruído de tremulação, a média não ajudará aqui.
O problema é que a maioria dos eletrônicos tem ruído de oscilação, resistores não (assumindo que não há influência da temperatura ambiente), mas transistores e CIs. Existem amplificadores chamados amplificadores de corte que superam esses efeitos.
Outra coisa a saber é que existem ADCs (os lineares têm um novo núcleo de SAR) onde os engenheiros trabalharam para eliminar os efeitos do ruído 1 / f (e outros efeitos não lineares dos ADCs como o INL) a um nível muito inferior ao bit dos ADCs valor. Você pode empregar uma super amostragem pesada e obter valores de 32 bits de um núcleo de 14 bits.
Fonte: EDN- 1 / f Ruído - a vela tremeluzente
fonte
não exatamente. a parte dizimada argumenta que, corretamente, a meu ver, que a "média" normal de várias amostras, mas mantendo a largura do bit, não retém tanta informação. Portanto, se você calcula a média de leituras ADC em m n bits, a média resultante ainda é uma leitura adc em n bits.
a abordagem proposta é, para dizer o mínimo, é a média de leituras de ADC de n bits, para que a média resultante tenha uma largura de bit mais alta. Por exemplo, somar 4 leituras adc de 10 bits e dividir a soma por 2 produz uma leitura adc de 11 bits.
Eu pensei que sempre foi assim que a superamostragem foi feita profissionalmente. Essa média simples das pessoas na rede é amplamente entendida como a abordagem errada.
o outro ponto é que, para reduzir o ruído, a superamostragem só é eficaz se houver ruído. Se você tivesse um ADC de 10 bits projetado por Deus (ou seja, toda leitura é a leitura verdadeira absoluta, sem variação), a super amostragem não teria funcionado.
o circuito específico no final do artigo sobre o uso de um pwm para adicionar ruído está incorreto: o ruído de adição de pinos deve ter um capacitor de bloqueio CC. e um ponto menos substantivo é que ele não precisa ser um pino de PWM. Um pino GPIO normal funcionaria.
fonte
Primeiro, um ADC é tão bom quanto a sua referência de tensão. Se o seu arduino usa o + 5V como referência, você pode esquecer qualquer tipo de precisão, pois o regulador + 5V é bastante barulhento, baixa precisão como 1-5%, e sua tensão de saída depende da quantidade de corrente consumida. no momento da medição e também nos últimos milissegundos.
Portanto, se você precisar de exatidão ou precisão, selecione uma referência de tensão que atenda aos seus requisitos. Se você não precisar de precisão absoluta de tensão, será mais barato, pois você só precisará dela estável, em vez de precisa e estável.
Eu não testei o SAR ADC dentro do arduino. Tenho experiência com o AT90PWM3B, que é um parente próximo. Isso é muito bom. Com uma tensão de entrada constante, você obtém a mesma leitura do ADC repetidas vezes, com 1 LSB flutuando se a tensão estiver entre valores. Não se pode esperar um resultado melhor de um SAR ADC. (Eu usei uma referência de tensão externa de boa qualidade)
Então, barulho não é um problema aqui ...
Na verdade, o barulho é seu amigo ...
Vamos supor que a tensão que você deseja medir caia no valor ADC 100.1
Você faz 10 medições, mas como o ADC é bom, você recebe 100 todas as vezes!
Portanto, você precisa de um pouco de ruído no sinal, como um LSB de ruído, para garantir que, se medir 100,1, obterá 100 nove vezes em dez e 101 uma em cada dez. Então, a média é de 100,1, entendeu?
Se vier de um sensor, normalmente você terá ruído suficiente gratuitamente.
fonte
O que você está perdendo é o significado de "dizimação".
A rigor, "dizimação" é reduzida para 1/10. Ou seja, de 10 reduza para 1.
A "dizimação" usada na amostragem perde o significado estrito. Em vez de 1/10, significa "reduzir em número".
O que isso significa é que você calcula a média de um número de amostras e reduz o número de amostras no mesmo número.
Como exemplo, se você faz amostragens em 1000Hz e em média 4 amostras, mantém apenas a média. No final, você tem apenas 250 amostras por segundo em vez de 1000. Você perdeu a resolução do tempo, mas ganhou um pouco de resolução de tensão.
Para cada fator de 4, você ganha 1 bit. Média e dizimada por 4, e passa da resolução de 10 bits para 11 bits de resolução.
Outro fator de 4 (4 * 4 = 16 no total) leva você de 10 a 12 bits. Outro fator de 4 leva você a 13 bits de resolução.
Mas observe que agora você está superextraindo por um fator de 64. Sua taxa de amostragem efetiva diminui pelo mesmo fator. Usando o exemplo da taxa de amostragem de 1000Hz, você reduz para cerca de 15 amostras efetivas por segundo.
Isso é dizimação, e é quantos ADCs de alto bit obtêm sua alta resolução. Eles amostram em uma taxa alta, média (ou usam um filtro passa-baixo digital) e dizimam.
No extremo, você tem um ADC de um único bit (um comparador simples) que faz uma amostragem excessiva de vários milhões de vezes para fornecer uma profundidade de bits efetiva de 16 bits.
Uma coisa que você precisa ter em mente para que isso funcione é que você precisa de ruído no seu sinal aproximadamente igual ao menor valor que o seu ADC pode medir. Para um ADC de 10 bits usando uma tensão de referência de 5V, seria um ruído de cerca de 5mV pico a pico.
A média do ruído é de onde vêm os ganhos de bits. Imagine que você tenha um sinal (DC) exatamente entre o valor de 512 contagens ADC e 513 contagens ADC. Sem ruído, o valor medido será sempre o mesmo - a média fornecerá o mesmo valor que as amostras.
Adicione ruído ao menor valor mensurável e isso parecerá muito diferente. Embora o sinal em si não mude, os valores medidos "balançarão" em torno do valor real do sinal. A média agora é diferente das amostras, e quanto mais amostras você usar, mais próximo se aproxima do valor real do sinal
Eu usei essa técnica com um Arduino (que usa um processador Atmel com um ADC de 10 bits) para obter uma melhor resolução para algumas medições que eu estava fazendo.
Eu consegui 13 bits, mas achei que precisava de mais. Eu poderia ter optado por outro fator 4, mas isso levaria muito tempo para cada amostra e só me daria mais um pouco.
Os experimentos com superamostragem mostraram que o que eu estava fazendo poderia funcionar (obtive resultados reconhecíveis, mas barulhentos), sem ter que gastar tempo e dinheiro para obter uma CDM melhor. Com a prova de conceito, eu poderia ir em frente e obter esse ADC melhor - e obter essa prova só me custou algumas linhas de código e um pouco de tempo.
Descobri que precisava de pelo menos 16 bits. Isso significaria uma média de 4096 amostras.
Isso é cerca de meio segundo usando a amostragem mais rápida possível com o software Arduino.
Como eu precisava de 14400 medições, a execução completa levaria 2 horas.
Eu não sou tão paciente, e as coisas que eu estava medindo não permaneceriam constantes por tanto tempo. Eu tive que mudar para o uso de um ADC que usa internamente uma taxa de superamostragem muito maior e que fornece amostras de resolução mais alta a uma taxa mais baixa.
Como em muitas outras coisas, dizimação é compromisso que pode lhe proporcionar melhor desempenho em uma direção (profundidade de bits), enquanto custa a performance em outra direção (taxa de amostragem).
fonte
Então você pode estudar a teoria, mas posso dizer que, na prática, apenas um modelo simples é importante. Você pode calcular a média, desde que o sinal esteja dentro do ruído. Em seguida, a média do componente de ruído será zerada, enquanto o sinal permanecerá. Dessa forma, você obterá uma resolução em detrimento da largura de banda.
Se você tem, por exemplo, um ADC de 16 bits e os últimos quatro bits são barulhentos, é possível filtrá-los e obter o sinal lá. Mas se você tiver apenas um pouco de ruído, não há muito em média, portanto, você não receberá muitas informações novas.
Se você precisar de alta resolução (e baixa largura de banda), veja como o ADC sigma-delta funciona. Eles possuem um sinal de taxa alta de 1 bit que é filtrado para uma largura de banda com maior resolução, às vezes 20 bits e mais.
fonte
A média trabalha para melhorar a resolução reduzindo o erro de desvio padrão,σ . O critério a ser atendido é que o ruído gaussiano deve apenas exceder o erro de quantização. A especificação a ser definida é o erro total e faz com que o erro ou a resolução de quantização contribua apenas com uma quantia menor do orçamento total do erro.
Por exemplo, se você deseja melhorar a resolução em 2 bits, mas seu ruído já é de 3 bits, considere como reduzir o ruído em 2 + 3 = 5 bits enquanto aumenta a resolução ao mesmo tempo em 2 bits.
Onde n é o (s) bit (s) extra (s) de resolução desejado (s), o deslocamento do número binário (ou dizimação) x1 para a direita é igual a / 2.
Para calcular a média, significaσ de ruído é reduzido em x--√ para x amostras, mas também que a latência é aumentada em x amostras de tempo, portanto, é necessária uma super amostragem para reduzir a latência.
No entanto, o ruído nessa taxa de amostragem,fs deve ser apenas o suficiente para inclinar +/- 1 bit em algumas das amostras x, para obter a melhor melhoria na resolução.
Muito erro de quantização ou muito ruído aleatório exigirá mais cálculo de média para reduzir o erro e mais cálculo de média aumenta a latência do resultado.
Para otimizar um ADC para velocidade e erro, é necessário definir o orçamento total do erro e a resolução disponível (bits), SNR desejado ou erro absoluto para qualquer sinal fornecido em toda a faixa de medição. Definir todas as fontes de erro a princípio pode parecer difícil, mas é necessário incluir;
por exemplo, erro de ganho, erro de correção, erro de quantização, erro de ruído de CM, erro de ruído de DM, ruído de Vref ou erro de compensação, ruído ambiental, etc., erro de latência (da média)
Em seguida, determine quantos bits de resolução você precisa para atingir o orçamento de erro de design acima depois que todas as outras fontes de erro forem minimizadas.
O mesmo se aplica à média (para sinais lentos) e à superamostragem da largura de banda do sinal e à dizimação para o ADC em tempo real.
Isso não corrige erros de ganho ou deslocamento e, se houver ruído aleatório insuficiente, o ruído deverá ser adicionado para diminuir o sinal. Idealmente, todas as outras fontes de ruído e erro não excedem 1 bit, de modo que o desvio padrão ou pontilhamento seja de apenas +/- 1 valor acima do número de amostras. No entanto, deve haver ruído suficiente para que a mesma leitura não seja obtida por amostras sucessivas nos dois métodos.
fonte
A teoria por trás disso pode ser extraída, resumidamente, desta frase no artigo da Wikipedia sobre superamostragem :
Portanto, desde que o seu sinal atenda a certos critérios (como sendo mais lento e com pouco ruído), você aumenta um pouco a cada 4 amostras. Então, para cada 4 amostras resultantes, você pode obter "join" novamente para formar outra amostra de resolução mais alta, de modo que, no final, você obtenha log_4 (n) bits para cada n amostras que ler no seu ADC.
Quanto à parte de dizimação, não é realmente uma média, especialmente se você levar em consideração que estamos falando de números inteiros aqui (amostras ADC). Por exemplo, se você tiver amostras
1
,1
,3
e2
, sua média seria:Como você calcula a média com matemática inteira, seu "resultado matemático" de 1,75 será arredondado para 1. Se você multiplicar por 2, obterá
2
.Agora, se você dizimar com:
O seu resultado será
3
. Você pode argumentar que isso é o mesmo que dividir por 2, mas certamente não pode argumentar que 3 é a média de 1, 1, 3 e 2 . Veja a diferença?Agora você pode ser tentado a somar tudo e não descartar a última parte. Mas lembre-se de que esse pedaço é barulho: você realmente não pode usá-lo.
fonte
N/sqrt(N) = sqrt(N)
.Parece que todo mundo já cobriu a parte teórica da sua pergunta, mas como você está usando um Arduino, talvez você queira ler minhas aventuras tentando melhorar a resolução da ADC com esta técnica:
Melhorando a resolução ADC do Arduino com pontilhamento e sobreamostragem
O caráter do ruído é uma parte crítica da história, e você pode gerar um pontilhamento razoavelmente bom simplesmente pressionando um pino com um resistor enquanto lê o ADC de forma assíncrona. Não é perfeito, e você obtém um pequeno deslocamento de sincronia que varia dependendo de quantas amostras / bits extras você está tentando obter. Eu também aceitaria as críticas de que essa técnica depende da fraca estabilização de trilhos no Arduino, por isso está realmente projetando uma falha, em vez de seguir as boas práticas. Mas é muito fácil de fazer.
fonte