Comment faire une conversion analogique-numérique de microphone amplifié propre?

12

J'ai posé quelques questions concernant ce projet ces derniers jours, mais je n'arrive pas à tout mettre ensemble.

J'ai branché un micro à électret dans un ampli-op et donné la sortie à mon microcontrôleur Arduino. L'ADC sur le microcontrôleur convertit une plage de 0 à 5 vV en un nombre de 10 bits (0 à 1023).

J'ai essayé 3 puces d'amplis différentes:

  • LM386 - J'ai reçu des commentaires, cette puce n'était pas bonne à cet effet, car ce n'est pas un ampli op, et cela ne fonctionnait pas correctement comme prévu.
  • LM358 - travaux
  • UA741 - fonctionne, amplifie plus que LM358

J'ai suivi ce schéma exactement (sauf que j'ai dérangé avec les valeurs de résistance pour obtenir un bon gain): j'ai utilisé 50k ohms pour R5 et 10 ohms pour R2. entrez la description de l'image ici

Le problème est que la sortie des deux dernières puces n'est pas "propre". L'analogueRead () sur l'Arduino lit toujours une valeur non nulle même lorsque je ne fais aucun bruit dans le micro. La lecture réagit correctement lorsque je fais du bruit, mais la valeur "zéro" est non nulle. Parfois, la valeur "zéro" scintille même en rejetant constamment la lecture. J'espère que cela avait du sens.

Pouvez-vous m'aider à résoudre ce problème?

Tout aussi peu important, des informations supplémentaires: j'essaie de faire quelque chose comme ça , finalement.

Shubham
la source
Vous êtes certain d'avoir C2 en place? Quelle est la tension continue silencieuse après C2?
Majenko
Oui, j'ai C2 en place. C'est environ 2 volts. Je ne sais pas si cela a un sens: pourrait-il y avoir du courant piégé (?) Dans la boucle entre les broches 2 et 6, la sortie et l'entrée inverseuse?
Shubham
Que diriez-vous de la tension CC silencieuse après C2 avec elle déconnectée de la broche d'entrée Arduino?
Majenko
La présence de C2 signifie que la sortie du préampli oscille autour de 0V - et non de 2,5V sur laquelle il fonctionne en interne.
Majenko
Une autre chose - vous voudrez peut-être glisser une petite diode shottky entre le préampli C2 et l'entrée Arduino - jetez ces tensions négatives qui ne vous intéressent vraiment pas. Une autre chose que j'ai faite a été d'ajouter un autre condensateur entre l'entrée analogique et la masse pour lisser un peu le signal. Rend le VU-mètre un peu moins scintillant.
Majenko

Réponses:

17

Débarrassez-vous du condensateur de sortie. Ce circuit était probablement destiné à produire un signal autour de zéro, donc le condensateur est là pour bloquer le décalage 1/2 Vdd. Cependant, le microcontrôleur veut voir le signal centré autour de 1/2 Vdd, alors débarrassez-vous simplement du condensateur.

Les micros ont besoin de beaucoup de gain. Les électrets peuvent être sensibles, mais vous pourriez toujours avoir besoin d'un gain de tension de 1000. Le gain dans votre circuit est le rapport de R5 à R2, mais cela ne fonctionne que dans les limites de ce que l'ampli-op peut faire.

Les valeurs que vous avez mentionnées ci-dessus vous donneraient un gain de 5000. C'est beaucoup plus que ce que vous devriez essayer d'obtenir à partir d'un seul étage d'opamp. Non seulement la tension de décalage sera multipliée par ce gain, mais l'ampli-op ne pourra pas fournir cela sur toute la plage de fréquences. À 1 MHz de gain de bande passante, vous n'obtiendrez que ce gain légèrement inférieur à 200 Hz. Même un décalage d'entrée de 1 mV devient 5 V après une amplification de 5000.

R2 est également l'impédance vue par le microphone après le condensateur d'entrée. Vous avez besoin que cela soit un peu plus grand que l'impédance du microphone avec son pullup et le condensateur d'entrée à la fréquence d'intérêt la plus basse. 10 Ω est bien trop petit pour ça. 10 kΩ serait une meilleure valeur.

Essayez deux étapes avec un gain d'environ 30 pour commencer et voyez où cela vous mène. C'est un gain qu'il peut gérer sur des fréquences raisonnables avec suffisamment de marge pour que la rétroaction fonctionne. Vous devez également coupler capacitivement les deux étages afin que la tension de décalage d'entrée ne s'accumule pas à travers tous les étages.

Edit: Circuit ajouté

Je n'ai pas eu le temps de dessiner un circuit hier soir quand j'ai écrit la réponse ci-dessus. Voici un circuit qui devrait le faire:

Cela a un gain de tension d'environ 1000, ce qui devrait être suffisant pour un microphone à électret raisonnable. Je suis peut-être un peu trop, mais il est facile d'ajouter une certaine atténuation.

La topologie est assez différente de votre circuit. La chose la plus importante à noter est qu'il n'essaie pas de produire le gain entier en une seule étape. Chaque étage a un gain d'environ 31. Cela laisse beaucoup de marge de gain à la fréquence audio maximale de 20 kHz pour le retour, donc le gain sera bien prévisible et plat sur toute la plage de fréquences audio puisque le MCP6022 a une bande passante de gain typique produit de 10 MHz. Le facteur limitant sera très probablement le microphone.

Contrairement à ce que j'ai dit précédemment, les deux étages n'ont pas besoin d'être couplés capacitivement pour empêcher la tension de décalage de s'accumuler avec le gain. En effet, dans ce circuit, chaque étage n'a qu'un gain CC de 1, donc le décalage final n'est que le double du décalage opamp. Ces opamps ont seulement un décalage de 500 µV, donc le décalage final n'est que de 1 mV en raison des opamps. Il y aura plus en raison de l'inadéquation de R3 et R4. Dans tous les cas, la sortie DC sera suffisamment proche de la moitié de l'alimentation pour ne pas manger de manière significative dans la plage A / D.

Le gain CC de 1 par étage est obtenu en couplant capacitivement le chemin du diviseur de rétroaction à la terre. Le condensateur bloque DC, donc chaque étage n'est qu'un suiveur d'unité pour DC. Le gain CA total est réalisé lorsque l'impédance du condensateur (C3 dans le premier étage) devient petite par rapport à la résistance de diviseur inférieure (R7 dans le premier étage). Cela commence à se produire à environ 16 Hz. Un inconvénient de cette approche est que la constante de temps à régler est C3 fois R7 + R5, pas seulement R7. Ce circuit prendra quelques secondes environ pour se stabiliser après avoir été allumé.

Olin Lathrop
la source
Lorsque je retire le capuchon de la sortie, l'arduino voit une entrée d'environ 3 volts. Je suis désolé, mais pouvez-vous expliquer ce que vous entendez par tension de décalage? Pour obtenir un gain de 1000, avec R2 étant 10k Ohm, j'ai besoin de 10M ohm pour R5? Es-tu sûr de ça? Le gain est le rapport entre R5 et R2 non?
Shubham
@Shubham: Votre circuit essaie de multiplier la tension de décalage de l'ampli op par 5000, il n'est donc pas surprenant que la sortie soit rattachée à un rail. Aucun opamp n'est parfait. La tension de décalage d'entrée est la tension entre les deux entrées lorsque la sortie est dans la plage moyenne. En théorie, les deux entrées seraient alors égales. La spécification de tension de décalage d'entrée vous indique à quelle distance elle est éloignée de cet idéal.
Olin Lathrop
@Shubham: Vous auriez besoin de 10 MOhm pour la résistance de rétroaction si vous essayiez d'avoir un étage pour produire tout le gain. Comme je l'ai dit, c'est une mauvaise idée.
Olin Lathrop
Merci pour toute l'aide, j'apprends beaucoup ici. Donc, avoir deux niveaux de gain de 30 chacun me donne un gain total de 900, non? J'essaierai ceci en utilisant un LM358 (c'est ce que j'ai traîner), et je ferai rapport
Shubham
Enfin ça a marché! Merci de m'avoir donné ce schéma! Mais je n'obtiens qu'une plage ADC d'environ 200. La valeur ADC silencieuse sera un peu au-dessus du point médian (512), mais peu importe le bruit que je fais dans le micro, la valeur ADC ne dépassera pas 200 au-dessus la valeur silencieuse. C'est probablement ma configuration de bouchons et de résistances qui limite cela.
Shubham
5

