Schritt 8: Wie funktioniert der ADC
Sukzessive Approximation ADC bedeutet, dass der ADC 13 Taktzyklen, die zur Konvertierung (und 25 Taktzyklen für die erste Konvertierung). Es ist ein Taktsignal gewidmet der ADC, der "" von der Hauptuhr des Arduino berechnet wird; und zwar deshalb, weil der ADC ein wenig langsam ist und nicht kann mit dem Tempo der anderen Teile des Mikrocontrollers mithalten. Es erfordert eine Eingabe Taktfrequenz zwischen 50 kHz und 200 kHz, maximalen Auflösung zu bekommen. Wenn eine niedrigere Auflösung als 10 Bits benötigt wird, kann die Eingabe Taktfrequenz auf der ADC 200 kHz zu einer höheren Abtastrate übersteigen.
Aber wie viel höhere Raten können wir nutzen? Es gibt ein paar gute Führer über den ADC bei der Open Music Labs, die ich schlage vor zu lesen:
- http://www.openmusiclabs.com/learning/Digital/ATmega-ADC/
- http://www.openmusiclabs.com/learning/Digital/ATmega-ADC/in-Depth/
Da mein Ziel ist es, ein schnelles Oszilloskop zu bekommen habe ich beschlossen, die Präzision auf 8-Bit zu begrenzen. Dies hat mehrere Boni:
- der Datenpuffer kann mehr Daten speichern;
- Sie verschwenden keine 6-Bit RAM pro Datum;
- der ADC kann schneller erwerben.
Die Vorteiler lässt uns die Frequenz durch einige Faktoren, dividieren Sie durch setzen der ADPS0-1-2 Bits des Registers ADCSRA. Die Handlung der Präzision aus dem offenen Musik-Labs-Artikel zu sehen, sehen wir, dass die Frequenz für 8-Bit-Präzision bis zu 1,5 MHz gut gehen könnte! Aber da die Möglichkeit der Änderung des prescaler-Faktors uns die Erfassungsrate ändern lässt, können wir es auch verwenden, um die Zeitskala das Oszilloskop ändern.
Es ist eine gute Eigenschaft über die Ausgabe-Register: Wir können entscheiden, die Anpassung der Konvertierung Bit, durch Festlegen der ADLAR bit in das ADMUX-Register. Wenn es ist rechts 0 sind sie angepasst und umgekehrt (siehe Bild). Da ich 8-Bit Präzision wollte ich es auf 1 gesetzt so konnte ich nur das ADCH Register lesen und die ADCL ignorieren.
Ich wollte nur ein Eingangskanal um Kanal hin und her wechseln bei jeder Konvertierung zu vermeiden haben.
Eine letzte Sache über den ADC, hat es verschiedene laufende Modi jeweils mit einer anderen Trigger-Quelle:
- Free Running-Modus
- Analogen Komparator
- Externen Interrupt-Anforderung 0
- Timer/Counter0 Compare Match A
- Timer/Counter0 Überlauf
- Timer/Counter1 vergleichen Spiel B
- Timer/Counter1 Überlauf
- Timer/Counter1 Capture Event
Ich war interessiert an der frei laufenden Modus einen Modus in dem ADC kontinuierlich wandelt die Eingabe und wirft einen Interrupt am Ende jeder Conversion (zugehörigen Vektor: ADC_vect).