Die vollen 10 Bit aus dem ADC (Analog-Digital-Wandler) herausholen

Die vollen 10 Bit vom ADC (Analog-Digital-Wandler) erhalten

Hier erhöhen wir den Einsatz mit Frau ADC. Haben Sie den Glauben? Denken Sie, sie wird so viel Geld verkraften können?!? Sie ist ohnehin schon ziemlich gestresst! Sie ist geräuschempfindlich, unehrlich und macht ständig Fehler. Mal sehen, wie sie sich schlägt.

Eigentlich war sie im 256-Währungsumtauschmodus gar nicht so schlecht. Aber damit ist Schluss. Der 10-Bit-1024-Umtauschmodus ist für Frau ADC etwas problematischer. Sie wird richtig nervös bei so viel Währung! Lärm aus Breadboardville, Herr Pot und König Core machen sie verrückt. Um sie herum ist Kakophonie.

Diesmal ist Herr Cap wirklich notwendig! Fat Cap würde gute Arbeit leisten, aber Herr Fat Cap ist dem Chaos in Breadboardville nicht gewachsen. Breadboardville ist eine Stadt mit Windböen, die Regen-Spannungswährung wegspülen können. Wenn Wellen dieser ungezähmten Währung in der Luft sind, wird Breadboardville sie sicher aufnehmen. Im nächsten Kapitel erfahren Sie, ob Herr Cap seine Spannungswährung gut genug waschen kann, um diese Turbulenzen zu überwinden! Wir werden auch Herrn Gravity treffen! Den angeheiterten Gesellen die Metallstraße hinunter.

Wie erfassen wir also die 10-Bit-Zahlenwährungen? Wir müssen uns nur ein weiteres Register ansehen. Für die 8-Bit-Zahl sahen wir uns das ADCH (Analog-Digital-Wandlungsergebnis Hoch) an, und wenn ADLAR in ADMUX gesetzt ist, dann ist das ADCL linksbündig und das ADCL enthält eine Zahl zwischen 0-256. Wenn wir das ADCL (Analog-Digital-Wandlungsergebnis Niedrig) einbeziehen, können wir die beiden zusätzlichen Bits erfassen, die in der 10-Bit-Zahl existieren.

Indem wir das ADCH nur zum Empfang von 0-255 verwenden, überspringen wir im Wesentlichen jede 4. Zahl im eigentlichen ADC. Durch die Einbeziehung des ADCL sind wir in der Lage, die zusätzlichen 4 Zahlen zwischen den einzelnen ADCH-Zahlen zu erfassen.

Bitte überlesen Sie die folgenden Informationen nicht!!! Wenn Sie Schiebeoperationen (>> oder <<) nicht verstehen, wird Ihnen dies wirklich helfen. Lesen Sie es sorgfältig!

Zuerst verwenden wir eine 16-Bit-Variable, um die 10-Bit-Zahl zu speichern (im Programm nenne ich sie "theTenBitResults"):

Also, theTenbitResults beginnt so:

Bit15 Bit14 Bit13 Bit12 Bit11 Bit10 Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Mit ADLAR = 1:

ADCL beginnt mit diesen Bits (denken Sie daran, 2 Bits haben 4 Möglichkeiten: 0, 1, 2 und 3):

Bit1 Bit0 ---- ---- ---- ---- ---- ----

Zwei der insgesamt 10 Bits.

Und ADCH beginnt mit diesen Bits (denken Sie daran, 8 Bits haben 256 Möglichkeiten):

Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2

Die restlichen 8 der insgesamt 10 Bits.

Wenn wir ADCL um 6 Stellen nach rechts verschieben, indem wir ADCL >> 6 verwenden, erhalten wir:

---- ---- ---- ---- ---- ---- Bit1 Bit0

Wenn wir theTenBitResult |= ADCL >> 6; festlegen, würde theTenbitResults so aussehen:

---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- Bit1 Bit0

Das ADCL wird um 6 Stellen nach rechts verschoben (ganz nach rechts).

Jetzt müssen wir nur noch das ADCH in die Variable "theTenbitResults" bringen. Wir müssen nur Platz für die zwei Bits des ADCL schaffen, indem wir ADCH zwei Stellen nach links verschieben und das ADCL immer noch anwenden. Wir erhalten: theTenBitResult |= ADCH << 2 | ADCL >> 6

---- ---- ---- ---- ---- ---- Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

Und dann ist die Sache erledigt, wenn Sie linksbündige Sachen mögen. Mal sehen, wie man es rechtsbündig macht.

Machen Sie sich keine Sorgen um die 6 ungenutzten Stellen in der 16-Bit-Zahl. Wir haben wirklich keine anderen Optionen.

Mit ADLAR = 0:

ADCL beginnt mit diesen Bits:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

Acht der insgesamt 10 Bits (die 8 niedrigen Bits).

Und ADCH beginnt mit diesen Bits:

---- ---- ---- ---- ---- ---- Bit9 Bit8

Die restlichen 2 der insgesamt 10 Bits (die zwei hohen Bits).

Wenn wir ADCH um 8 Stellen nach links verschieben, indem wir ADCH << 8 verwenden, erhalten wir:

Bit9 Bit8 ---- ---- ---- ---- ---- ---- ---- ----

Wenn wir theTenBitResult |= ADCH << 8; festlegen, würde theTenbitResults so aussehen:

---- ---- ---- ---- ---- ---- Bit9 Bit8 ---- ---- ---- ---- ---- ---- ---- ----

Das ADCH wird um 8 Stellen nach links verschoben, um Platz für die unteren 8 Bits zu schaffen.

Alles, was wir jetzt tun müssen, ist, das ADCL in die Variable zu legen, da die unteren 8 Bits natürlich an den richtigen Stellen gesetzt würden: theTenBitResult |= ADCH << 8 | ADCL

---- ---- ---- ---- ---- ---- Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

Und das war's!

Mal sehen, wie dieses Programm aussehen könnte (ich habe den letzteren der beiden Ansätze mit ADLAR = 0 gewählt):

#include <avr/io.h>
#include <avr/interrupt.h>
#include "MrLCD.h"
int main(void)
{
InitializeMrLCD();
Send_A_StringToMrLCDWithLocation(1,1,"ADC Result:");
ADCSRA |= 1<<ADPS2;
ADMUX |= (1<<REFS0) | (1<<REFS1);
ADCSRA |= 1<<ADIE;
ADCSRA |= 1<<ADEN;

sei();

ADCSRA |= 1<<ADSC;

while (1)
{
}
}
ISR(ADC_vect)
{
uint8_t theLowADC = ADCL;
uint16_t theTenBitResults = ADCH<<8 | theLowADC;
Send_An_IntegerToMrLCD(13,1,theTenBitResults, 4);

ADCSRA |= 1<<ADSC;
}
Zurück zum Blog

Hinterlasse einen Kommentar

Bitte beachte, dass Kommentare vor der Veröffentlichung freigegeben werden müssen.