Hallo,

ich versuche gerade mit meinem Atmega8 auf meinem Pollin-Board eine Spannung über den ADC zu erfassen. Ziel ist es, dann einen Temperatursensor anzuschließen und die Temperatur zu messen, leider scheitere ich schon an einer einfachen Spannungsmessung. Von der Schaltung her hab ich zwei 1,5K Widerständer in Reihe geschaltet, die an einer externen 5V Spannung anliegen, dazwischen greif ich am ADC0 die Spannung ab, die ja 2,5V betragen müsste. Wenn ich das ganze jetzt laufen lasse und mir die ADC-Werte ausgeben lasse, schwanken die ganz schön:

Code:
6.000e+02 6.000e+02 5.000e+02 5.000e+02 5.000e+02 5.000e+02 5.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 5.000e+02 5.000e+02 5.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 4.000e+02 5.000e+02 5.000e+02 5.000e+02 1.000e+03 7.000e+02 1.000e+03 6.000e+02 1.000e+03 6.000e+02 1.000e+03 6.000e+02 1.000e+03 7.000e+02 1.000e+03
Mein Quellcode für die ADC-Abfrage sieht wie folgt aus:

Code:
uint16_t readADC(uint8_t mux)
{
	uint16_t result;
	uint8_t i;

	ADMUX=mux;
	ADMUX|=(1<<REFS0);//|(1<<REFS1);

	ADCSRA|=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);	//(ADSC<<1)|(ADATE<<1)|
	ADCSRA|=(1<<ADSC);
	while(ADCSRA & (1<<ADSC));
	result=ADCW;
	result=0;

	for(i=0;i<4;i++)
	{
		ADCSRA|=(1<<ADSC);
		while(ADCSRA & (1<<ADSC));
		result+=ADCW;
	}

	ADCSRA&=~(1<<ADEN);
	result/=4;
	return result;


}

double getTemp(uint8_t channel)
{
	uint16_t adc;
	double U=0, step=0,T=0;

	adc=readADC(channel);
	step=(((double)5.00)/((double)1024.00));	
	U=((double)step)*((double)adc);
	//T=(((double)118.321)*((double)U))-((double)215.583);

	return (double)(adc);
}
Da das mein erster Versuch mit dem ADC ist, bin ich mir auch nicht ganz sicher, ob ich das so richtig mache bzw. weiß ich nicht, warum die ADC-Werte so schwanken.
Ich lasse mir das ganze dann über RS232 ausgeben:

Code:
int main()
{
double temp;
char buf[20];

uart_init();

	while(1)
	{
		temp=(double)getTemp(0);		
		send(dtostre((double)temp,buf,3,0));
		send(" ");
		buf[0]='\0';
		wait_sec(1);
	}
}
Wenn das dann funktioniert möchte ich den einen widerstand an der Masse mit einem KTY 81-120 ersetzen, um dann die Temperatur zu ermitteln, hab ich mir mit ein paar Messadaten aus dem Datenblatt eine lineare Funktion ermitteln lassen, in die ich dann bloß noch die gemessene Spannung einzusetzen brauche und die Temperatur erhalte. Leider weiß ich nicht, ob es da evtl. eine bessere Möglichkeit gibt, da diese Variante ziemlich viel Speicher verschlingt...

Gruß
cesupa