Thor_
29.11.2013, 20: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_
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_