Como fazer um microfone amplificado limpo de conversão analógica para digital?

12

Eu fiz algumas perguntas relacionadas a este projeto nos últimos dias, mas não consigo reunir tudo.

Liguei um microfone de eletreto em um opamp e dei saída ao meu microcontrolador arduino. O ADC no microcontrolador converte um intervalo de 0 a 5 vV em um número de 10 bits (0 a 1023).

Eu tentei 3 chips amp diferentes:

  • LM386 - Recebi feedback de que este chip não era bom para esse fim, pois não é opamp, e não funcionou corretamente como esperado.
  • LM358 - obras
  • UA741 - funciona, amplifica mais que LM358

Eu segui esse esquema exatamente (exceto por mexer nos valores dos resistores para obter um bom ganho): usei 50k ohm para R5 e 10 ohm para R2. insira a descrição da imagem aqui

O problema é que a saída dos dois últimos chips não está "limpa". O analogRead () no Arduino está sempre lendo um valor diferente de zero, mesmo quando não faço barulho no microfone. A leitura reage corretamente quando produzo ruído, mas o valor "zero" é diferente de zero. Às vezes, o valor "zero" até pisca jogando a leitura o tempo todo. Espero que isso faça sentido.

Você pode me ajudar a resolver isso?

Da mesma forma, sem informações importantes e extras: estou tentando fazer algo assim , eventualmente.

Shubham
fonte
Você tem certeza de que possui C2 no lugar? Qual é a tensão DC silenciosa após C2?
Majenko 9/07
Sim, eu tenho C2 no lugar. É cerca de 2 volts. Não sei se isso faz algum sentido: será que existe alguma corrente presa (?) No loop entre os pinos 2 e 6, a saída e a entrada inversora?
Shubham
E a tensão DC silenciosa após C2 desconectada do pino de entrada do Arduino?
Majenko
A presença de C2 significa que a saída do pré-amplificador oscila em torno de 0V - e não de 2,5V em que está operando internamente.
Majenko
Outra coisa - você pode colocar um pouco de diodo no meio do pré-amplificador C2 e a entrada do Arduino - jogue fora as tensões negativas com as quais você realmente não se importa. Mais uma coisa que fiz foi adicionar outro capacitor entre a entrada analógica e o terra para suavizar um pouco o sinal. Torna o medidor da VU um pouco menos instável.
Majenko

Respostas:

17

Livre-se do capacitor de saída. Esse circuito provavelmente deveria produzir um sinal em torno de zero, então o capacitor está lá para bloquear o deslocamento de 1/2 Vdd. No entanto, o microcontrolador deseja ver o sinal centrado em torno de 1/2 Vdd, portanto, basta se livrar do capacitor.

Microfones precisam de muito ganho. Os eletretos podem ser sensíveis, mas você ainda pode precisar de um ganho de tensão de 1000. O ganho no seu circuito é a proporção de R5 para R2, mas isso só funciona dentro dos limites do que o opamp pode fazer.

Os valores que você mencionou acima dariam um ganho de 5000. Isso é muito mais do que você deveria tentar obter de um único estágio de opamp. Não apenas a tensão de offset será multiplicada por esse ganho, mas o opamp não poderá fornecer isso em toda a faixa de frequência. Com largura de banda de ganho de 1 MHz, você só obterá esse ganho abaixo de 200 Hz. Mesmo um deslocamento de entrada de 1 mV se torna 5 V após a amplificação em 5000.

R2 também é a impedância vista pelo microfone após o capacitor de entrada. Você precisa que isso seja um pouco maior que a impedância do microfone, com o pullup e o capacitor de entrada na menor frequência de interesse. 10 Ω é muito pequeno para isso. 10 kΩ seria um valor melhor.

Tente duas etapas com um ganho de 30 ou mais para iniciantes e veja onde isso o leva. É um ganho que ele pode suportar em frequências razoáveis, com espaço suficiente para que o feedback funcione. Você também precisa acoplar capacitivamente os dois estágios para que a tensão de compensação de entrada não se acumule em todos os estágios.

