Come realizzare una conversione analogica-digitale di un microfono amplificato pulito?


12

Ho fatto un paio di domande relative a questo progetto negli ultimi due giorni, ma non riesco a mettere tutto insieme.

Ho collegato un microfono a elettrete a un opamp e ho dato l'uscita al mio microcontrollore arduino. L'ADC sul microcontrollore converte un intervallo da 0 a 5 vV in un numero di 10 bit (da 0 a 1023).

Ho provato 3 diversi amplificatori:

  • LM386 - Ho ricevuto feedback che questo chip non era adatto a questo scopo, dal momento che non è operativo, e non ha funzionato correttamente come previsto.
  • LM358 - funziona
  • UA741 - funziona, amplifica più di LM358

Ho seguito esattamente questo schema (tranne per il fatto che ho sbagliato i valori della resistenza per ottenere un buon guadagno): ho usato 50k ohm per R5 e 10 ohm per R2. inserisci qui la descrizione dell'immagine

Il problema è che l'output di questi ultimi due chip non è "pulito". L'analRead () su Arduino legge sempre un valore diverso da zero anche quando non faccio rumore nel microfono. La lettura reagisce correttamente quando faccio rumore, ma il valore "zero" è diverso da zero. A volte il valore "zero" sfarfalla anche lanciando continuamente la lettura. Spero che abbia senso.

Potete aiutarmi a risolvere questo problema?

Proprio come altre informazioni non importanti: alla fine sto cercando di fare qualcosa del genere .


Sei sicuro di avere C2 in atto? Qual è la tensione CC silenziosa dopo C2?
Majenko,

Sì, ho C2 a posto. Si tratta di circa 2 volt. Non so se questo abbia un senso: potrebbe essere che ci sia della corrente intrappolata (?) Nel circuito tra i pin 2 e 6, l'uscita e l'inversione dell'ingresso?
Shubham,

Che ne dici della tensione CC silenziosa dopo C2 con la disconnessione dal pin di ingresso di Arduino?
Majenko,

La presenza di C2 significa che l'uscita del preamplificatore oscillerà intorno a 0 V - non a 2,5 V a cui opera internamente.
Majenko,

Un'altra cosa - potresti voler infilare un piccolo diodo shottky tra il preamplificatore C2 e l'ingresso Arduino - gettare via quelle tensioni negative che davvero non ti interessano. Un'altra cosa che ho fatto è stata quella di aggiungere un altro condensatore tra l'ingresso analogico e la massa per rendere più uniforme il segnale. Rende il VU meter un po 'meno sfarfallio.
Majenko,

Risposte:


17

Sbarazzarsi del condensatore di uscita. Probabilmente quel circuito doveva produrre un segnale intorno allo zero, quindi il condensatore è lì per bloccare l'offset di 1/2 Vdd. Tuttavia, il microcontrollore vuole vedere il segnale centrato intorno a 1/2 Vdd, quindi basta sbarazzarsi del condensatore.

I microfoni richiedono molto guadagno. Gli elettreti possono essere sensibili, ma potresti comunque aver bisogno di un guadagno di tensione di 1000. Il guadagno nel tuo circuito è il rapporto tra R5 e R2, ma funziona solo nei limiti di ciò che l'opamp può fare.

I valori che hai menzionato sopra ti darebbero un guadagno di 5000. È molto di più di quanto dovresti cercare di ottenere da un singolo stadio Opamp. Non solo la tensione di offset verrà moltiplicata per questo guadagno, ma l'opamp non sarà in grado di fornirlo su tutta la gamma di frequenza. Con una larghezza di banda di guadagno di 1 MHz, otterrai un guadagno solo leggermente inferiore a 200 Hz. Anche un offset di ingresso di 1 mV diventa 5 V dopo l'amplificazione di 5000.

R2 è anche l'impedenza vista dal microfono dopo il condensatore di ingresso. È necessario che sia leggermente più grande dell'impedenza del microfono con il suo pullup e il condensatore di ingresso alla frequenza più bassa di interesse. 10 Ω è troppo piccolo per quello. 10 kΩ sarebbe un valore migliore.

Prova due fasi con un guadagno di circa 30 per i principianti e vedi dove ti porta. Questo è un guadagno che può gestire su frequenze ragionevoli con sufficiente margine per lasciare funzionare il feedback. È inoltre necessario accoppiare in modo capacitivo i due stadi in modo che la tensione di offset dell'ingresso non si accumuli attraverso tutti gli stadi.

