Ein Blick durch die Lupe offenbart die Schaltung. Und mein Multimeter kann einigermaßen zuverlässig die Bauteile auch im eingebauten Zustand messen (löten darf ich ja nicht...). Der OPV wurde offenbar als Inverter mit der Verstärkung 1 eingesetzt. Ich hoffe nicht, dass das eine geplante Entscheidung war, die dem Lärm der Grundschulkinder Rechnung trägt. Eher vermute ich, dass es ein Ergebnis der Teamarbeit ist. Einer hat schon mal der Prinzip gezeichnet, ein anderer wollte noch die richtige Verstärkung herausfinden, kam aber dann nicht mehr dazu.
Ist aber kein Problem, die Verstärkung kann ohne Änderung der Platine angepasst werden. Ich schlage einen Verstärkungsfaktor von 100 vor. Man könnte R1 = 1 k und R2 = 100 k wählen, aber dann wäre die untere Grenzfrequenz 1,6 kHz. Besser ist es vielleicht, R1 bei 10 k zu lassen und R2 auf 1 M zu ändern, dann läge die untere Grenzfrequenz wie jetzt auch bei 160 Hz. Man müsste mal testen, ob der verwendete OPV dafür geeignet ist, oder ob er dann zu viel Offset hat. Wer schon einen eigenen Callope und damit die Lizenz zum Löten hat, kann es ja mal testen.
Inzwischen habe ich ja den Schaltplan des Calliope gefunden, und er bestätigt weitgehend die Messungen am Mikrofonverstärker. Da zeichnet sich übrigens ein Weg ab, wie man die Verstärkung minimalinvasiv erhöhen kann. Es sollte reichen, R40 (= R1 in meiner Skizze) mit einem Drähtchen zu überbrücken. Das Mikrofon hat einen Innenwiderstand von rund 100 Ohm. So kommt man auch auf eine 100-fache Verstärkung, allerdings auf Kosten der unteren Grenzfrequenz. Besser wäre es also, R41 durch 1 MOhm zu ersetzen.
Ein weiteres
Detail fällt ins Auge. Ich hatte zwar auf der Platine schon einen
Kondensator
zwischen OPV-Ausgang und GND gesehen, hatte aber vermutet, dass er sehr
klein
ist. Im Schaltplan ist er dagegen mit 100 nF angegeben. Das ist
ungewöhnlich,
die meisten OPVs darf man nicht stark kapazitiv belasten. Bei höheren
Frequenzen stellt der Kondensator eine geringe Impedanz dar, die den
OPV zu
einer starken Strom-Aussteuerung zwingt. Sobald die Ausgangsströme in
ihre Sättigung
gehen, wird der Strom rechteckförmig und die Ausgangsspannung
dreieckförmig.
Dieses Verhalten konnte auch nachgewiesen werden, indem am
invertierenden
Eingang ein Signal vom NF-Generator eingespeist wurde. Durch
Parallelschalten eines weiteren Kondensators mit 100 nF wurde bei
sehr hohen Frequenzen die Amplitude halbiert. Damit ist klar, dass
tatsächlich 100 nF bestückt wurde.
Man sieht sozusagen, wie der OPV sich quälen muss, den Kondensator umzuladen. Bei einer geringeren Frequenz wird dagegen noch ein fast sauberer Sinus übertragen.
Erstaunlich ist, dass der OPV noch bis etwa 20 kHz gegen den Kondensator von 100 nF ankommt. Kurz nachgerechnet, der kapazitive Widerstand bei 20 kHz beträgt 80 Ohm. Offensichtlich kommt der MCP6001 damit noch klar. Trotzdem, der Kondensator sollte nicht bestückt werden. Falls das ein Kampf gegen vagabundierende HF war, dürfte ein kleiner Kondensator von 1 nF reichen.
let leds = 0
let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 500; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach < 10) {
leds = 0
}
if (krach > 10) {
leds = 1
}
if (krach > 20) {
leds = 2
}
if (krach > 40) {
leds = 3
}
if (krach > 80) {
leds = 4
}
if (krach > 160) {
leds = 5
}
if (krach > 320) {
leds = 6
}
if (krach > 640) {
leds = 7
}
basic.showNumber(leds)
})
let leds = 0
let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 500; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach < 10) {
leds = 0
}
if (krach > 10) {
leds = 1
}
if (krach > 20) {
leds = 2
}
if (krach > 40) {
leds = 3
}
if (krach > 80) {
leds = 4
}
if (krach > 160) {
leds = 5
}
if (krach > 320) {
leds = 6
}
if (krach > 640) {
leds = 7
}
if (leds == 0) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
}
if (leds == 1) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . # . .
`)
}
if (leds == 2) {
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . # . .
. # # # .
`)
}
if (leds == 3) {
basic.showLeds(`
. . . . .
. . . . .
. . # . .
. # # # .
# # # # #
`)
}
if (leds == 4) {
basic.showLeds(`
. . . . .
. . # . .
. # # # .
# # # # #
# # # # #
`)
}
if (leds == 5) {
basic.showLeds(`
. . # . .
. # # # .
# # # # #
# # # # #
# # # # #
`)
}
if (leds == 6) {
basic.showLeds(`
. # # # .
# # # # #
# # # # #
# # # # #
# # # # #
`)
}
if (leds == 7) {
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
}
})
let krach = 0
let micwert = 0
let min = 0
let max = 0
basic.forever(() => {
max = 0
min = 1023
for (let index = 0; index <= 100; index++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
krach = max - min
if (krach > 1) {
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.pause(1000)
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
}
})
Die Auswertung verwendet dasselbe Verfahren wie das Krachometer. Es beruht auf
einer Methode, die schon bei andern Mikrocontrollern für die Messung kleiner
Wechselspannungen verwendet wurde. Weil man ja die Frequenz nicht kennt und
deshalb nicht phasenrichtig auf den Spitzenwert einer Schwingung zugreifen
kann, verlässt man sich auf die Statistik. Bei 100 Messungen werden einige die
positiven Spitzen und einige die negativen Spitzen treffen. So findet das
Programm die Minima und Maxima im Signalverlauf. Deren Differenz ist die
Spitze-Spitze-Amplitude.
Beim Calliope liegt die Ruhespannung des Mikrofonverstärkers bei der halben
Betriebsspannung und wird mit etwa 512 gemessen. Die Mittenspannung wird mit
dem Spannungsteiler R42/R43 mit zweimal 100 k bei einer Genauigkeit von
1% hergestellt. Man muss also mit einem Fehler bis 2% rechnen, weil die
Widerstände in unterschiedlichen Richtungen abweichen könnten. Außerdem wird
die Abweichung durch den Offsetfehler des OPV vergrößert. Typische Abweichungen
vom theoretischen Ruhewert könnten im Bereich bis +/-10 liegen. Tatsächlich
wurde eine Ruhespannung von 517 gefunden.
Wenn man sich auf den Nullwert 512 verlässt (micwert =
pins.analogReadPin(AnalogPin.MIC) - 512), hätte man also schon einen Pegel von
5 LSB, was einem sehr lauten Geräusch beim ursprünglichen Verstärker
entspricht. Das bedeutet, mit einem festen Mittelwert müsste man jede Platine
individuell anpassen. Bei dem vorgestellten Verfahren der Spitze-Spitze-Messung
spielt die Mittenspannung dagegen überhaupt keine Rolle. Sie dürfte sich sogar
während der Betriebsdauer stetig ändern. Deshalb läuft diese Software ohne
besonderen Abgleich auf allen Platinen gleich gut.
Auch diese Version verwendet die Balkenanzeige, aber diesmal für eine zuverlässige Dezibel-Anzeige. Die Signalspannung U muss dazu logarithmiert werden. Dazu wird ein auf Ganzzahlen optimiertes Näherungsverfahren verwendet, das passend zur Balkenanzeige jeweils drei Stufen als 10 dB darstellt. Das Messgerät hat damit einem Messumfang von 50 dB. Das Programm enthält einen Faktor 10, den man ändern kann, um die Anzeige zu kalibrieren.
let krach2 = 0
let L1 = 0
let L = 0
let U = 0
let micwert = 0
let min = 0
let max = 0
let N = 0
basic.forever(() => {
max = 0
min = 1023
for (let N = 0; N <= 500; N++) {
micwert = pins.analogReadPin(AnalogPin.MIC)
if (max < micwert) {
max = micwert
}
if (min > micwert) {
min = micwert
}
}
U = max - min
U = U * 10
L = 0
for (let N = 0; N <= 15; N++) {
L1 = N % 3
if (L1 == 0) {
U = U * 10
U = U / 31
}
if (U > L1) {
L = N
}
}
led.plotBarGraph(
L,
14
)
})
Stufe | U | dB | |
0 | 0 | 0 | |
1 | 1 | 3 | |
2 | 2 | 6 | |
3 | 3 | 10 | genau |
4 | 4 | 13 | |
5 | 6 | 16 | |
6 | 10 | 2o | genau |
7 | 11 | 23 | |
8 | 20 | 26 | |
9 | 30 | 30 | genau |
10 | 33 | 33 | |
11 | 60 | 36 | |
12 | 100 | 40 | genau |
13 | 110 | 43 | |
14 | 200 | 45 | |
15 | 300 | 50 | genau |