PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC am RN-Control: komische Werte



Pille456
26.04.2011, 20:52
Hio!

Da ich bisher keine Lösung für mein Problem mit dem LM75A Temperatursensor gefunden habe und ich langsam davon ausgehe, dass dieser kaputt ist, habe ich mir heute einen Analogen Temperatursensor gekauft.
Den ADC vom atmega32 angeschlossen und per rs232 mir mal ein paar Werte angesehen. Leider machen diese auch keinen Sinn!

Ich nutze Vcc = 5V vom RN-Board und habe 1kOhm Widerstand zwischen geschaltet. Der Sensor soll 450µA bis 5mA aushalten. Des Weiteren soll er bei 25°C 2.98V. (siehe alles: http://www.datasheetcatalog.org/datasheet/stmicroelectronics/2158.pdf ).
Nun wird mir auf der Konsole ausgegeben: 1111101110 = 1006 (dez)
Bei 5V und 10Bits gilt ja: 5V/1023 = 4.88mV => 1006 ~ 4.9V !
Der Wert ist natürlich deutlich zu viel...

Nutzt das RN-Control eine andere Referenzspannung oder wie kommt dieser Wert zustande?
Und an welcher Stelle sollte ich für optimale Ergebnisse den AD-Wandler zwischenschalten? Ich denke mal direkt vor dem Sensor oder?

Hier der Code den ich nutze:

void ADC_Init(void) {

uint16_t result;

// ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen
ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
ADCSRA |= (1<<ADEN); // ADC aktivieren

/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */

ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
result = ADCW;
}


uint16_t ADC_Read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
return ADCW; // ADC auslesen und zurückgeben
}
//...
int main(void){
uint16_t temp;
char s[20];
ADC_Init();
init_USART();

sendUSART("Hallo Welt!!");
while(1) {
temp = ADC_Read(0);
itoa(temp,s,2);
sendUSART(s);
sendUSART("===\n");

sleep_ms(2000);
}
}
Gruß
Pille

Hubert.G
26.04.2011, 23:05
Dazu solltest du dir die Schaltung des RN-Board ansehen.
AREF, Internal Vref turned off einstellen.

Pille456
30.04.2011, 12:07
Hio,

hat ein wenig gedauert, bis ich wieder daran arbeiten konnte, aber trotz AREF auf turned off hat es nicht funktioniert.
Ich habe mir gerade mal das Beispielrogramm zum RN-Control im Wiki angesehen und daraus folgenden BASCOM-Code entnommen:

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Config Adc = Single , Prescaler = Auto

Dim Volt As Single
Dim W As Word
Const Ref = 5 / 1023

Do
Start Adc
W = Getadc(1)
Volt = W * Ref
Volt = Volt * 5.2941
Print "Spannung: " ; Volt ; "V"
Waitms 2000
Loop


Nur hier wird über die Konsole generellt 26.xxxx Volt angezeigt! Ein doch arg hoher Wert.Komischerweise wird dieser Wert auch angezeigt, wenn ich den AD-Converter an eine einfache Lastschaltung(also 5V an einem Widerstand) anschließe.

Da scheint wohl eher ein systematisch Fehler zu sein, aber ich finde keinen >_<

Gruß
Pille

Hubert.G
30.04.2011, 12:45
Auf dem Board ist Aref auf 2,5V gelegt. Wenn die Spannung am ADC-Eingang höher als die 2,5V ist, wird immer der Maximalwert angezeigt.
So gesehen sind die 26.xxxxV nach deiner Rechnung schon relaistisch.
Wenn du 5V über einen Widerstand an den ADC-Eingang legst, sind dort trotzdem 5V. Du musst einen Spannungsteiler machen.
Ob in deinem BASCOM-Programm ein Fehler ist, kann ich nicht sagen.