Messungenauigkeit bei AD-Wandler
Hallo
ich habe ein kleines Problem mit dem AD- Wandler meines Atmega32. Ich verwende die interne Referenzspannung dem Atmega (2,56V). Nun habe ich an den PortA.0 mein Netzgerät bzw. auch Batterien angehängt. Masse des Netzgerätes bzw. Masse des Akkus hab ich auch mit Masse meines Experimentierboards verbunden. Mein Problem ist nun, dass bei etwas höheren Spannungen die Messungenauigkeit sehr hoch ist. Ich hänge beispielsweise 1,4V an, und bekomme 1150 angezeigt (entspricht 1,150V, das Komma fehlt noch). Das wäre eine Abweichung von ca. 0,3V. Ich finde, dass das etwas viel ist, zumal ich die interne Referenzspannung von 2,56V benutze, die doch relativ genau ist, oder? Bei Spannungen bis so ca. 0,4V sind die Werte noch akzeptabel bzw. genau. An was könnte das liegen?
Ich benutze einen Teilungsfaktor von 128 und messe die Spannung 64mal und teile sie dann wieder durch 64. Um die Spannung zu bekommen, multipliziere ich den gelesenen Wert mit 2,56 und teile mit 1024. Danach übergebe ich den Wert dieser Funktion:
void lcd_putsint(uint16_t zahl)
{
char puffer[6];
itoa(zahl, puffer, 10);
lcd_puts(puffer);
}
Der int Wert wird in ein char Array geschrieben und auf dem Display ausgegeben. Um ständig einen Wert zu bekommen habe ich das ganze in eine while(1) Schleife gesteckt:
int main(void)
{
lcd_init(LCD_DISP_ON);
uint16_t result;
while(1)
{
result = readADC(0)*2,56/1024;
lcd_putsint(result);
sleep(1000);
lcd_clrscr(); //löscht das Display
}
return 0;
}
Was könnte daran falsch sein?
Gruß micro5
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
also ich habe dann mal eine Testkurve gemacht. Ich hoffe, dass ich das richtig verstanden habe. Also ich habe am Netzgerät eine Spannung eingestellt und sie parallel mit dem Mikrocontroller messen lassen und mit dem Multimeter gemessen. Dabei kam dann folgendes heraus:
Ich nehme an mit der ADC Spamplefrequenz meinst du das hier:
http://www.mikrocontroller.net/artic...llertyp_setzen
Bei mir wäre
TFmin= 36,86 und
Tfmax= 147,44
Bei mir ist aktuell 64 eingestellt (die 128, die ich am Anfang erwähnt habe, habe ich geändet).
Man kann deutlich erkennen, dass bei höheren Spannungen die Kurven immer weiter auseinander triften.
Ich habe auch anstatt die 2,56V als interne Referenzspannung mal 2,3 eingestellt, leider hat auch das nicht allzuviel Änderung mit sich gebracht.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
hier wäre auch noch ein Diagramm mit den Differenzen.
Re: Messungenauigkeit bei AD-Wandler
Zitat:
Zitat von Micro5
result = readADC(0)*2,56/1024;
Was könnte daran falsch sein?
Hallo Micro5,
ich glaube, Du hast hier ein klassisches C-Problem. Dein Compiler rechnet in unsigned int mit 16 bit. 2,56 ist in uint16 nunmal 2 und nicht 2,56. Daraus ergibt sich ein Rechenfehler von 28%. D.h. Dein Ergebnis liegt grundsätzlich 28% niedriger als das erwartetet Ergebnis. Das wären dann bei 1,4V etwa 0,392V Fehler und ergibt eine Spannung von 1,008 V.
Es gibt drei Möglichkeiten:
1. verwende Float zum berechnen, was allerdings ein Speicheroverkill ist, oder
2. Berechne im integer Wertebereich
result = readADC(0) / 4;
3. berechen im 32 bit Wertebereich
result = (unsigned int) ((unsigned long)readADC(0) * 256/102400);
Grüsse,
Schimmi
Re: Messungenauigkeit bei AD-Wandler
Zitat:
Zitat von jschilli
2. Berechne im integer Wertebereich
result = readADC(0) / 4;
Sorry, aber ich muss mich korrigieren:
result = readADC(0)/400;
sollte es korrekt heissen... Denn 2,56/1024 = 1/400.
Grüsse,
Schimmi