- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 3 von 3

Thema: LM35 misst bzw. ADC gibt komische Werte

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    23

    LM35 misst bzw. ADC gibt komische Werte

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    Code:
    #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.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    32
    Beiträge
    1.192
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    23
    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.

Ähnliche Themen

  1. ADC am RN-Control: komische Werte
    Von Pille456 im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 3
    Letzter Beitrag: 30.04.2011, 11:45
  2. komische L-Werte in Ultraschall Funktion für ASURO
    Von Darthmina123 im Forum Software, Algorithmen und KI
    Antworten: 2
    Letzter Beitrag: 22.10.2010, 07:45
  3. ADS830 liefert komische werte
    Von robodriver im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 05.09.2007, 18:20
  4. Bascom UART Interrupt liefert komische Werte
    Von Majus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 14.06.2007, 07:26
  5. Rn-Minicintrol komische AD Werte
    Von Rohbotiker im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 03.06.2007, 10:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad