PIC-MCU: Zuverlässige Erfassung und Messung von Trommeltransienten mit ADC

Ich suche Rat, damit meine Schaltung/Code/MCU zuverlässiger und genauer funktioniert. Was ich im Moment habe, ist fast da, aber mir fehlt nur das Know-how, um konsistente Messwerte zu erhalten. Ich habe versucht, ein gutes Bild von dem zu zeichnen, was ich tue, und warum, so ertragen Sie es, es mir zu erklären.

Das Ziel meines Designs ist wirklich einfach, es ist einfach, die Lautstärke einer Trommel einzufangen . Ich mache das über ein Elektret-Mikrofon, in einen Vorverstärker, in den ADC an Bord des PIC18F2620. Mein Ziel bei der Erfassung der Lautstärke von Schlagzeugen ist es, den lautesten Messwert über einen bestimmten Abtastzeitraum anzuzeigen, damit der Benutzer weiß, wie laut er spielt. Die Abtastperiode ist auf etwa 500 ms eingestellt, was dem Benutzer Zeit gibt, sie richtig zu lesen.

Wo es ein wenig kompliziert wird und wo ich kämpfe, ist der Versuch, den lautesten Punkt der Transienten eines Schlagzeugschlags einzufangen. Das Problem mit diesen Transienten ist, dass sie so schnell kommen und gehen, dass sie manchmal, wenn ich sie kräftig schlage, einen Wert anzeigen, der bei weitem nicht so laut ist, wie er hätte sein sollen. Unten sehen Sie, wie der Transient einer Trommel aussieht, und zeigen, wie kurz dieser lauteste Punkt ist.

Hier ist ein Bild der Art von Transienten, die von einer Trommel kommen.

Mein Instinkt ist, dass ich dann mehr Samples pro Sekunde brauche, aber dann frage ich mich, ob weniger, aber längere Samples dieses Problem lösen würden (ich weiß es einfach nicht).

Ok, hoffentlich konnte ich mir ein Bild vom Kontext machen, hier ist, wie ich es gemacht habe.

Alles beginnt mit einer Elektret-Kondensatorkapsel (mit einem Schalldruck von bis zu 130 dB) und dem Vorverstärkerdesign aus dieser Antwort, außer dass ich den LMC6484IMX verwende. Ich habe dieses Detail aufgenommen, falls Sie sehen können, dass dieser Vorverstärker nicht für das geeignet ist, was ich versuche.

Der Ausgang davon wird dann in den ADC-Eingang meines PIC18F2620 eingespeist. Ich habe mich entschieden, den gesamten ADC-Workflow mit Unterbrechungen auszuführen, um Abfragen und Zeitverschwendung zu vermeiden.

Es beginnt damit, dass das Sampling als Interrupt mit hoher Priorität ausgeführt wird, indem das größte Sample erfasst und aufbewahrt wird:

void __interrupt(high_priority) ISRs(void)
{
    if(PIR1bits.ADIF == 1)
    {
        ADC = (ADRESH << 8) | (ADRESL);     // Get ADC value from registers
        if(ADC > ADCpeak)                   // Check if volume result is greater than existing temp
        {
            ADCpeak = ADC;                  // If it is then make that new temp peak
        }
        else{}                              // If it isn't then do nothing
        ADCON0bits.GODONE = 1;              // Start ADC again
        PIR1bits.ADIF = 0;                  // Clear interrupt flag
    }
}

Sobald der Timer 0 abgelaufen ist, wird der Rest als Interrupt mit niedriger Priorität verwaltet. Es wurde entwickelt, um mit der Aktualisierungsrate der Benutzeranzeige (~ 500 ms) ausgeführt zu werden. Ich plane, die Ergebnisse durch Formeln zu verarbeiten, bin also froh, dass es durch mehr Abtasten/andere Interrupts mit hoher Priorität unterbrochen wird, während die Mathematik im Hintergrund läuft:

