Arduino: zwei weitere analoge Eingänge!

Ich habe es mit analogen Sensoren zu tun. Ich habe ein Arduino Lilypad Simple Board mit nur 4 analogen Eingängen. Jetzt brauche ich zwei weitere Sensoren und ich habe im Netz diese Schaltpläne gefunden:Geben Sie hier die Bildbeschreibung ein

Aber ich verstehe nicht, ob es zu Verzögerungen bei meinem Projekt kommen könnte, weil ich Audio-Video-Sachen kontrolliere und jede Art von Verzögerung vermieden werden muss.

Dann habe ich bei dem Link folgendes gelesen:

Es ist möglich, den tatsächlichen Widerstand aus dem Messwert zu berechnen, aber leider führen Variationen in der IDE- und Arduino-Platine dazu, dass er inkonsistent wird. Beachten Sie, dass, wenn Sie die IDE-Versionen von Betriebssystemen ändern oder ein 3,3-V-Arduino anstelle von 5 V verwenden oder von einem 16-MHz-Arduino zu einem 8-MHz-Arduino (wie einem Seerosenblatt) wechseln, es zu Unterschieden kommen kann, je nachdem, wie lange das Lesen dauert Wert einer Nadel. Normalerweise ist das keine große Sache, aber es kann Ihr Projekt schwer zu debuggen machen, wenn Sie es nicht erwarten!

Ich bin kein großer Experte für Arduino und ich verstehe nicht, was ich für Lilypad ändern muss.

Jeder Rat könnte geschätzt werden!

Antworten (2)

Dies führt mit Sicherheit zu Verzögerungen, da Sie den Pin in einer Sperrschleife abfragen

while (digitalRead(RCpin) == LOW) { // count how long it takes to rise up to HIGH
reading++;      // increment to keep track of time 

if (reading == 30000) {
  // if we got this far, the resistance is so high
  // its likely that nothing is connected! 
  break;           // leave the loop
}

Unter der Annahme, dass Ihr Compiler den Code extrem effizient optimieren kann, würde diese Schleife ungefähr 4 Codezeilen für die Ausführung benötigen, da Sie den Pin lesen, ihn dann mit einem Wert vergleichen und dann basierend auf dem Ergebnis verzweigen müssen (ich wäre sehr beeindruckt, wenn Sie könnten diese paar Anweisungen bekommen). Nehmen Sie weiter an, dass jede dieser Anweisungen nur 1 Taktzyklus benötigt, um ausgeführt zu werden (dies wird wahrscheinlich auch mehr dauern, aber es hilft, das Problem einzugrenzen). Diese Routine könnte höchstens dauern :

M A X R Ö u T ich N e T ich M e = L Ö Ö P ICH T e R A T ich Ö N S × ICH N S T R u C T ich Ö N S L Ö Ö P ICH T e R A T ich Ö N × S e C Ö N D S ICH N S T R u C T ich Ö N S

M A X R Ö u T ich N e T ich M e = 30 , 000   ICH T e R A T ich Ö N S × 4   ICH N S T R u C T ich Ö N S L Ö Ö P ICH T e R A T ich Ö N × S e C Ö N D S 8 , 000 , 000   ICH N S T R u C T ich Ö N S

M A X R Ö u T ich N e T ich M e = 15   M S

aber ich nehme an, dass es aufgrund der oben genannten Zulagen etwas länger dauern wird.

Der Grund, warum es bei der Verwendung eines ADC keine Verzögerungen hinzufügt, liegt darin, dass das Peripheriegerät so eingerichtet werden kann, dass es Interrupts generiert und Sie nur benachrichtigt werden, wenn das ADC-Lesen abgeschlossen ist. Die Zeit, die der ADC benötigt, um eine Messung abzuschließen, ist eine endliche Anzahl von Taktzyklen. Die App-Notiz, auf die Sie sich beziehen, weist darauf hin, dass der ADC immer noch die gleiche Anzahl von Taktzyklen benötigt, wenn Sie Ihre Taktgeschwindigkeit verlangsamen Wenn Sie eine Messung abschließen, dauert Ihre Messung länger, da die Uhr langsamer ist.

Bearbeiten

Auf den ersten Blick von Ihrem Bild, kombiniert mit der Tatsache, dass Sie Audio erwähnt haben, dachte ich, Sie würden einen Mikrofoneingang messen. Es scheint jedoch, dass Sie nur einen Force Sensitive Resistor (FSR) verwenden, der nur ein Drucksensor ist. Wenn Sie nicht wissen müssen, wie viel Druck ausgeübt wurde, müssen Sie sich nicht die Mühe machen, den genauen Messwert zu finden. Sie können einfach jeden Interrupt-erzeugenden Digitaleingang verwenden, wenn Sie den richtigen Widerstandswert (anstelle des Kondensators) wählen. Sie setzen einfach einen digitalen Pin, um Interrupts bei steigenden 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 gibt. Dann wissen Sie jedes Mal, wenn der FSR gedrückt wurde, und können dies auf nicht blockierende Weise handhaben, wodurch die geringstmögliche Latenzzeit eingeführt wird.

"mindestens" oder "höchstens"? Höchstens ( 30000 × n ) / 8 MHz, wobei n die Anzahl der CPU-Zyklen ist, die in der Schleife verbracht werden (ich denke, die Reihenfolge von n = 4 Zyklen. Das Senken der Obergrenze beschleunigt die Konvertierung, verringert jedoch die Genauigkeit.
@jippie - Guter Fang! Ein feiner, aber wichtiger Unterschied. Entsprechend bearbeitet.

Ich habe nie mit Arduino gearbeitet, aber die meisten Mikrocontroller haben Interrupt-Pins, also muss Arduino das auch haben. Wenn Sie einen Interrupt-Pin verwenden, um zu erkennen, dass der Kondensator bis zum Schwellenwert aufgeladen ist, treten keine Verzögerungen auf und Ihr Programm kann normal ausgeführt werden, während die Messung stattfindet. Sie müssen nur einen Pin verwenden, der einen Interrupt zulässt.

  1. Bestätigen Sie den Stift niedrig
  2. Stellen Sie sicher, dass der Stift niedrig genug ist, um den Kondensator zu entladen
  3. Aktivieren Sie den Interrupt und setzen Sie einen Timer zurück
  4. Machen Sie den Pin zu einem Eingang (der Kondensator beginnt mit dem Laden)
  5. Führen Sie Ihren Code aus
  6. Wenn der Interrupt auftritt, lesen Sie den Timer-Wert (dies ist Ihr gemessener Wert) und setzen Sie den Pin auf Low
+1: So können Sie RC-Zeiten mit einem digitalen Eingang messen. Die Pints ​​gefallen mir besonders gut.
@stevenvh Korrigiert. Fehler machen, kopieren und einfügen und fertig :-)