Edit: Adicionado circuito

Não tive tempo de desenhar um circuito ontem à noite quando escrevi a resposta acima. Aqui está um circuito que deve fazer isso:

Isso tem um ganho de tensão de aproximadamente 1000, o que deve ser suficiente para um microfone de eletreto razoável. Eu posso ser um pouco demais, mas é fácil adicionar alguma atenuação.

A topologia é bastante diferente do seu circuito. A coisa mais importante a se notar é que ele não tenta produzir todo o ganho em um estágio. Cada estágio tem um ganho de cerca de 31. Isso deixa bastante ganho na freqüência máxima de áudio de 20 kHz para o feedback, de modo que o ganho será bem previsível e plano na faixa de freqüência de áudio, pois o MCP6022 possui uma largura de banda de ganho típica produto de 10 MHz. O fator limitante provavelmente será o microfone.

Diferentemente do que eu disse antes, os dois estágios não precisam ser acoplados capacitivamente para impedir que a tensão de compensação se acumule junto com o ganho. Isso ocorre porque neste circuito, cada estágio tem apenas um ganho DC de 1, portanto o deslocamento final é apenas o dobro do deslocamento do opamp. Esses opamps possuem apenas um desvio de 500 µV, portanto o deslocamento final é de apenas 1 mV devido aos opamps. Haverá mais devido à incompatibilidade de R3 e R4. De qualquer forma, o DC de saída estará suficientemente próximo de 1/2 da fonte para não consumir a faixa A / D de maneira significativa.

O ganho DC de 1 por estágio é obtido acoplando capacitivamente o caminho do divisor de realimentação ao terra. O capacitor bloqueia CC, então cada estágio é apenas um seguidor de unidade para DC. O ganho total da CA é realizado à medida que a impedância do capacitor (C3 no primeiro estágio) diminui quando comparada ao resistor do divisor inferior (R7 no primeiro estágio). Isso começa a acontecer em cerca de 16 Hz. Uma desvantagem dessa abordagem é que a constante de tempo para liquidação é C3 vezes R7 + R5, não apenas R7. Esse circuito levará alguns segundos para estabilizar após ser ligado.

Olin Lathrop
fonte
Quando tiro a tampa da saída, o arduino vê uma entrada de cerca de 3 volts. Sinto muito, mas você pode explicar o que você quer dizer com tensão offset? Para obter um ganho de 1000, com R2 sendo 10k Ohm, preciso de 10M ohm para R5? Você tem certeza disso? O ganho é a razão entre R5 e R2, certo?
Shubham
@Shubham: Seu circuito tenta multiplicar a tensão de compensação do opamp por 5000, por isso não é surpresa que a saída esteja atrelada a um trilho. Nenhum opamp é perfeito. A tensão de deslocamento de entrada é a tensão entre as duas entradas quando a saída está na faixa intermediária. Em teoria, as duas entradas seriam iguais então. A especificação da tensão de deslocamento de entrada indica a que distância está deste ideal.
21711 Olin Lathrop
@ Shubham: Você precisaria de 10 MOhm para o resistor de feedback se tentasse fazer com que um estágio produzisse todo o ganho. Como eu disse, é uma má ideia.
Olin Lathrop
Obrigado por toda a ajuda, aprendendo muito aqui. Então, ter dois estágios de ganho de 30 me dá um ganho total de 900, certo? Vou tentar isso usando um LM358 (que é o que eu tenho em torno de mentir), e relatório de volta
Shubham
Finalmente funcionou! Obrigado por me dar esse esquema! Mas estou obtendo apenas um intervalo ADC de cerca de 200. O valor silencioso do ADC será um pouco acima do ponto médio (512), mas não importa a quantidade de ruído que eu produza no microfone, o valor do ADC não será mais do que 200 acima o valor silencioso. Provavelmente é a minha configuração de tampas e resistores que está limitando isso.
Shubham
5