void __interrupt(low_priority) adcISR(void)          
{
    if(INTCONbits.TMR0IF == 1)
    {
        float adcr = (float)((ADCpeak*100)/1024);    // Convert ADC reading to percentage
        volume = adcr;                               // New volume int ready for displaying
        ADCpeak = 0;                                 // Reset ADC peak
        TMR0 = 61618;                                // Reload timer
        INTCONbits.TMR0IF = 0;                       // Clear flag
    }
}

Im Moment habe ich die ADC-Erfassungszeit auf 12Tad und die Konvertierungsuhr auf Fosc/8 eingestellt, und es hat gut funktioniert. Die Taktfrequenz beträgt ebenfalls 8 MHz. Wie bereits erwähnt, werden laute Hits manchmal immer noch übersehen, und Hits mit ungefähr derselben Lautstärke werden manchmal als sehr unterschiedliche Zahlen angezeigt.

Ich weiß, dass ich Dinge tun kann, damit es Samples genauer und schneller erfasst, aber ich weiß nicht, wie. Ich denke, im Idealfall suche ich nur jemanden, der mir sagt, dass meine Art von Vorverstärker nicht schnell genug ist, oder ich meine Erfassungszeit ändern sollte usw.

Würde mich sehr über alle Beiträge/Vorschläge freuen.

Wie Sie festgestellt haben, korreliert der positive ADC-Spitzenwert nicht gut mit der Messung, an der Sie wirklich interessiert sind, nämlich der Energie des Trommelschlags. Zumindest sollten Sie eine Peak-to-Peak-Messung vornehmen, und noch besser, Sie sollten die RMS-Leistung aller Samples über ein kurzes Intervall messen – z. B. jeweils einige ms.
Vielleicht eine VU-Meter-Schaltung und versuchen Sie nicht, das Audio überhaupt abzutasten.

Antworten (2)

Vielleicht würde ein Peak-Detektor helfen.

Peak-Detektor

Die Ausgabe eines Spitzendetektors steigt, wenn die Eingabe ansteigt. Aber wenn der Input wieder fällt, bleibt der Output wo er ist. Wenn Sie gesampelt haben, können Sie den MOSFET-Schalter schließen, um den Ausgang wieder herunterzufahren. Es besteht jedoch die Gefahr, dass zwischen Ihrem ADC-Sample und dem Schließen des MOSFET-Schalters plötzlich ein Peak auftritt.

Stattdessen könnten Sie einen Widerstand über dem Kondensator hinzufügen, damit der Ausgang langsam wieder auf die Grundlinie zurückkehrt.

Peak-Erkennung

Das bedeutet, dass Sie den Eingang nicht so häufig abtasten müssen, da dieser scharfe Peak jetzt verlängert wurde.

Tolle Idee, danke! Das ist das, was ich benötige. Wenn ich einen Widerstandswert finde, der den Ausgangspegel gerade genug zum Lesen verlangsamt, könnte ich den Mosfet entfernen?
Ja auf jeden Fall. So macht es viel mehr Sinn.
Beim Recherchieren habe ich gelesen, dass Peak-Detektoren und Envelope-Follower sehr ähnlich sind und das von mir verwendete Preamp-Design (siehe Link oben) einen Envelope-Follower-Bereich enthält. Könnte ich theoretisch den 10uf-Kondensator gegen einen größeren austauschen und ihn in einen Spitzendetektor verwandeln?
@ezra_vdj - Ja, absolut. Ich glaube nicht einmal, dass du den Kondensator tauschen musst.

Sie benötigen eine schnellere Abtastung. Ich würde sagen, in der Größenordnung von 10.000 Samples pro Sekunde, wenn Sie einen gut definierten Blick haben möchten.

Wie machst du das? Befreien Sie sich von Fließkommazahlen. Nur ganze Zahlen. Viel Glück.

Es läuft nicht in einer Schleife. Die Probenahme erfolgt zeitgesteuert.
Der Adc läuft nicht einmal mit einem Timer, sondern startet direkt nach Beendigung mit Hilfe eines Interrupts erneut