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:
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.
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.
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.
Russell McMahon
Majenko
AndrejaKo
Kortuk
Oldtimer