Como você diz, o valor digital será de 0 a 1023. O meio desse intervalo não é 0, é 512 (o que corresponde a uma tensão em torno de 2,5). Para o silêncio, você deve ver algo assim no meio do intervalo. Não precisa ser exatamente 512, mas deve estar perto. Isso é chamado de "deslocamento CC". O sinal é deslocado para cima e centrado em torno de 2,5 V.

Se você está medindo 2 V e vendo valores ADC em torno de 400, basicamente está funcionando bem.

As ondas sonoras passam de pressão negativa para positiva. Se o ponto central fosse 0 e o sinal pudesse ser medido apenas entre 0 e 1023, os valores de pressão negativa (-1023) seriam cortados.

Além disso, ele sempre oscilará um pouco devido ao ruído do ADC. (E sempre haverá algum ruído de áudio na sala, não importa o quanto você esteja quieto.)

endólito
fonte
Ohhh, que explica "DC offset", eu continuava vendo em outras respostas. Existe uma maneira de remover o deslocamento DC, mas colocando uma tampa em algum lugar?
Shubham
@ Shubham: Você quer um deslocamento DC. O processo ADC não funcionará sem um. A tampa C2 é o que garante que você tenha uma. Nesse caso, provavelmente não há muita diferença, porque a saída do U1 já está deslocada. Você pode medir o valor DC em cada lado do C2?
endolith 11/07
@ Shubham: Se você quer que suas medições digitais sejam centradas em torno de 0 em vez de 512, você pode simplesmente subtrair o deslocamento no seu software, ou melhor, implementar um filtro passa-alta digital no software.
endolith
3

Você pode postar a folha de especificações nesse microfone? Não há motivo para você precisar de um ganho de 5000 com um microfone de eletreto, a menos que tenha uma unidade vazia sem FET interno. Se for esse o caso, o pré-amplificador precisa ter uma aparência muito diferente.

Além disso, o circuito usado não é muito propício para ser usado como um pré-amplificador para um microfone de eletreto.

Eu recomendo:

insira a descrição da imagem aqui

R5 / R4 define o ganho e pode ser ajustado sem estragar a impedância de entrada do circuito. R3 pode ser de 2k -> 10k ish. 10k tenderá a melhorar o desempenho da distorção; se você ajustar muito baixo, deverá repensar os valores de R1 e R2 para corrigir a impedância de entrada.

Também é muito importante que a fonte de alimentação seja desacoplada adequadamente, pois qualquer ruído será alimentado no microfone.

Como as outras respostas mencionaram, seu ponto "zero" será ~ 512 quando você ler o ADC e flutuará um pouco, não importa o que você faça.

Se seu objetivo é piscar as luzes em resposta ao nível, você não deve fazer leituras instantâneas com um arduino de qualquer maneira, pois duvido que você seja capaz de amostrar rápido o suficiente para fazê-lo responder bem. Em vez disso, faça a detecção de pico ou nível médio no domínio analógico e defina o período médio proporcionalmente à sua taxa de amostragem.

EDIT: Mais sobre como fazer isso com um detector de pico

O problema que você terá aqui é que o arduino tem uma taxa de amostragem relativamente limitada, acho que seu máximo será de cerca de 10khz, o que significa que você só pode resolver um sinal de áudio de 5khz no máximo. Isso ocorre com o arduino fazendo muito pouco, exceto executando o ADC, se você precisar fazer algum trabalho real (e fizer algum para obter o nível), a taxa de amostragem será menor.

Lembre-se de coletar amostras discretas do sinal bruto, apenas porque você tem uma onda senoidal de faixa completa alimentando o ADC não significa que você não receberá leituras de 0 no ADC, você obterá amostras em vários pontos da onda . Com música real, o sinal resultante será bastante complexo e você terá amostras em todo o lugar.

Agora, se tudo o que você está tentando medir é o nível do sinal de entrada e não se importa em obter uma representação digital do sinal, é possível usar um simples detector de pico após esse pré-amplificador.

Com isso, o sinal de áudio é transformado em uma voltagem que representa seu nível de pico. Ao medir essa tensão com o ADC, você terá um valor imediato que representa o nível do sinal no momento em que a leitura foi realizada. Você ainda terá um pouco de oscilação, pois o som é uma forma de onda complexa e sempre variável, mas isso deve ser fácil de lidar no software.