Modifica: circuito aggiunto

Non ho avuto il tempo di tracciare un circuito ieri sera quando ho scritto la risposta sopra. Ecco un circuito che dovrebbe farlo:

Questo ha un guadagno di tensione di circa 1000, che dovrebbe essere sufficiente per un ragionevole microfono ad elettrete. Potrei essere un po 'troppo, ma è facile aggiungere qualche attenuazione.

La topologia è piuttosto diversa dal tuo circuito. L'unica cosa più importante da notare è che non cerca di produrre l'intero guadagno in uno stadio. Ogni fase ha un guadagno di circa 31. Ciò lascia molto margine di guadagno alla frequenza audio massima di 20 kHz per il feedback, quindi il guadagno sarà ben prevedibile e piatto attraverso la gamma di frequenze audio poiché l'MCP6022 ha una tipica larghezza di banda di guadagno prodotto di 10 MHz. Il fattore limitante sarà molto probabilmente il microfono.

A differenza di quanto ho detto prima, i due stadi non devono essere accoppiati in modo capacitivo per evitare l'accumulo della tensione di offset insieme al guadagno. Questo perché in questo circuito, ogni stadio ha solo un guadagno DC di 1, quindi l'offset finale è solo il doppio dell'offset opamp. Questi opamp hanno solo un offset di 500 µV, quindi l'offset finale è solo 1 mV a causa degli opamp. Ci saranno più a causa della mancata corrispondenza di R3 e R4. In ogni caso, il DC in uscita sarà abbastanza vicino a metà dell'alimentazione da non consumare in modo significativo l'intervallo A / D.

Il guadagno CC di 1 per stadio è ottenuto accoppiando in modo capacitivo il percorso del divisore di feedback a terra. Il condensatore blocca CC, quindi ogni stadio è solo un seguace dell'unità per CC. Il guadagno in CA completo viene realizzato quando l'impedenza del condensatore (C3 nel primo stadio) si riduce rispetto alla resistenza del divisore inferiore (R7 nel primo stadio). Questo inizia a succedere a circa 16 Hz. Uno svantaggio di questo approccio è che la costante di tempo da assestare è C3 volte R7 + R5, non solo R7. Questo circuito impiegherà un paio di secondi circa per stabilizzarsi dopo essere stato acceso.


Quando estraggo il limite dall'uscita, l'arduino vede un input di circa 3 volt. Mi dispiace, ma puoi spiegare cosa intendi per tensione di offset? Per ottenere un guadagno di 1000, con R2 pari a 10k Ohm, ho bisogno di 10M ohm per R5? Sei sicuro di questo? Il guadagno è il rapporto tra R5 e R2 giusto?
Shubham,

@Shubham: il tuo circuito tenta di moltiplicare la tensione di offset di Opamp per 5000, quindi non sorprende che l'output sia ancorato a una guida. Nessun opamp è perfetto. La tensione di offset dell'ingresso è la tensione tra i due ingressi quando l'uscita è di fascia media. In teoria i due input sarebbero uguali allora. Le specifiche della tensione di offset in ingresso indicano quanto è lontano da questo ideale.
Olin Lathrop,

@Shubham: Avresti bisogno di 10 MOhm per il resistore di feedback se provassi a fare in modo che uno stadio produca tutto il guadagno. Come ho detto, è una cattiva idea.
Olin Lathrop,

Grazie per tutto l'aiuto, imparando molto qui. Quindi avere due livelli da 30 guadagni ciascuno mi dà un guadagno totale di 900, giusto? Proverò questo usando un LM358 (questo è quello che ho in giro), e
riferirò

Finalmente ha funzionato! Grazie per avermi dato questo schema! Ma sto ottenendo solo un intervallo ADC di circa 200. Il valore ADC silenzioso sarà leggermente superiore al punto medio (512), ma non importa quanto rumore faccio nel microfono, il valore ADC non supererà di oltre 200 il valore silenzioso. Probabilmente è la mia configurazione di cappucci e resistenze che lo sta limitando.
Shubham,

5

