Messung des ADC-Rauschens (Ablenkung) und Einführung in den ADC-Rauschunterdrückungsmodus

Messung des ADC-Rauschens (Ablenkung) und Einführung in den ADC-Rauschunterdrückungsmodus Modus

Messen wir den Betrag, der uns von Frau ADC zurückgegeben wird. Ist sie eine gute Kauffrau, oder ist sie verwirrt von all dem Lärm um sie herum? Wir können es genau herausfinden! Ermitteln Sie einfach die Differenz jeder ihrer Antworten und addieren Sie am Ende alles. Wir tun dies, um zu sehen, wie gut Herr Cap und die Brüder in dieser Familie die Währung am besten waschen und die Währung schnell genug in den Händen von Frau ADC halten, damit wir ihre zurückgegebene Zahlenwährung verwenden können. Wir brauchen diese Zahlenwährung ziemlich schnell, da wir möglicherweise einige kritische Systeme stabil halten müssen. Zum Beispiel müssen wir diese Informationen möglicherweise an einen balancierenden Roboter weitergeben, der damit beauftragt ist, feindliche Aliens abzuwehren, ohne umzufallen und seine Aufgaben zu versagen.

Lassen Sie uns wissenschaftlich mit dem ADC umgehen. Wenn wir die Spannungswährung von Herrn Schwerkraft (dem Beschleunigungssensor) so stabil wie möglich halten, können wir feststellen, wie gut Frau ADC mit ihrer Zahlenwährung reagiert. Wegen all der Geräusche um sie herum wissen wir nicht wirklich, was sie uns geben wird. Wenn sie uns also eine Antwort gibt, merken Sie sich diese Antwort, und wenn sie dann eine weitere Antwort gibt, können wir die, die wir uns gemerkt haben, und die, die wir gerade erhalten haben, voneinander abziehen. Jetzt haben wir ein Delta (die Differenz zwischen der gemerkten Antwort von Frau ADC und der neuen Antwort). Jetzt können wir die gemerkte Antwort vergessen, denn wir haben das Delta jetzt in unserer Tasche, aber wir müssen uns die neue Antwort für die nächste Antwort merken, die wir bekommen werden. Wir werden all diese Deltas, die wir gesammelt haben, behalten und sie alle aufaddieren.

Die gemerkte Antwort lautet:

static volatile uint16_t previousResult = 0;

und wird später in der Interrupt-Routine so verwendet:

previousResult = theTenBitResults;

Die Zuweisung von theTenBitResult erfolgt erst, nachdem die Stichprobe der Differenz des vorherigen und aktuellen Ergebnisses bestimmt wurde.

Das static volatile wird verwendet, damit die Variable vom Compiler (dem Mechanismus, der unseren Code in eine .hex-Datei umwandelt, die der Mikrocontroller verstehen kann) nicht „wegoptimiert“ wird. Ich habe festgestellt, dass dieses static volatile erforderlich ist, wenn die Variable in Interrupt-Routinen verwendet wird.

Der Datentyp uint16_t wird verwendet, weil das vorherige Ergebnis so hoch sein kann wie das Ergebnis, das eine 10-Bit-Zahl ist.

Die Ablenkung (Differenz zwischen der vorherigen Antwort und der aktuellen Antwort) wird in der Interrupt-Routine deklariert, weil sie lokal zur Interrupt-Routine ist. Mit anderen Worten, die Zahl wird in einer Gesamtsumme in der Variablen „totalDeflectionOverTime“ verwendet, so dass die Ablenkungsvariable außerhalb der Interrupt-Routine nicht gespeichert werden muss.

int deflection = theTenBitResults - previousResult;
if (deflection < 0 ) deflection = previousResult - theTenBitResults;
Send_An_IntegerToMrLCD(13,2,deflection, 4);
...
totalDeflectionOverTime += deflection;

Die Ablenkung wird als int deklariert, weil wir wissen müssen, ob die Subtraktion negativ oder positiv ist. Wir können uint8_t oder uint16_t nicht verwenden, weil dies immer positive Zahlen sind. Da wir am Ende immer positive Zahlen wollen, müssen wir wissen, ob die Subtraktion eine negative Zahl erzeugt, damit wir das Subtraktionsproblem umkehren können.

Die Variable totalDeflectionOverTime ist die Summe aller Differenzen, aber nur für eine festgelegte Anzahl von Stichproben, sodass wir Äpfel mit Äpfeln mit anderen Komponenten wie Herrn Cap und seinen Bruderkappen (verschiedene Kondensatorwerte) vergleichen und sehen können, wie gut sie unsere Spannungswährung reinigen können.

Wir mussten einen Praktikanten einstellen, der mit einem Clicker (einem Zähler) neben Frau ADC steht, um zu zählen, wie viele Stichproben wir erhalten, damit der Praktikant uns informieren kann, wann wir unsere Summe anzeigen und die Variable totalDeflectionOverTime auf Null setzen sollen, damit wir von vorne beginnen können.

Wenn all dies in einem prägnanten Programm zusammengefasst würde, könnte es so aussehen:

#include
#include
#include "MrLCD.h"
static volatile uint16_t previousResult = 0;
static volatile int totalDeflectionOverTime = 0;
static volatile uint16_t sampleCount = 0; int main(void)
{
InitializeMrLCD();
Send_A_StringToMrLCDWithLocation(1,1,"ADC Result:");
Send_A_StringToMrLCDWithLocation(1,2,"Deflection:");
Send_A_StringToMrLCDWithLocation(1,3,"Total:");

ADCSRA |= 1< ADMUX |= (1< ADCSRA |= 1< ADCSRA |= 1<
sei();

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

int deflection = theTenBitResults - previousResult;
if (deflection < 0 ) deflection = previousResult - theTenBitResults;
Send_An_IntegerToMrLCD(13,2,deflection, 4);
previousResult = theTenBitResults;
totalDeflectionOverTime += deflection;

sampleCount++;

if (sampleCount >= 300)
{
Send_An_IntegerToMrLCD(8,3,totalDeflectionOverTime, 6);
totalDeflectionOverTime = 0;
sampleCount = 0;
}

ADCSRA |= 1<
}
Zurück zum Blog

Hinterlasse einen Kommentar

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