PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LM35 misst bzw. ADC gibt komische Werte



bmtil
29.09.2011, 06:13
Guten Morgen.
Ich hab an meinem µC AtMega16 einen LM35 angebracht. Alles drum und dran, UART, ADC funtkionieren, kleines LabView Prog dazu geschrieben, alles super. Nun habe ich an der Stelle des alten LM35 einen neuen angebracht, allerdings in mit 4 Meter Kabel (der soll in 4 meter Entfernung in einer Klimakammer haengen) und nun spuckt mir die Software komische Werte raus. Die Innentemperatur "schwankt" plötzlich zwischen 17 und 35 °C, dabei bin ich doch noch recht jung. Und früh am Morgen draußen mess ich Werte bis zu 32 °C!
Denke ich mir also dass der Sensor ne Macke hat und vermesse den. Der funktioniert. Der Multimeter zwischen Signalausgang und GND zeigt mir auch vernuenftige Werte an, also irgendwas immer um die 220mV wenn es um die Raumtemperatur geht.
Es muss also an der Software liegen, wobei das natuerlich auch recht unmoeglich ist, da mit dem alten LM35 es ja super funktioniert hat.
daher bin ich gerade etwas ratlos.
Hier der Code nochmal:


#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include "uart_komplett.h"
#include "timer1.h"

//Dinge definieren
#define LED_DDR DDRC //definieren der LED DDR
#define LED_PORT PORTC //defintion des genauen ports für die DDR
#define LED_PORTPIN1 PC1 //definition der roten LED
#define LED_PORTPIN0 PC0 //definition des gruenen LED

//Variablen definieren

uint16_t adc_wert = 0; //halt die noetige variable festlegt
volatile uint8_t overflowzahl = 0; //zaehlt die overflows

//Funktionen definieren
void adc_init()
{
uint16_t result; //ergebnis variable festlegen, uint16 wegen 10 bit ergebnis

ADMUX = (1<<REFS1)|(1<<REFS0); //die interne Referenzspannung nehmen
ADCSRA = (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Frequenzvorteiler bei 128, ergibt eine WandelFrequenz von 57,6kHz
ADCSRA |= (1<<ADEN); //ADEN "enabled" ADC
ADCSRA |=(1<<ADSC); //analog zu digital wandlung aktivieren


while (ADCSRA & (1<<ADSC)) // eine "sinnlos" Wandlung durchfuehren um den eventuellen Mist
{ // aus dem Wandler rauszuschmeissen

}
result = ADCL; // das ergebnis der wandlung steht in ADCL und ADCH (sind die Result Register)
result |= (ADCH<<8); //dabei wird immer von ADCL nach ADCH gelesen/
//muss einmal gelesen werden, sonst wird das ergebnis der naechsten wandlung nicht gelesen
}

//Einzelne ADC Messung und "Lesung" des Wertes

uint16_t adc_read (uint8_t channel)
{
uint16_t result;

ADMUX = ((ADMUX & 0b11000000) | (channel & 0b00111111)); //kanal waehlen

ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) )
{
}
result = ADCL; // das ergebnis der wandlung steht in ADCL und ADCH (sind die Result Register)
result |= (ADCH<<8);
return result;
} //geb mir das ergebnis, ADCW is das selbe wie result = ADCL

void main(void)
{

LED_DDR |= (1<<LED_PORTPIN1)|(1<<LED_PORTPIN0); //PC1 und PC0 Pins als ausgang festlegen und einschalten


LED_PORT = 0x01; //rote LED an

DDRA=0;


uint16_t adc_wert;
char buffer[20];

usart_init();
timer1_init();
adc_init();

sei(); //interrupts aktivieren, zum overflows zaehlen, damit die adc werte alle 2 sekunden kommen
adc_wert = adc_read(0);

while(1)
{

if (overflowzahl >= 1)
{
adc_wert = adc_read(0);

itoa(adc_wert, buffer, 10);
uart_puts("");
uart_puts(buffer); //puts fuer den string
USART_Transmit(0x0A);
overflowzahl=0;

}


}
}


Grueße und vielen Dank schonmal.

BMS
29.09.2011, 08:09
Hallo,
ich würde eher darauf tippen, dass du dir über das lange Kabel Störungen von z.B. dem Wechselstromnetz (50Hz) einfängst.
Das Kabel sollte zumindest verdrillt sein, eventuell sogar abgeschirmt. Kannst du mal die Spannung des Sensors am Mikrocontroller
mit einem Oszi messen? Dein Multimeter ist wahrscheinlich zu träge, um evtl. vorhandene Störungen anzeigen zu können.
Dann hilft wahrscheinlich ein Kondensator zwischen dem Analogeingang und Masse (z.B. 100nF), um die Störungen wegzukriegen.
Grüße,
Bernhard

bmtil
29.09.2011, 11:40
Danke fuer die Tips, das Problem war vkiel banaler. Hab beim Loeten den Sensor geschrottet. Da aus Versehen die Masse an V+ dran, der Multimeter ist halt nur intrelligfent genug den Fehler rauszurechnen.
das ganze ist mir jetzt schon 3 mal passiert. Glaub der Betreuer toetet mich jetzt. -.- Heute ist nicht mein Tag.
Das Kabel ist natuerlich geschirmt.