Comme vous le dites, la valeur numérique sera de 0 à 1023. Le milieu de cette plage n'est pas 0, c'est 512 (ce qui correspond à une tension d'environ 2,5). Pour le silence, vous devriez voir quelque chose au milieu de la plage comme ceci. Ne doit pas être exactement 512, mais il doit être proche. C'est ce qu'on appelle le "décalage CC". Le signal est décalé vers le haut et centré autour de 2,5 V.

Si vous mesurez 2 V et que vous voyez des valeurs ADC autour de 400, cela fonctionne très bien.

Les ondes sonores passent de la pression négative à la pression positive. Si le point central était 0 et que le signal ne pouvait être mesuré qu'entre 0 et 1023, les valeurs de pression négative (-1023) seraient coupées.

De plus, il fluctuera toujours un peu en raison du bruit de fond de l'ADC. (Et il y aura toujours du bruit audio dans la pièce, peu importe à quel point vous êtes silencieux.)

endolith
la source
Ohhh, cela explique le "décalage DC" que je n'arrêtais pas de voir dans d'autres réponses. Existe-t-il un moyen de supprimer le décalage DC tout en mettant un capuchon quelque part?
Shubham
@Shubham: Vous VOULEZ un décalage DC. Le processus ADC ne fonctionnera pas sans un. Le bouchon C2 est ce qui garantit que vous en avez un. Dans ce cas, il n'y a probablement pas beaucoup de différence, car la sortie de U1 est déjà décalée. Pouvez-vous mesurer la valeur DC de chaque côté de C2?
endolith
@Shubham: Si vous voulez que vos mesures numériques soient centrées sur 0 au lieu de 512, vous pouvez simplement soustraire le décalage dans votre logiciel, ou mieux, implémenter un filtre passe-haut numérique dans le logiciel.
endolith
3

Pouvez-vous publier la fiche technique sur ce microphone? Il n'y a aucune raison pour laquelle vous devriez avoir besoin d'un gain de 5000 avec un micro à électret, sauf si vous avez une unité nue sans FET interne. Si tel est le cas, le préampli doit être très différent.

De plus, le circuit que vous avez utilisé n'est pas très propice à être utilisé comme préampli pour un micro à électret.

Je recommanderais:

entrez la description de l'image ici

R5 / R4 règle le gain et peut être ajusté sans vissage avec l'impédance d'entrée du circuit. R3 peut être de 2k -> 10k ish. 10k aura tendance à améliorer les performances de distorsion, si vous ajustez cette valeur trop bas, vous devriez repenser les valeurs de R1 et R2 pour fixer l'impédance d'entrée.

Il est également très important que l'alimentation soit correctement découplée car tout bruit alimentera le microphone.

Comme les autres réponses l'ont mentionné, votre point "zéro" sera de ~ 512 lorsque vous lirez l'ADC et fluctuera un peu, quoi que vous fassiez.

Si votre objectif est de faire clignoter des lumières en réponse au niveau, vous ne devriez pas prendre de mesures instantanées avec un arduino de toute façon, car je doute que vous puissiez échantillonner assez rapidement pour qu'il réagisse bien. À la place, effectuez une détection de niveau de crête ou de moyenne dans le domaine analogique et réglez la période de moyenne proportionnellement à votre taux d'échantillonnage.

EDIT: Plus d'informations sur cette opération avec un détecteur de crête

Le problème que vous aurez ici est que l'arduino a un taux d'échantillonnage relativement limité, je pense que votre maximum va être d'environ 10 kHz, ce qui signifie que vous ne pouvez résoudre qu'un signal audio de 5 kHz maximum. C'est-à-dire que l'arduino fait très peu, sauf en exécutant l'ADC, si vous avez besoin de faire un vrai travail (et vous en faites pour obtenir le niveau), le taux d'échantillonnage sera plus faible.

Rappelez-vous que vous prenez des échantillons discrets du signal brut, ce n'est pas parce que vous avez une onde sinusoïdale à pleine gamme alimentant l'ADC que vous n'obtiendrez pas de lectures de 0 à partir de l'ADC, vous obtiendrez des échantillons à différents points de l'onde . Avec de la vraie musique, le signal résultant sera assez complexe et vous aurez des échantillons partout.

Maintenant, si tout ce que vous essayez de mesurer est le niveau du signal d'entrée, et que vous ne vous souciez pas d'obtenir une représentation numérique du signal, vous pouvez utiliser un simple détecteur de crête après ce préampli pour le faire.

Qu'est-ce que cela transforme votre signal audio en une tension qui représente son niveau de crête. Lorsque vous mesurez cette tension avec l'ADC, vous aurez une valeur immédiate représentant le niveau du signal au moment où la lecture a été prise. Vous aurez encore un peu d'oscillation car le son est une forme d'onde complexe, toujours variable, mais cela devrait être facile à gérer dans le logiciel.

Un détecteur de crête sans maintien n'est vraiment qu'un redresseur avec un filtre sur la sortie. Dans ce cas, nous devons traiter les signaux de bas niveau et maintenir la précision, nous devons donc faire un peu plus que ce qui serait fait pour votre circuit redresseur moyen. Cette famille de circuits est appelée "redresseurs de précision".

entrez la description de l'image ici

Il y a environ un milliard de façons différentes de le faire, mais j'irais avec ce circuit, il semble fonctionner mieux lorsque vous utilisez une seule alimentation. Cela irait après le circuit de préampli déjà discuté et l'entrée pourrait être couplée en CA ou non, bien qu'elle fonctionne à partir d'une seule alimentation, cela fonctionnera très bien avec des tensions d'entrée négatives tant que vous ne dépassez pas le pic disponible. tension crête des amplis opérationnels.

OP1 agit comme une diode (presque) idéale qui contourne le problème habituel de chute de tension à travers la diode lors du redressement. Presque n'importe quelle petite diode de signal fonctionnera pour D1, quelque chose avec une baisse de tension directe inférieure augmenterait la précision, mais je doute que cela importera pour votre utilisation.

C1 et R4 agissent comme un filtre passe-bas pour lisser la sortie, vous pouvez jouer avec leurs valeurs pour adapter les performances à ce que vous essayez de faire (et votre taux d'échantillonnage).

Vous pouvez probablement utiliser le même modèle d'ampli op que vous utilisez dans le préampli, mais Rail-to-Rail et un taux de balayage élevé sont idéaux pour ce circuit. Si vous avez un problème de stabilité, augmentez R1, R2 et R3 à 100k ohms.

marque
la source
Le micro est un micro à condensateur à électret standard. Je ferai du R3 10K, mon Vcc est de 5,9V alors ça ira si R1 et R2 sont également 10K? Quel opamp recommanderiez-vous: LM358 ou 741? Existe-t-il un moyen de ramener le point "zéro" à 0 ou près de 0? "Au lieu de cela, effectuez une détection de crête ou de niveau moyen dans le domaine analogique et réglez la période de moyenne proportionnellement à votre taux d'échantillonnage." - Pouvez-vous me donner un peu plus de détails à ce sujet? cela semble intéressant et je veux vraiment y réfléchir. Désolé, j'ai beaucoup de questions ... Je suis un étudiant EE au collège en train d'apprendre.
Shubham
J'ai essayé votre circuit recommandé (c'est beaucoup plus propre que ce que j'utilisais, moins d'aléatoire en sortie). J'ai utilisé 1M Ohm pour R5 et 1k Ohm pour R4, donnant une amplification de 1000. Quand j'ai fait quelques mesures avec un DMM, l'opamp donne une sortie silencieuse d'environ 3 volts, et C3 la réduit à environ 1,5 volts. De plus, lorsque je supprime R5, cela ne fait aucune différence pour la sortie ... êtes-vous sûr que le gain est R4 / R5?
Shubham
1
R3 définit le point de polarisation du FET à l'intérieur du microphone, (R1 || R2) || R3 définit l'impédance d'entrée CA vue par le microphone. La définition du point "zéro" à 0 ne peut être résolue par rien dans le domaine analogique, c'est une fonction de l'ADC dans l'arduino ayant une seule alimentation. Tout ce que vous avez à faire est de soustraire ~ 512 de chaque échantillon si vous ne voulez pas que le son soit nul (assurez-vous d'utiliser un type de données signé car cela signifie que des valeurs négatives sont possibles)
Mark
R4 / R5 est le gain, mais un gain de 1000 peut dépasser les limites de l'ampli op à la fréquence que vous avez testée. C2 dans le circuit est juste là pour aider à atténuer tout décalage CC dans la sortie de la rétroaction et n'a pas d'impact sur le gain.
Mark
Mark, C1 contre R1 // R2 a une fréquence de coupure du filtre passe-haut de 1,3 kHz. C'est bien au-dessus d'une bonne fraction des fréquences vocales et 6 octaves au-dessus de la limite inférieure "HiFi". Cela peut être bien s'il veut juste faire un déclencheur activé par le son, mais pas bon s'il veut un son numérisé normal.
Olin Lathrop