PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NTC Temperatursensor geht "in die falsche Richtung"



Thor_
29.11.2013, 19:05
Hallo zusammen

Ich versuche momentan eine Temperaturmessung mit einem NTC zu machen. Mein Sensor ist der folgende:
Honeywell 135-104LAG-J01. Weitere Infos zum Sensor gibts hier: http://sensing.honeywell.com/index.php?ci_id=3108&la_id=1&pr_id=53807

Ich habe mir dazu folgende Tabelle erstellt: (Anhang 1). DIe sollte soweit ja eigentlich stimmen.
Hier ist nun mein Code mit dem ich das Ganze auf dem AVR (Atmega8) ausprobiere:


/*
* Test_AD.c
*
* Created: 20.10.2013 21:36:29
* Author: Marius
*/


#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

#define UART_MAXSTRLEN 10

volatile uint8_t uart_str_complete = 0; // 1 .. String komplett empfangen
volatile uint8_t uart_str_count = 0;
unsigned char uart_string[UART_MAXSTRLEN + 1] = ""; //volatile!!!

int adctbl [33] = { 1016, 1008, 994, 969, 928, 867, 783, 681, 568, 456, 355, 271, 204, 152, 114, 86, 65, 49, 38, 29, 23, 18, 14,
12, 9, 8, 6, 5, 4, 4, 3, 2, 1};

uint16_t temptbl [33] = { -60, -50,-40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180,
190, 200, 210, 220, 230, 240, 270, 300 };

void USART_Transmit(unsigned char data ){
/*
Wait for empty transmit buffer
*/
while
( !( UCSRA & (1<<UDRE)));
/*
Put data into buffer, sends the data
*/
UDR = data;
}

void USART_Init_Interrupt(unsigned int UBRR){
sei();
UBRRH = UBRR >> 8;
UBRRL = UBRR & 0xFF;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // UART RX, TX und RX Interrupt einschalten
}

uint16_t convertADCtoTemp(uint16_t adc){
int i=0;
while(!(adc <= adctbl[i] && adc >= adctbl[i+1])){
i++;
}
USART_Transmit(i);
return temptbl[i];
}

int main(void){

USART_Init_Interrupt(MYUBRR);

ADMUX=0b01000101; //int ref, Ergebnis in ADCH, Pin PC5
ADCSRA=0b10000101;

while(1){
//int sample=0;
ADCSRA = ADCSRA | (1<<ADSC); // single conversion mode ein
while(ADSC == 1); // warten bis konvertierung abgeschlosen

uint8_t theLowADC = ADCL;
uint16_t adc = ADCH<<8 | theLowADC;

USART_Transmit((ADCH));
USART_Transmit(theLowADC);
USART_Transmit(13);
_delay_ms(1000);

}


}

Die Schaltung ist wie folgt: Aus dem NTC und einem 100kOhm Widerstand ist ein Spannungsteiler aufgebaut dessen Ausgang an PC5 des ATmgea geht. Der NTC geht gegen +5V und der feste Widerstand gegen GND.

Wenn ich nun den NTC auf dem Board habe dann bekomme ich über UART einen Wert von 00000001 1111'0100 übermittelt, dies entspricht 500(dez). Laut der Tabelle die ich hochgeladen hat ergibt dies nun eine Temperatur zwischen 20 und 30 Grad Celsius. Dies stimmt soweit für mein Arbeitszimmer.
Wenn ich nun eine Feuerzeugflamme nebendrann halte (ca. 1cm vom NTC entfernt) bekomme ich: 00000011 1101'0000, dies ergibt 976(Dez) was laut Tabelle einer Temperatur zwischen -50 bis -40 Grad entspricht, das kann ja nicht sein xD

Produziere ich etwa mit der hohen Temperatur irgendwo einen Overflow?

Wäre froh wenn ihr mir helfen könntet=) (BTW: Ich bin erfahren im Programmieren mit Java, mit C noch nicht so;))