Um detector de pico sem retenção é realmente apenas um retificador com um filtro na saída. Nesse caso, precisamos lidar com sinais de baixo nível e manter a precisão, por isso precisamos fazer um pouco mais do que o que seria feito em um circuito retificador médio. Essa família de circuitos é chamada de "retificadores de precisão".

insira a descrição da imagem aqui

Existem cerca de um bilhão de maneiras diferentes de fazer isso, mas eu usaria esse circuito, ele parece funcionar melhor ao usar um único suprimento. Isso ocorreria após o circuito de pré-amplificador já discutido e a entrada poder ser acoplada ou não a CA, apesar de funcionar a partir de uma única fonte, na verdade funcionará bem com tensões de entrada negativas, desde que você não exceda o pico disponível. tensão de pico dos amplificadores operacionais.

O OP1 atua como um diodo (quase) ideal que contorna o problema usual de queda de tensão no diodo durante a retificação. Quase qualquer pequeno diodo de sinal funcionará para D1, algo com uma queda de tensão direta menor aumentaria a precisão, mas duvido que isso importe para o seu uso.

C1 e R4 agem como um filtro passa-baixo para suavizar a saída. Você pode brincar com seus valores para combinar o desempenho com o que você está tentando fazer (e com a taxa de amostragem).

Você provavelmente pode usar o mesmo modelo de amplificador operacional que está usando no pré-amplificador, mas o Rail-to-Rail e a alta taxa de rotação são ideais para este circuito. Se você tiver um problema de estabilidade, aumente R1, R2 e R3 para 100k ohm.

Marca
fonte
O microfone é um microfone condensador de eletreto padrão. Vou fazer R3 10K, meu Vcc é 5.9V, então tudo bem se R1 e R2 também forem 10K? Qual opamp você recomendaria: LM358 ou 741? Existe uma maneira de reduzir o ponto "zero" para 0 ou próximo de 0? "Em vez disso, faça a detecção de pico ou nível médio no domínio analógico e defina o período médio proporcionalmente à sua taxa de amostragem." - Você pode me dar um pouco mais de detalhes sobre isso? parece interessante e eu realmente quero investigar. Desculpe, eu tenho muitas perguntas ... Eu sou um estudante de EE na faculdade ainda aprendendo.
Shubham
Eu tentei o seu circuito recomendado (é muito mais limpo do que o que eu estava usando, menos aleatoriedade na saída). Eu usei 1M Ohm para R5 e 1k Ohm para R4, dando uma amplificação de 1000. Quando fiz algumas medições com um DMM, o opamp produz uma saída silenciosa de cerca de 3 volts, e o C3 a reduz para cerca de 1,5 volts. Além disso, quando eu removo o R5, isso não faz diferença na saída ... você tem certeza de que o ganho é R4 / R5?
Shubham
1
R3 define o ponto de polarização do FET dentro do microfone (R1 || R2) || R3 define a impedância da entrada CA vista pelo microfone. Definir o ponto "zero" como 0 não pode ser resolvido por nada no domínio analógico, isso é uma função do ADC no arduino com uma única fonte de alimentação. Tudo que você tem a fazer é subtrair ~ 512 de cada amostra se você não quiser som a ser zero (certifique-se de usar um tipo de dados assinado como esse meio valores negativos são possíveis)
Mark
R4 / R5 é o ganho, no entanto, um ganho de 1000 pode ultrapassar os limites do opamp na frequência que você testou. C2 no circuito está lá apenas para ajudar a mitigar qualquer deslocamento DC na saída do retorno e não afeta o ganho.
Mark
Marque C1 com R1 // R2 tem uma frequência de rolloff de filtro passa-alto de 1,3 kHz. Isso está bem acima de uma boa fração de frequências de voz e 6 oitavas acima do limite inferior "HiFi". Isso pode ser bom se ele quiser apenas fazer um gatilho ativado por som, mas não é bom se ele quiser som digitalizado normal.
Olin Lathrop