Come dici tu, il valore digitale sarà compreso tra 0 e 1023. Il centro di questo intervallo non è 0, è 512 (che corrisponde a una tensione di circa 2,5). Per il silenzio, dovresti vedere qualcosa attorno al centro dell'intervallo come questo. Non deve essere esattamente 512, ma dovrebbe essere vicino. Questo si chiama "DC offset". Il segnale viene spostato verso l'alto e centrato attorno a 2,5 V.

Se stai misurando 2 V e vedi valori ADC intorno a 400, allora funziona sostanzialmente bene.

Le onde sonore vanno da una pressione negativa a una positiva. Se il punto centrale fosse 0 e il segnale potesse essere misurato solo tra 0 e 1023, i valori di pressione negativa (-1023) verrebbero tagliati.

Inoltre, oscillerà sempre leggermente a causa del rumore di fondo dell'ADC. (E ci sarà sempre del rumore audio nella stanza, non importa quanto tu sia silenzioso.)


Ohhh che spiega "DC offset" continuavo a vedere in altre risposte. C'è un modo per rimuovere l'offset CC ma mettere un cappuccio da qualche parte?
Shubham,

@Shubham: VUOI un offset DC. Il processo ADC non funzionerà senza uno. Il tappo C2 è ciò che garantisce di averne uno. In questo caso, probabilmente, non c'è molta differenza, perché l'output di U1 è già compensato. Riesci a misurare il valore CC su ciascun lato di C2?
endolith

@Shubham: Se vuoi dire che vuoi che le tue misure digitali siano centrate intorno a 0 anziché a 512, puoi semplicemente sottrarre l'offset nel tuo software o, meglio, implementare un filtro passa-alto digitale nel software.
endolith

3

Puoi pubblicare la scheda tecnica su quel microfono? Non vi è alcun motivo per cui è necessario un guadagno di 5000 con un microfono a elettrete a meno che non si disponga di un'unità nuda senza FET interna. In tal caso, il preamplificatore deve avere un aspetto molto diverso.

Inoltre, il circuito che hai usato non è terribilmente favorevole all'utilizzo come preamplificatore per un microfono a elettrete.

Consiglierei:

inserisci qui la descrizione dell'immagine

R5 / R4 imposta il guadagno e può essere regolato senza avvitare con l'impedenza di ingresso del circuito. R3 può essere da 2k -> 10k ish. 10k tenderà a migliorare le prestazioni di distorsione, se lo regolate troppo in basso dovreste ripensare i valori di R1 e R2 per fissare l'impedenza di ingresso.

È anche molto importante che l'alimentatore sia adeguatamente disaccoppiato poiché qualsiasi rumore verrà immesso nel microfono.

Come indicato nelle altre risposte, il tuo punto "zero" sarà ~ 512 quando leggi l'ADC e fluttuerà un po ', qualunque cosa tu faccia.

Se il tuo obiettivo è quello di lampeggiare le luci in risposta al livello, non dovresti comunque prendere letture istantanee con un arduino poiché dubito che sarai in grado di campionare abbastanza velocemente per farlo rispondere bene. Effettua invece il rilevamento del livello di picco o medio nel dominio analogico e imposta il periodo di media in modo proporzionale a qualunque sia la tua frequenza di campionamento.

EDIT: Ulteriori informazioni su come farlo con un rilevatore di picco

Il problema che avrai qui è che l'arduino ha una frequenza di campionamento relativamente limitata, penso che il tuo massimo sarà di circa 10 kHz, il che significa che puoi risolvere solo un segnale audio da 5 kHz massimo. Cioè con l'arduino che fa molto poco tranne che per eseguire l'ADC, se devi fare un vero lavoro (e fai un po 'per ottenere il livello) la frequenza di campionamento sarà più bassa.

Ricorda che stai prendendo campioni discreti del segnale grezzo, solo perché hai un'onda sinusoidale a gamma completa che si immette nell'ADC non significa che non otterrai letture di 0 dall'ADC, otterrai campioni in vari punti dell'onda . Con la vera musica il segnale risultante sarà piuttosto complesso e avrai campioni ovunque.

Ora, se tutto ciò che stai cercando di misurare è il livello del segnale in ingresso e non ti interessa davvero ottenere una rappresentazione digitale del segnale, allora puoi usare un semplice rilevatore di picco dopo questo preamplificatore per farlo.