Liebe Grüsse

Thor_

seite5
29.11.2013, 19:21
Hi,
NTC heisst negativer T-Koeefizient, d.h., der Widerstand nimmt mit steigender Temperatur ab, in deiner Schaltung ist er gegen +5V gelegt, d.h.,
bei steigender Temperatur nimmt die Spannung zu, in deiner Tabelle ist's genau umgekehrt, dort sind höheren acdtbl die niedrigeren Temperaturen
zugeordnet, vielleicht geht ja die Tabelle davon aus, dass der NTC gegen Masse geschalten ist.
mfg
Achim

Thor_
29.11.2013, 19:57
Hi Achim

Vielen Dank für deine Antwort!
Heisst das, ich muss nur den NTC gegen GND schalten und den festen gegen 5V und dann ist gut?

liebe Grüse

Thor_

Hubert.G
29.11.2013, 21:17
Wie du in deiner Tabelle siehst, wird der ADC-Wert bei steigender Temperatur kleiner.
Das geht nur wenn der NTC gegen GND geschaltet ist. Dann wird bei steigender Temperatur der Widerstand geringer und damit sinkt auch die Spannung am Spannungsteiler und damit am ADC-Eingang.

Klebwax
30.11.2013, 04:15
Die Schaltung ist wie folgt: Aus dem NTC und einem 100kOhm Widerstand ...

Der Eingangswiderstand deines ADCs ist klein gegen deine Messanordnung. Der Gesamtwiderstand aus NTC und Vorwiderstand sollte kleiner als 10K sein. Genauere Angaben liefert das Datenblatt deines µCs. Du misst also im wesentlichen deinen ADC aus und nicht den NTC.

MfG Klebwax

Hubert.G
30.11.2013, 08:19
Das mit dem 100k Widerstand hatte ich übersehen. Es lässt sich aber mit einem 10n Kondensator am ADC-Eingang leicht kompensieren. Die Spannungsänderung durch den NTC ist so langsam das die Zeitkonstante keine Rolle spielt.

oberallgeier
30.11.2013, 08:50
... Der Gesamtwiderstand aus NTC und Vorwiderstand sollte kleiner als 10K sein ...Nur als Beispiel - so messe ich die (Board-) Temperatur mit NTC und mega328.

......26845

......© robotikhardware

Thor_
30.11.2013, 16:54
Hallo zusammen

Ich habe heute morgen nochmals ein bisschen daran rumgemacht und es eigentlich hinbekommen, einfach durch das Tauschen des NTC und des Widerstandes (NTC gegen Masse, nicht gegen +5V).

Ich habe erst jetzt eure weiteren Antworten gesehen (vielen Dank!)
Wenn der EIngangswiderstand zu gross ist heisst das aber ja eigentlich, dass ein 100kOhm NTC generell ungeeignet ist oder?

Ich interessiere mich vor allem für den Bereich ab 120 Grad bis 300 Grad, darunter reicht mir im Allgemeinen die Information "noch zu kalt". Da bewegen wir uns im Widerstandswert um 12kOhm (für den NTC).
Meint ihr das wäre OK? (ich würde dann den festwiderstand auch noch auswechseln gegen einen 10kOhm Widerstand, die Tabelle müsste ich nachher natürlich neu berechnen, aber das ist dank Excel ja kein Problem).

Könntet ihr bitte noch kurz ausführen, was der Kondensator (parallel?) zu dem Festwiderstand bewirkt? Bin mir da nicht im Klaren.

Liebe Grüsse

Thor_

Hubert.G
30.11.2013, 19:35
Im ADC ist ein Kondensator von etwa 14p, der muss aufgeladen werden. Wenn der Quellwiderstand zu hoch ist, verfälscht das durch den Kondensator die Messspannung.
Mit einem Kondensator parallel wird der Kleine von dem Großen geladen ohne die Messspannung wesentlich zu verändern.