Abtastt der Arduino (ATMEGA328P) ADC wirklich nur periodisch?

Ich habe mit dem ADC des Arduino experimentiert und ein bizarres Verhalten festgestellt. Ich frage mich, ob es normal ist oder ob dies etwas Spezifisches (und Schlechtes) an dem Atmel ATMEGA328P ist, auf dem der Uno basiert.

Grundsätzlich scheint es, dass der Eingangswert am ADC mit einer niedrigeren Rate abgetastet wird, als der ADC tatsächlich Werte zurückgibt für:

Geben Sie hier die Bildbeschreibung ein

In diesem Bild sehen Sie den gesampelten Eingang, der mit voller Geschwindigkeit läuft und mit einem einfachen Poti verbunden ist. Wenn das Poti von voll auf Minimum gefegt wird, fällt die Eingangsspannung ab. Wie Sie sehen können, kommen die vom ADC zurückgegebenen Werte in Schritten, wobei es den gleichen (oder ähnlichen) Wert für mehrere Aufrufe von zurückgibt analogRead(), bevor es dann stark abfällt.

Was ist hier eigentlich los? Läuft der ADC-Eingang mit einer anderen Geschwindigkeit als der Datenausgang? Liest der Arduino-Code den ADC falsch?

Ich habe versucht, mit dem ADC-Prescaler zu spielen, und egal, was ich einstelle (außer 1:2 oder 1:4, wo es vollständig stirbt), es liest sich in Schritten wie diesem.

Bearbeiten

Es dauert ungefähr 32 aufeinanderfolgende ADC-Lesungen, bis die Schritte vollständig verschwinden.

Siehe auch verwandte, aber nicht identische SE-Abfrage hier
Antwort: Nein, tut es nicht. Es ist (wie üblich) mein Code. Aber hey – es war spät und ich war müde – im kalten Morgenlicht wusste ich sofort, was das Problem war.
@Majenko Vergiss nicht, deinen Kommentar als Antwort zu posten, wenn du kannst, und akzeptiere ihn!
@Majenko, schreiben Sie eine Antwort, in der Sie den Fehler erklären, damit andere das Problem und die Lösung finden können.
Adcs brauchen im Allgemeinen Zeit, um sich zu beruhigen und zu erfassen, dies ist keine sofortige Sache. müssen verstehen, welche Methode sie verwenden, um die Konvertierung durchzuführen. Und wie kommst du zurück auf analog? Was wäre, wenn Sie einfach eine Reihe von Samples im Speicher speichern, sie später ausgeben und grafisch darstellen, den DAC-Leistungstreffer sowie den Code-Hit eliminieren.

Antworten (3)

DAC-Fehler? : Sie sagen, dass die Scope-Spur die ADC-Eingangswerte des Arduino anzeigt , ABER Sie zeigen anscheinend ein analoges Signal an. Ich gehe davon aus, dass eine Art DAC dabei ist, um die ADC-Messwerte wieder in analoge umzuwandeln.
Die Kurve sieht aus wie ein DAC mit einem massiven Fehler in einem mittleren Bit. zB kann das Adressbit A2 des DAC einen Widerstandswert haben, der sagen wir 10 mal zu klein ist.

Test: Drehen Sie den Topf SEHR langsam, verschwinden die groben Schritte?
dh erhalten Sie einen sanft absteigenden Pegel.
Wenn der Pegel bei einer beliebigen Sweep-Geschwindigkeit so abfällt, liegt wahrscheinlich ein bitbasierter Fehler nach dem ADC vor.
Oder nur möglicherweise ein Mikrocontroller mit einem Bitfehler in der DAC-Hardware des IC (weniger wahrscheinlich).


ADC-Geschwindigkeit: Wenn das oben Genannte fehlschlägt -

Das allgemeine Webgefühl ist, dass Sie es besser machen können als das, was Sie sehen.
Wenn dieser Pot-Sweep beispielsweise 0,1 Sekunden dauert, beträgt Ihre Bruttoschrittrate etwa 10 ms.
JEDOCH - es scheint kleine abfallende Schritte auf Ihrer Wellenform zu geben - vielleicht 10 pro Bruttoschritt, für einen Minischritt von beispielsweise 1 ms.
Selbst das ist länger, als Sie vernünftigerweise erwarten würden.

Diese Diskussion schlägt 10 f kHz vor. - 77 kHz wird erwähnt.

Arduino-basierter Bereich gibt eine Vorstellung von der erwarteten Geschwindigkeit.

Energiemonitor mit wieder ADC, eine Anleitung.

Nützlich

Ich habe mein Problem verschlafen und glaube, ich habe die Antwort gefunden. Das Problem liegt bei meiner Software, nicht beim ADC. Das Bild wird vom Arduino gezeichnet und blockiert und wartet darauf, dass das Videogerät den Rahmen zeichnet. Daran hätte ich gestern Abend denken sollen, da ich das Videogerät entworfen habe. Es war zwar spät...

Der Grund für die Unfähigkeit, den ADC reibungslos zu lesen, liegt an meiner Anzeige.

Es ist drei Jahre her, seit ich diese Frage gestellt habe (wie die Zeit vergeht), und ich habe sie erst kürzlich wiederentdeckt, nachdem jemand sie positiv bewertet hatte, also muss ich versuchen, mich jetzt an alles zu erinnern ...

Grundsätzlich habe ich den ADC regelmäßig gelesen, aber die Displayausgabe erfolgte entweder über PAL oder VGA (ich weiß jetzt nicht mehr, was) an einen TFT-Bildschirm. Da es zu dieser Zeit spät in der Nacht war, habe ich natürlich vergessen, dass das Zeichnen eines Rahmens, wenn das Display Zeit braucht, und dass während dieser Zeit der ADC nicht abgetastet werden kann - daher die Schritte.

Lektion gelernt: Über einem Problem zu schlafen, macht die Antwort offensichtlich.

Es gibt einen ADC und 6 Eingänge, er tastet jeden Eingang dreimal ab (glaube ich) und wechselt dann zum nächsten Eingang und so weiter.

Können Sie ein bisschen mehr Informationen darüber hinzufügen, wie dies das Problem ist, mit ein bisschen mehr Erklärung für diejenigen, die Ihre Antwort möglicherweise nicht automatisch verstehen?