Ergebnis: Varianz verstehen bei ADC-Wandlungen
Teilen
Bei der Durchführung von Konvertierungen mit dem ADC (Analog-Digital-Wandler) kann das Ergebnis von Konvertierung zu Konvertierung variieren. Dies gibt Ihnen eine Methode zur Berechnung dieser Abweichung über die Zeit und einige mögliche Techniken zur Minimierung dieser Abweichung, wie z. B. die Verwendung von Kondensatoren oder die Verwendung des ADC-Schlafmodus. Mit dem LCD werden die ADC-Werte zur Überprüfung der ADC-Konvertierung und zur Erfassung der Abweichung über viele Samples angezeigt. Um das vorherige Ergebnis mit dem aktuellen Ergebnis vergleichen zu können, muss das vorherige Ergebnis gespeichert werden. Sobald das aktuelle Ergebnis erfasst ist, wird eine andere Variable um den Absolutwert der Differenz zwischen dem Ergebnis und dem vorherigen Ergebnis erhöht. Zuerst werden einige globale Variablen benötigt, um das vorherige Ergebnis, die gesamte Abweichung über die Zeit und die Sample-Anzahl zu speichern (sie beginnen statisch volatil, da der Compiler sie optimieren würde, wenn diese Schlüsselwörter nicht vorhanden wären):
static volatile uint16_t previousResult = 0; static volatile int totalDeflectionOverTime = 0; static volatile uint16_t sampleCount = 0; The Calculations are happening in the ISR (Interrupt Service Routine): 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<