Frage:
Arduino: zwei weitere analoge Eingänge!
nkint
2012-07-23 16:27:39 UTC
view on stackexchange narkive permalink

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 habe im Netz dieses Schema gefunden: enter image description here

Aber ich Ich verstehe nicht, ob es zu Verzögerungen in meinem Projekt kommen kann, weil ich Audio-Video-Inhalte kontrolliere und jede Art von Verzögerung vermieden werden muss.

Dann habe ich auf dem Link Folgendes gelesen:

Es ist möglich, den tatsächlichen Widerstand aus dem Messwert zu berechnen, aber leider machen Abweichungen in der IDE und der Arduino-Platine ihn inkonsistent. Beachten Sie, dass es zu Unterschieden kommen kann, wenn Sie 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 Lilypad) wechseln Wert eines Pins. Normalerweise ist das keine große Sache, aber es kann das Debuggen Ihres Projekts erschweren, wenn Sie es nicht erwarten!

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

Jeder Rat wäre willkommen!

Zwei antworten:
Bruno Ferreira
2012-07-23 18:07:28 UTC
view on stackexchange narkive permalink

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

  1. Setzen Sie den Pin auf niedrig
  2. Stellen Sie sicher, dass der Pin niedrig genug ist, um den Kondensator zu entladen
  3. Interrupt aktivieren und Timer zurücksetzen
  4. Machen Sie den Pin zu einem Eingang (der Kondensator wird aufgeladen)
  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 niedrig
  7. ol>
+1: Auf diese Weise können RC-Zeiten mithilfe eines digitalen Eingangs gemessen werden. Ich mag die Pints ​​besonders.
@stevenvh korrigiert. Machen Sie einen Fehler, kopieren Sie und fügen Sie ein und so wird es gemacht :-)
Joel B
2012-07-23 17:54:56 UTC
view on stackexchange narkive permalink

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.

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


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...