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
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