QuelleDatenblatt LTC2400 schrieb:Variation in the self-heating of the RTD element due to air currents is the most difficult challenge. If the RTD is mounted in a sealed glass enclosure and painted black, the LTC2400 can detect the arrival of a person in the room. This is also true of infrared thermocouple sensors (thermopiles) that can also be used directly with the LTC2400.
Wie würdest du denn eine Temperatur messen ? KTY ?! Digital ?!
Hi,
ich würde ne Temperatur (wenn es irgendwie geht) mit nem DS18S20 messen.
Analog (also zB KTY) würde ich nur messen wenn die zu messende Temperatur außerhalb des "Überlebensbereiches" eines DS18S20 wäre. Dann kann nen KTY aber auch nix mehr ausrichten. Dann benötigt man nen PT100/PT1000/Ni1000 oder nen Thermoelement.
Gruß
Dino
Also das must Du mir mal vormachen, wie man die Temperatur innerhalb von Sekundenbruchteilen um 140°C hebt und sie anschließend wieder auf genau den selben Wert senkt.Hmm... wenn der Sensor bei -40°C im Eisfach liegt (gültiger Wert), Du den jetzt kochst, und gerade bei 100°C das nächste Sample-Fenster ist (gültiger Wert). Du legst den wieder zurück ins Eisfach, er hat beim nächsten sample wieder -40°C, und bleibt da stabil...
Da der Wert aber ungültig bleibt (vorletzter angezeigter Wert), wirst Du auf Deiner 100°C-Anzeige sitzenbleiben.
#55: 0,75sNaja, war jetzt vielleicht etwas überspitzt dargestellt... andererseits sind Deine Bruchteile ja auch 6 Sekunden lang...
Das wäre sicher interessant. Dann erzähl uns aber auch in welchen Größenordungen da gearbeitet wird und wie man da noch Temperaturen mißt.Hmm... soll ich mal recherchieren was für Rampen mein Bruder mit dem Nanokalorimeter so fährt, bei 'ner Messung?
uint16_t summe, ergebnis;
uint8_t TempH, TempL;
uint8_t i;
summe = 0;
for (i=0; i<16; i++)
{
[COLOR=#000080]// hier die Messung machen[/COLOR]
summe += ((uint16_t)TempH<<1) | (TempL>>7);
}
ergebnis = summe>>4;
// 9 Bits: TempH Bits 8..1 und TempL Bit 0
Hallo zusammen,
ich habe leider nicht so viel Zeit alles durchzulesen, das Thema ist ja inzwischen schon riesen groß. Wenn es aber einfach nur um den Mittelwert geht, ist das doch recht einfach zu lösen.
Nach #64 von LotadaC, könnte es in C so aussehen:
Code:uint16_t summe, ergebnis; uint8_t TempH, TempL; uint8_t i; summe = 0; for (i=0; i<16; i++) { [COLOR=#000080]// hier die Messung machen[/COLOR] [COLOR=#ff0000][B] summe += ((uint16_t)TempH<<1) | (TempL>>7);[/B][/COLOR] } ergebnis = summe>>4; // 9 Bits: TempH Bits 8..1 und TempL Bit 0
Ich nehme hier an, dass in TempH MSB ist und in TempL Bit7 für das niederwertigste Bit genutzt wird (ich hoffe ich habe es richtig verstanden).
Im Ergebnis befinden sich die gesamten 9 bit.
Es wurde irgendwo schon erwähnt, dass es günstiger ist 2^n Werte zu summieren, dann ist nämlich die Division einfach durch rechts schieben der Summe zu erledigen. Im oberen Beispiel summiere ich 16 Werte und schiebe 4 Bit nach rechts, teile also dadurch durch 16.
Wenn die Messung zu lange dauert, könnte man auch mit einem FiFo arbeiten, das hatte ja LotadaC auch schon vorgeschlagen.
Vielleicht hilft der obige Code ja schon etwas weiter.
Dirk
ISR (TIMER0_COMPA_vect)
{
Summe = 0;
for (I = 0 ; I < 16 ; I++)
{
i2c_start(DS1621_Read);
TempH = i2c_readAck();
TempL = i2c_readNak();
i2c_stop();
Summe += ((uint16_t)TempH << 1 | (TempL >> 7));
}
Ergebniss = Summe >> 4;
Temp = Ergebniss;
if (Temp < 0)
{
IsNegative = 1;
TempAbs = ~(Temp) + 1;
}
else
{
IsNegative = 0;
TempAbs = Temp;
}
if ((TempL & 0b10000000) == (0b10000000))
{
TempAbs = TempAbs + 1;
}
Wert = ((((TempAbs / 10) % 10) << 8) | ((TempAbs % 10) << 4) | (0x0A)); // Wert entspricht dem "Wert" aus dem Array (Zahlen)
if (TempAbs == 0)
{
Wert = 0xCC0A;
}
else if (TempAbs >= 100)
{
Wert = (Wert | 0x1000);
}
else if (TempAbs < 10)
{
Wert = (Wert | 0xCC00);
}
else if (TempAbs < 100)
{
Wert = (Wert | 0xC000);
}
if (IsNegative == 1)
{
Wert = (Wert & 0x0FFF) | (0xB000);
}
}
Dirk, Wieso wird da noch mal der Typ mit angegeben ?! Was bezweckt das ?
Ich denke hier hat vor allem LotadaC viel gehofen und Zeit investiert.Dirk, du bist echt der beste! Das du dir dafür immer Zeit nimmst und den "ahnunglosen" hilfst! Finde ich echt klasse.
Aber auch alle anderen vielen lieben dank für die große Hilfe
Es werden 16 Werte vom Sensor gelesen. Sowas würde ich nicht in einer TimerISR machen, ich würde es lieber ins Hauptprogramm setzen.Aber jedes mal wenn ich die ISR aufrufe, wird der Wert doch aktualisiert oder ?
Es werden 16 Werte vom Sensor gelesen. Sowas würde ich nicht in einer TimerISR machen, ich würde es lieber ins Hauptprogramm setzen.
Hast du schon Erfahrung mit dem Sensor gemacht ? Das ist ein "1 Wire" Bus... Ist der komplizierter als der I2C Bus ?
Das Auswerden und umrechnen sollte ja annähernd gleich sein oder ?