Dies führt mit Sicherheit zu Verzögerungen, wenn Sie den Pin in einer Blockierungsschleife abfragen.
while (digitalRead (RCpin) == LOW) {// Zählen Sie, wie lange es dauert, bis er hochgefahren ist zu HIGHreading ++; // Inkrementieren, um die Zeit zu verfolgen, wenn (Lesen == 30000) {// Wenn wir so weit gekommen sind, ist der Widerstand so hoch // es ist wahrscheinlich, dass nichts verbunden ist! brechen; // Verlasse die Schleife}
Unter der Annahme, dass dein Compiler den Code äußerst effizient optimieren kann, würde die Ausführung dieser Schleife etwa 4 Codezeilen erfordern, da du den Pin lesen und dann vergleichen musst zu einem Wert, dann verzweigen Sie basierend auf dem Ergebnis (ich wäre sehr beeindruckt, wenn Sie diese wenigen Anweisungen erhalten könnten). Nehmen Sie weiter an, dass jeder dieser Befehle nur einen Taktzyklus benötigt, um ausgeführt zu werden (dies wird wahrscheinlich auch mehr dauern, aber es hilft, das Problem zu begrenzen). Diese Routine kann höchstens dauern:
\ $ MaxRoutineTime = LoopIterations \ times \ frac {Anweisungen} {LoopIteration} \ times \ frac {Seconds} {Anweisungen} \ $
\ $ MaxRoutineTime = 30.000 \ Leerzeichen-Iterationen \ times \ frac {4 \ Leerzeichen-Anweisungen} {LoopIteration} \ times \ frac {Sekunden} {8.000.000 \ Leerzeichen-Anweisungen} \ $
\ $ MaxRoutineTime = 15 \ space mS \ $
, aber ich gehe davon aus, dass es aufgrund der oben genannten Zulagen etwas länger dauern wird.
Der Grund dafür Wenn Sie einen ADC verwenden, können Sie keine Verzögerungen hinzufügen, da das Peripheriegerät so eingerichtet werden kann, dass Interrupts generiert werden. Sie werden erst benachrichtigt, wenn der ADC-Lesevorgang abgeschlossen ist. Die Zeit, die der ADC benötigt, um eine Messung abzuschließen, ist eine endliche Anzahl von Taktzyklen. In der App-Notiz, auf die Sie sich beziehen, wird darauf hingewiesen, dass der ADC, wenn Sie Ihre Taktrate verlangsamen, immer noch die gleiche Anzahl von Taktzyklen benötigt Wenn Sie eine Messung abgeschlossen haben, dauert Ihre Messung länger, da die Uhr langsamer ist.
Bearbeiten
Auf den ersten Blick von Ihrem Bild aus, zusammen mit der Tatsache, dass Sie Audio erwähnt haben, dachte ich, Sie messen einen Mikrofoneingang. Es scheint jedoch, dass Sie nur einen Force Sensitive Resistor (FSR) verwenden, der nur ein Drucksensor ist. Wenn Sie den Druck nicht kennen müssen, nur dass er gedrückt wurde, müssen Sie sich nicht die Mühe machen, den genauen Messwert zu finden. Sie können einfach einen Interrupt-generierenden Digitaleingang verwenden, wenn Sie den richtigen Widerstandswert (anstelle des Kondensators) auswählen. Sie setzen einfach einen digitalen Pin, um Interrupts bei ansteigenden Flanken zu erzeugen, und wählen einen Widerstand aus, der Ihnen eine Zustandsänderung (niedrig / hoch) mit der gewünschten Kraft für Ihre Berührung ermöglicht. Dann wissen Sie jedes Mal, wenn der FSR gedrückt wurde, und können ihn unblockierend handhaben, wodurch die geringstmögliche Latenz eingeführt wird.