Ciò che fa trasforma il tuo segnale audio in una tensione che rappresenta il suo livello di picco. Quando misurate questa tensione con l'ADC avrete un valore immediato che rappresenta il livello del segnale al momento della lettura. Avrai ancora un po 'di oscillazione poiché il suono è una forma d'onda complessa e sempre variabile, ma questo dovrebbe essere facile da gestire nel software.

Un rilevatore di picco senza presa è in realtà solo un raddrizzatore con un filtro in uscita. In questo caso, dobbiamo gestire i segnali di basso livello e mantenere la precisione, quindi dobbiamo fare un po 'di più di quello che verrebbe fatto per il tuo circuito di raddrizzatore medio. Questa famiglia di circuiti è chiamata "raddrizzatori di precisione".

inserisci qui la descrizione dell'immagine

Ci sono circa un miliardo di modi diversi per farlo ma andrei con questo circuito, sembra funzionare meglio quando si utilizza una singola fornitura. Ciò andrebbe dopo che il circuito di preamplificazione è già stato discusso e l'ingresso potrebbe essere accoppiato o meno in corrente alternata, nonostante funzioni da una singola alimentazione, funzionerà davvero bene con tensioni di ingresso negative purché non superi il picco disponibile- picco di tensione dagli amplificatori operazionali.

OP1 agisce come un diodo (quasi) ideale che aggira il solito problema della caduta di tensione attraverso il diodo durante la rettifica. Quasi ogni piccolo diodo di segnale funzionerà per D1, qualcosa con una caduta di tensione diretta inferiore aumenterebbe l'accuratezza, ma dubito che sarà importante per il tuo uso.

C1 e R4 fungono da filtro passa-basso per smussare l'output, puoi giocare con i loro valori per abbinare le prestazioni a ciò che stai cercando di fare (e alla frequenza di campionamento).

Probabilmente puoi usare lo stesso modello di amplificatore operazionale che usi nel pre-amp, ma Rail-to-Rail e l'alta velocità di risposta sono ideali per questo circuito. In caso di problemi di stabilità, aumentare R1, R2 e R3 a 100k ohm.


Il microfono è un microfono a condensatore elettrete standard. Farò R3 10K, il mio Vcc è 5.9V quindi andrà bene se anche R1 e R2 sono 10K? Quale opamp consiglieresti: LM358 o 741? Esiste un modo per portare il punto "zero" su 0 o vicino a 0? "Invece, effettua il rilevamento del picco o del livello medio nel dominio analogico e imposta il periodo di media in modo proporzionale a qualunque sia la tua frequenza di campionamento." - Puoi darmi qualche dettaglio in più su questo? sembra interessante e voglio davvero esaminarlo. Mi dispiace, devo fare molte domande ... Sono uno studente EE al college e sto ancora imparando.
Shubham,

Ho provato il tuo circuito consigliato (è molto più pulito di quello che stavo usando, meno casualità in uscita). Ho usato 1M Ohm per R5 e 1k Ohm per R4, dando un'amplificazione di 1000. Quando ho fatto alcune misurazioni con un DMM, l'opamp fornisce un'uscita silenziosa di circa 3 volt e C3 la riduce fino a circa 1,5 volt. Anche quando rimuovo R5, non fa alcuna differenza per l'output ... sei sicuro che il guadagno sia R4 / R5?
Shubham,

1
R3 imposta il punto di polarizzazione del FET all'interno del microfono, (R1 || R2) || R3 imposta l'impedenza di ingresso CA vista dal microfono. L'impostazione del punto "zero" su 0 non può essere risolta da nulla nel dominio analogico, questa è una funzione dell'ADC nell'arduino con un singolo alimentatore. Tutto quello che devi fare è sottrarre ~ 512 da ogni campione se non vuoi che nessun suono sia zero (assicurati di usare un tipo di dati con
segno

R4 / R5 è il guadagno, tuttavia un guadagno di 1000 può essere oltre i limiti dell'opamp alla frequenza testata. C2 nel circuito è proprio lì per aiutare a mitigare qualsiasi offset CC nell'uscita dal feedback e non influisce sul guadagno.
Segna il

Mark, C1 contro R1 // R2 ha una frequenza di rolloff del filtro passa alto da 1,3 kHz. È ben al di sopra di una buona frazione delle frequenze vocali e 6 ottave al di sopra del limite inferiore "HiFi". Questo può andare bene se vuole solo fare un trigger attivato dal suono, ma non va bene se vuole un normale suono digitalizzato.
Olin Lathrop,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.