Forum: Mikrocontroller und Digitale Elektronik On-Chip Temperatur ATtiny


von Gerry L. (Gast)


Lesenswert?

Hallo alle zusammen,

ich möchte ein billiges Temperaturmess Modul aufbauen.
Nach einigen Leseaktionen zu Dallas, LM und Konsorten bin ich nun
eigentlich soweit das ich einfach einen ATtiny 24 o.ä. benutzen möchte.

Meine Frage nun, hat mit diesen Chips schon einer Erfahrungen sammeln
können was die Temperaturauslesung betrifft?

(Die AppNote zum ATtiny 25 habe ich bereits gelesen)

Danke
Gerry

von rudolf (Gast)


Lesenswert?

gern geschehen Gerry

von Andreas K. (a-k)


Lesenswert?

Willst du den internen Sensor vom Tiny24 verwenden? +/-10°C reicht dir?

von Gerry L. (Gast)


Lesenswert?

Ja es war angedacht den Internen zu nutzen.

+/-10 steht so aber nicht im Datenblatt oder ? Laut dem Datenblatt 
sollte sich das ganze doch kompensieren/abgleichen lassen.
Aber ich dachte mir schon das es irgendeinen Hacken geben muss zumal 
nirgends im Internat eine vernünftige Abhandlung dafür zu finden ist.

Welche Alternativen würden sich den für ein 3V Knopfzellen Billigsystem 
anbieten?
Dallas , LM usw. scheiden wegen zu hoher Kosten aus.

Eventuell bleibt wohl doch nur ein System auf Basis eines KTY übrig.

@Rudolf die Nase
Danke fürs durchlesen.


Gerry

von Andreas K. (a-k)


Lesenswert?

Der interne Sensor ist nicht für Raumtemperaturmessung gedacht, sondern 
um kritische Gehäusetemperaturen irgendwelcher Geräte erkennen zu 
können.

LM335 zu teuer??

von Dieter Werner (Gast)


Lesenswert?

> Welche Alternativen würden sich den für ein 3V Knopfzellen Billigsystem
anbieten?

Zum Beispiel Analog Devices ADT7301 oder 7302.

Das Problem dürfte - wie so oft - die Beschaffbarkeit sein.

von Frank (Gast)


Lesenswert?

nimm den KPY81/110 der kostet 69 cent bei reichelt.und wenn du basic 
programmierst kann ich dir noch einen link geben.
gruss Frank

von Gerry L. (Gast)


Lesenswert?

@Andreas
Teuer nicht aber ich habe nur 3V zur verfügung und damit wäre beim LM335 
wohl bei 25 Grad schluss.

@Frank
Du meinst sicher den KTY81/110 ?
Wird wohl meine einzige möglichkeit sein. Es wäre schön wenn Du mir ein 
paar Links zum Thema schreiben könntest.Gerade mit der 
Kalibrierung/Berechnung kenne ich mich nicht so aus.

Aufgabe ist es ein Funksender aufzubauen der mir pro Minute (oder mehr) 
die aktuelle Temperatur sendet.

Liebe Grüße
Gerry

von Frank (Gast)


Lesenswert?


von Gerry L. (Gast)


Lesenswert?

Okay die Grafik kenn ich schon trotzdem danke. Nur hier wird als 
Referenz mit 5V gearbeitet da ich kein Datenblatt zum KTY habe brauch 
ich unbedingt eine passende Formel um den Vorwiederstand auf 3V runter 
zu rechnen.

von Frank (Gast)


Lesenswert?


von fnah (Gast)


Lesenswert?

>[...]da ich kein Datenblatt zum KTY habe[...]
http://www.google.de/search?q=KTY81/110%20datasheet%20filetype:pdf

von Frank (Gast)


Lesenswert?

was willste rechnen.das kannste per software ausbügeln

von Frank (Gast)


Lesenswert?

stopf den fühler in eiswasser und miss die spannung
die nimmste dann als nullpunkt.
Const Refer = 1.1593 'Fühler Konstante bei 0°C muss mit eiswasser 
abgegliechen werden

von Lutz (Gast)


Lesenswert?

>stopf den fühler in eiswasser und miss die spannung
>die nimmste dann als nullpunkt.
>Const Refer = 1.1593 'Fühler Konstante bei 0°C muss mit eiswasser
>abgegliechen werden

Oder Du nimmst einen einfachen Vorwiderstand, der etwa dem 
Sensorwiderstand im Temperaturmeßbereich entspricht und mißt ihn genau 
(KTY 2000 Ohm bei 20 Grad, Vorwiderstand auch 2000 Ohm => 
Spannungsteiler 1:1). Nun schaltest Du einfach einen Pin als Ausgang 
(ergibt bei Dir etwa 3 V) und legst diesen Pin auf AREF. Über dem Sensor 
mißt Du jetzt etwas mit dem ADC (512 oder was auch immer). Bedeutet, daß 
über dem Vorwiderstand der Rest (1023-Meßwert) anliegt. Und nun: Du 
kennst den Vorwiderstand und wie sich die beiden Spannungen zueinander 
verhalten. Mit U_Vor/U_Sensor=R_Vor/R_Sensor und minimalem 
mathematischem Geschick kannst Du jetzt den Widerstand des Sensors 
ausrechnen lassen und mit der Formel des Datenblattes weiter die 
Temperatur ausrechnen. Das ist Spannungsänderungsunabhängig, spart Dir 
kalte Finger und das Eis kommt in den Drink ...

Gruß
Lutz

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Das größere Problem mit diesen einfachen Widerstandssensoren dürfte es
sein, sie so zu beschalten, dass sie bei Inaktivität keinen Strom
ziehen.  Die Aufgabe klang ja eher so, als sollte damit irgendwas
Batteriebetriebenes gebaut werden.  Wenn man die Speisung des
R-Netzwerks über einen AVR-Ausgang macht, hat man zusätzliche Fehler
infolge der nur endlichen Ergiebigkeit der Ausgangstransistoren.  Ein
Relais ist sicher auch nicht gerade im Sinne des Erfinders
(zusätzliche Kosten, Platzbedarf, langsam).

Ich würde mir an deiner Stelle zumindest mal angucken, wie gut der
interne Sensor funktioniert.  Du hast ja ca. 1 mV/K, was wiederum ca.
1 Bit/K ist.  Ich denke, dass die ±10 K einfach mal nur einen
Hausnummer sind, damit du Atmel nicht drauf verklagen kannst...

von nop(); (Gast)


Lesenswert?

Ich wuerd einen 10k NTC nehmen. Nochmals 10k metallfilm in Serie an die 
Speisung. Die Speisung kann auch heissen einen Portpin, falls 
abschaltbar gewuenscht ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ich wuerd einen 10k NTC nehmen.

Vermutlich ist der Kalibrieraufwand dafür aber höher als für den
ATtiny24-internen Sensor... die Dinger sind ja hochgradig
nichtlinear.

von nop(); (Gast)


Lesenswert?

Nichtlinear ist eines, berechenbar was anderes. Mit nem 1%er kommt man 
schon recht gute Werte auch ohne kalibration.

von Thomas O. (tarzanwiejane)


Lesenswert?

Fuer alle die keinen Bock auf Kalibrieren haben und auch nicht in 
Grossserie gehen wollen kann ich den DS1621 empfehlen. Kann man in der 
Apotheke mit dem grossen C erwerben. Auslesen ueber I2C. +-0,5 Grad 
Celsius Genauigkeit.
Sollte fuer Hobbyzwecke ausreichen. Kostet allerdings ein kleines bissel 
mehr als so ein KTY.

cu Tarzanwiejane

von Rolf Magnus (Gast)


Lesenswert?

> Wenn man die Speisung des R-Netzwerks über einen AVR-Ausgang macht, hat
> man zusätzliche Fehler infolge der nur endlichen Ergiebigkeit der
> Ausgangstransistoren.

Kann man nicht AREF auch da dranhängen? Dann spielt dieser Fehler keine 
Rolle. So hat's Lutz ja auch schon geschrieben.

von Gerry L. (Gast)


Lesenswert?

Nach all den Beiträgen bin ich jetzt mehr verunsichert als vorher.

Das mit dem KTY Wiederstand so wie Lutz es ausgeführt hat wird wohl 
letztendlich das mass der dinge sein. Wenn die Versorgung über einen 
Portpin kommt und ARef ebendso, sollten sich die Fehler eigentlich 
aufheben.

Nun gut ich werde alles mal bestellen. Und natürlich erstmal den ATtiny 
testen ob er sich wirklich so krass verhält bzw. interessant wäre ja ob 
diese Schwankung innerhalb von 2 Messungen so stark sind.

Liebe Grüsse

von Benedikt K. (benedikt)


Lesenswert?

Die interne Temperaturmessung bei den Tinys ist ziemlich schlecht: Das 
ganze rauscht relativ stark, die erreichbare Genauigkeit ist ziemlich 
unbrauchbar, außer zur Kompensation des internen Oszillators oder 
ähnlichem.

von nop(); (Gast)


Lesenswert?

AREF darf nicht geschaltet werden, er muss nahe bei Vcc liegen. Ich 
muesst allerdings nochmals das Datenblatt anschauen.

von Andreas K. (a-k)


Lesenswert?

Fragt sich nur, ob der für AREF zulässige Bereich auch dann relevant 
ist, wenn der ADC ohnehin stromsparend abgeschaltet ist.

von gast (Gast)


Lesenswert?

Hi,
wenn es recht schnell und simpel sein soll, dann nimm doch den 
Sensor(Schaltung) vom Butterfly-Board und die zugehörigen 
Softwareparameter. Steht alles bei ATMEL.com als Info zur freien 
Verfügung.

von DKM (Gast)


Lesenswert?

Ich hab grad mal an 2 Tiny24 die internen  Temperatursensoren 
ausprobiert:

Bei Zimmertemperatur zeigte der eine $0130 an, der andere $0138
Nach mehrmaligem Abkühlen mit Kältespray fanden beide immer wieder zu 
ihrem Ausgangswert zurück.

Die gelesenen Werte waren dabei sehr stabil.

Die Auflösung ist dabei sehr gering, man muss schon eine Weile den 
Finger draufhalten, bis sich der Messwert ändert.

offensichtlich wird dabei die Auflösung des AD-Wandlers auf 8 Bit 
reduziert:
der Messwert springt immer in 4-er Schritten

von Benedikt K. (benedikt)


Lesenswert?

DKM wrote:
> offensichtlich wird dabei die Auflösung des AD-Wandlers auf 8 Bit
> reduziert:
> der Messwert springt immer in 4-er Schritten

Seltsam. Von der Logik her dürfte er das eigentlich nicht machen, da nur 
ADMUX umgeschaltet wird. Ich hatte es mal mit einem tiny25 ausprobiert, 
da hatte ich die vollen 10bit Auflösung, aber die Temperatur schwankte 
immer um einige °C, da ja die Auflösung des ADCs in etwa 1°C beträgt. 
Für eine normale Raumtemperaturmessung ist das ganze also ungeeignet.

von DKM (Gast)


Lesenswert?

Irgendwas ist da noch seltsam:
Jetzt hab ich mal runtergekühlt
und geschaut was der ADC so macht, wenn er wieder auftaut: (ca 0.5s 
zwischen den Messungen):

>0130
>adc
>0130
>adc
>0131
>adc
>0130
>adc
>0130
>adc
>0130
>adc
>0130
>adc
>0138

Er ist in eine ganze Zeit bei $0130 geblieben, ging dann auf $0131, dann 
wieder auf $0130, dann auf $0138 (und blieb dort).
Also keine 8 Bit-Reduzierung, sondern nur komische Werte...

von Gerry L. (Gast)


Lesenswert?

So ich habe mir jetzt mal ein Referenzboard gezeichnet.
Eine Frage noch an

nop(); wrote:
> AREF darf nicht geschaltet werden, er muss nahe bei Vcc liegen. Ich
> muesst allerdings nochmals das Datenblatt anschauen.

Warum sollte darf AREF nicht per Port geschaltet werden dürfen?

@alle
Ihr besteht alle auf beschaltung von Aref warum? Laut Datenblatt
kann ich doch auch den internen Ref nehmen?
Der arbeitet irgendwo bei 2,... V.

Jedenfalls hängt mein ARef jetzt in der Luft.
Hmm vieleicht übersetzt ich das Datenblatt auch zu wenig im techn. 
Sinne.

Gerry

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

nop(); wrote:

> AREF darf nicht geschaltet werden, er muss nahe bei Vcc liegen.

Das verwechselst du mit AVcc.


Gerry L. wrote:

> Jedenfalls hängt mein ARef jetzt in der Luft.

Ich habe so in Erinnerung, dass man bei Benutzung der internen
Referenz dort einen Abblockkondensator dranpappen soll.  Müsste
aber im Datenblatt stehen.

von Gerry L. (Gast)


Lesenswert?

> Ich habe so in Erinnerung, dass man bei Benutzung der internen
> Referenz dort einen Abblockkondensator dranpappen soll.  Müsste
> aber im Datenblatt stehen.

Stimmt ! Okay 100nF sollten genug blocken.

Okay dann werd ich mich mal ranmachen.



von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Das ist aber nicht zum Blocken sondern zum puffern ;)

von Gerry L. (Gast)


Lesenswert?

Läubi Mail@laeubi.de wrote:
> Das ist aber nicht zum Blocken sondern zum puffern ;)

Verdammt.....

AREF: External Analog Reference for ADC. Pullup and output driver are 
disabled on PA0 when
the pin is used as an external reference or Internal Voltage Reference 
with external capacitor at
the AREF pin by setting (one) the bit REFS0 in the ADC Multiplexer 
Selection Register
(ADMUX).

Eigentlich wollt ich ja anständig fluchen, wird aber auch nicht helfen.

Blocken ist bei mir Aref an GND.
Puffern ist aber an VCC.
Na was denn jetzt.
Warum müssen diese DSheets immer so kompliziert sein. Können die nicht 
einfach mal schreiben :
"ARef muss bei verwendung der internen Referenz über einen C an VCC 
gepuffert werden."

Also Puffern über VCC mit c ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Aus der Einleitung zum ADC:

The voltage reference for the ADC may be selected by writing to the
REFS2:0 bits in ADMUX.  The VCC supply, the AREF pin or an internal
1.1V / 2.56V voltage reference may be selected as the ADC voltage
reference. Optionally the internal 2.56V voltage reference may be
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
decoupled by an external capacitor at the AREF pin to improve noise
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
immunity.
^^^^^^^^^

Vcc sollte natürlich immer ausreichend abgeblockt werden.

von Stefan K. (_sk_)


Lesenswert?

Die Kondensatoren baust Du IMMER mit einer Seite an GND ein.

Sollten verschienden GNDs im System vorhanden sein, dann zum 
entsprechend passenden GND (AVCC nach AGND, AREF nach AGND, VCC nach 
GND).

Wenn Du AREF über einen C mit VCC verbindest, dann übertragen sich alle 
Störungen auf Deiner VCC auch nach AREF.

Gruß, Stefan

von Gerry L. (Gast)


Lesenswert?

Also war mein ARef über c nach GND doch passend.

Nicht einfach....

Aber vielen Dank für die Erläuterung.

@Jörg

Genau da liegt mein Problem - es passend zu übersetzen. Mein "feines" 
Schulenglisch sagt mir eben alles möglich aber scheinbar nicht das 
richtige.

"durch einen externen Kondensator am AREF Stift entkoppelt , um das 
Rauschen/Stimme zu vermeiden oder zu verbessern"

"Blocken/Entkoppeln tu ich ja eigentlich immer über GND"


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

,,Wahlweise kann die interne 2,56-V-Referenzspannung durch einen
externen Kondensator am AREF-Pin abgeblockt werden, um die
Störfestigkeit zu verbessern.''

(Eine gescheite Übersetzung ist immer gar nicht so einfach.  Nur mal
schnell Durchlesen ist viel einfacher.)

von Hagen R. (hagen)


Lesenswert?

aber Vorsicht ;) Je größer die Kapazität dieses Abblockkondensators ist 
desto länger benötigt der interne ADC beim Umschalten der Referenz um 
korrekte Ergebnisse zu erzielen. Mir hat das mal das Genick gebrochen 
und tagelanges Gesuche eingebracht. Zwei unterschiedliche ADC Funktionen 
benutzten unterschiedliche ARef-Einstellungen. Jedes programm für sich 
gesehen lief super. Aber die Kombination beider in einem Source brachte 
Probleme weil der ext. Kondensator mit 100nF länger benötigte sich auf 
die neue ARef einzustellen als der eigentliche ADC Samplingvorgang 
dauerte.

Gruß Hagen

von Gerry L. (Gast)


Lesenswert?

Hallo,

also ich komme einfach nicht weiter.

Ich habe benutze den Code:
1
uint16_t readADC(void)
2
{
3
 uint8_t i; uint16_t result = 0; uint16_t x;
4
5
 DDRA &= ~ (1<<PA1);
6
 PORTA &= ~ (1<<PA1);
7
8
 ADMUX |= (1<<REFS1); // | (1<<REFS0);
9
 ADMUX |= PA1;
10
 asm("nop");
11
 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
12
 ADCSRA |= (1<<ADSC);
13
14
 while(ADCSRA & (1<<ADSC));
15
16
 x = ADCL;
17
 x += (ADCH<<8);
18
 result += x;
19
20
 ADCSRA &= ~(1<<ADEN);
21
 
22
return result;
23
}

aber er zeigt mir bei Temperaturänderungen (Lötkolben) einfach keine 
Änderungen an. Immer der selbe Wert.

Ich bekomme es einfach ohne Hilfe nicht hin. Beispiele aus dem google 
funktionieren auch nicht. Mag sein das beim ATTiny24 ja alles anders ist 
aber ich habe die Datenregister abgeglichen..... und nüscht....

Meine Konfig ist ARef mit 10 nF gegen GND und der Rest ist einfach der 
beschriebene Teiler mit KTY81-110.

Kann mir da jemand auf die Sprünge helfen.

von Matze (Gast)


Lesenswert?

Also ich würde auch einen KTY nehmen, den mit Portpin geschalten wird 
und die Referenzpannung kannst dann auch von diesem Portpin nehmen. So 
habe ich es mal vor ein paar Jahren mit einer C-Control gemacht um eine 
Saunasteuerung zu basteln. Mit dem 8 Bit ADC hatte ich eine Auflösung 
von ca. 0,5K. Die Temperaturwerte habe ich theoretisch berechnet und sie 
haben sogar ohne Abgleichen gestimmt. Klar, eine e-Funktion ist für 
einen Tiny schon nicht einfach, aber schnell genug würde es gehen. Oder 
man macht sich eine Tabelle. Oder man kann die Funktion auch teilweise 
linearisieren (so hab ich es gemacht).
Auf jedenfall braucht mal so nur 2 Bauteile im Wert von wenigen Cent und 
bekommt auflösungen von deutlich unter 1K.

von Simon K. (simon) Benutzerseite


Lesenswert?

Mach das doch anders:

Häng deinen Spannungsteiler/KTY Gebimsel an AREF (parallel zum 
Kondensator, der dort hängen sollte).

Nun kannst du in der Software einfach die Einstellung wählen, wo AVCC 
als Referenz genommen wird und an AREF ein Kondensator angeschlossen 
wird - Dein Sensor wird nun mit Strom versorgt.

Wenn du den Sensor stromlos machen willst: Einfach eine Option wählen, 
wo AREF nicht beschaltet ist.

Da braucht man keinen Portpin für.

von Gerry L. (Gast)


Lesenswert?

Hallo,

ja klar kann ich einiges ändern. Aber der A/D muss doch wenigstens 
reagieren.
Wenn ich mit dem Messgerät an den Port gehe kann ich sehen das sich die 
Spannung ändert, also sollte der A/D doch wenigstens die Änderung 
weitergeben/registrieren aber er scheint nicht zu messen. Und das ist 
mein Problem er macht nichts aber auch garnichts......

@Matze
Sicher werde ich irgendwann die Temp abgleichen. Nur ich muss erstmal 
den A/D zur mitarbeit bewegen. (bis du mit deinem RFM12 Problem weiter? 
Falls nicht kann ich dir weiterhelfen.Ich tu es auch mit einem ATTiny44)

@Simon
Diesen Weg werde ich sicher einschlagen. Nur wie gesagt ich muss meinen 
A/D erstmal in die gänge bekommen.Ich habe auch keinen AVCC nur VCC aber 
das sollte nicht das Problem sein.

Es muss doch irgendwie möglich sein meinen Fehler auf zu spüren.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Aktivier mal den ADC nach jeder messung neu...

von Gerry L. (Gast)


Lesenswert?

Okay ich habs,

nicht
1
 ADMUX |= (1<<REFS1)|(1<<REFS0);

sondern
1
 ADMUX &= ~( (1<<REFS1)|(1<<REFS0) );

Wo zum Geier steht, daß ich die Bits löschen muss statt setzen.

@Jörg Wunsch
Ja ich weiss, aber sag mir wenn dann bitte wo das erwähnt wird.

Dank für eure mühe.

von Gerry L. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe für die die es interessiert mal eine Datei angehangen wo
der Prozessor bei nichtgebrauch in den PowerDown Modus geschickt wird 
und per Watchdog wieder aufgeweckt wird.

Pindefinition: KTY "Gebimsel" ;)

PA1 -----1K---+----KTY-----|GND
              |
              |
              |
PA0 ----------+----10nF----|GND

Sollte die eff. Methode sein um Strom zu sparen.

Ich hoffe die Datei läst sich compilieren da ich die aus meinem akt. 
Programm rauskopiert und schnell umgeschrieben habe.

Die Temp. Umrechnung haut noch nicht hin (20,4 im Kühlschrank kann nicht 
sein), bin da erst am durchackern zumal ich kein Kühlschrank mit Eisfach 
habe. :)

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Gerry L. wrote:
> PA1 -----1K---+----KTY-----|GND
>               |
>               |
>               |
> PA0 ----------+----10nF----|GND

Ich meinte es ja eigentlich so. (EDIT: Ups, hab KTY und den 1K R 
vertauscht)

EDIT2: Ups, ich seh gerade der Tiny24 hat garkeine Möglichkeit die 
interne Referenz an AREF herauszuführen. Demnach wäre auch dein 10nF 
Kondensator für'n Sack. Oder ist der 10nF Kondensator nicht für AREF 
gedacht? Sondern zur Stabilisierung des Temperaturwandler-ergebnisses? 
Nun bin ich endgültig verwirrt. (Auf PA0 liegt AREF und ADC0)

PS: Hab hier nur nen Tiny15 in meiner Bibliothek, sollte aber ja 
übertragbar sein.

Gibts irgendwo neuere AVRs als Eagle Package? cadsoft hats leider nicht 
:(

PPS: Was ist das denn für eine Datei von dir? Auha..
PPPS: Warum setzt du die ADC-Pins auf Ausgang + HIGH?

von Gerry L. (Gast)


Angehängte Dateien:

Lesenswert?

Simon Küppers wrote:

> Nun bin ich endgültig verwirrt. (Auf PA0 liegt AREF und ADC0)

Ja... Ich war am verzweifeln.
Das Dumme oder komische oder gewollte (keine Ahnung) ist, es werden AD 
Wandlungen durchgeführt, heißt er reagiert auf Temp Änderungen (Hand und 
Lötkolben)

>
> Gibts irgendwo neuere AVRs als Eagle Package? cadsoft hats leider nicht

Nein.Ich musste mir extra das Bauteil "malen" und hab doch glatt ohne 
Nachkontrolle ne Platte geätzt und.... bumm hatte ne falsche 
Pinbelegung.
Nu Passt es.

> PPS: Was ist das denn für eine Datei von dir? Auha..

Ich weiss hab zu spät gesehen das RTF eingestellt war. Neue ist bei.

> PPPS: Warum setzt du die ADC-Pins auf Ausgang + HIGH?

Ist ein übrigbleibsel wegen LEDs

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerry L. wrote:

> nicht
>
1
>  ADMUX |= (1<<REFS1)|(1<<REFS0);
2
>

Das ist laut meinem Datenblatt (Tabelle 18-3) eine ungültige
Einstellung.

> sondern
>
>
1
>  ADMUX &= ~( (1<<REFS1)|(1<<REFS0) );
2
>

Das wählt Vcc statt Varef als Vergleichsbasis aus.  Ist das das,
was du willst?

von Gerry L. (Gast)


Lesenswert?

>>
1
>>  ADMUX &= ~( (1<<REFS1)|(1<<REFS0) );
2
>>
>
> Das wählt Vcc statt Varef als Vergleichsbasis aus.  Ist das das,
> was du willst?

Nein, ich wollte ursprünglich
1
  ADMUX = (1<<REFS1); //Internal 1.1V Reference.

Durch setzen des Refs1 Bits laut Tabelle sollte es meiner Meinung nach 
funktionieren.
Allerdings erhielt ich hier immer 1023 also den max. Wert.
Ich weiss das ich hier argen Nachholbedarf habe. Der Hinweis aufs 
Datenblatt allein hilft mir nicht viel weiter. Auch die Seite von Sprut 
ist mir leider zu theoretisch. Sie setzt so einiges an Wissen vorraus. 
(zusammenstellung der Formeln usw.)Der ADC nimmt im Datenblatt 18 Seiten 
in Anspruch... kein Problem wenns deutsch wäre oder weniger techn. 
geschrieben.Was soll zum beispiel das bedeuten

"Using offset calibration, set k = 1.0, where k = 
(1024*1.07mV/°C)/1.1V~1.0 [1/°C]."

Das ist keine Formel das ist Mumpitz. Woher kommen die 1.07mV und was 
soll 1.1V~1.0[1/°C] bedeuten?

Ich würd das mit meiner Logic so übersetzen Grad = 
(1024*ADCW)/Referenzvariable aber ich weiss nicht ob das so richtig ist.

Jetzt kommt Tabelle 18-4:
Okay bis Reserved for ... ales verstanden aber nu
1.1V(I Ref) = 100001 ja wie jetzt?

Ich versuche immer erst durch lesen versch. Foren mein Problem zu lösen. 
Nur, ich finde keine für mich brauchbare Lösung.Auch jezt hänge ich noch 
an dem Problem ohne Eiswasser oder Kochendes Wasser eine vernünftige 
Temperatur zu erechnen. Neben mir liegt ein LM75 der zeigt mir die 
aktuelle Temp im Zimmer an. Genau das zeigt mir mein KTY jetzt auch an 
aber geht er in den Kühlschrank geht er runter auf 20 Grad und das wars. 
Wo ist jetzt das Problem?

Ich werd mich aber weiter durchboxen. Für Unterstützung bin ich immer 
dankbar.

von Gerry L. (Gast)


Lesenswert?

Nu gut ich hab jetzt wieder alles umgestellt und verfolge jetzt Lutz 
seinen Vorschlag.ARef ist auf Extern umgestellt.

ARef/PA0---+
           |
           |
PA1 -------+
           |
           1K
           |
PA2--------+
           |
          KTY
           |
           -
          GND


Ich bekomme jetzt also als Ergebnis

ARef=4,90V
PA2=2,55V
ADCW=422

((1024-ADCW) / 1024 )* ADCW = 24,8 °C

geht nur leider nicht net.

Ich habe wirklich keine blassen Schimmer wie ich das ganze in eine 
Formel Packen soll.Völlige Denkblockade (Ich glaube ich hänge schon zu 
lange an diesem Problem).
Kann mir hier jemand bitte weiterhelfen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dein Problem ist, dass du im Integer-Wertebereich rechnest und dem
Compiler sagst, dass er zuerst dividieren, dann multiplizeren soll.
Die ganzzahlige Division hat aber das Ergebnis 0.  Hier mal den GDB
als Tischrechner missbraucht:
1
(gdb) set $adcw = 422
2
(gdb) print ((1024 - $adcw) / 1024) * $adcw
3
$1 = 0

Wenn du das alles im Gleitkommabereich rechnest, funktioniert es:
1
(gdb) print ((1024.0 - $adcw) / 1024) * $adcw
2
$2 = 248.089844

(Ich vermute, die Skalierung um 10 ist gewollt.)

OK, Gleitkomma wirst du nicht unbedingt wollen, also musst du den
Ausdruck umformen:
1
(gdb) print (unsigned long)(1024 - $adcw) *$adcw / 1024
2
$3 = 248

Die Multiplikation muss ein 32-bit-Ergebnis bringen dürfen, daher
der Cast nach (unsigned long).  Ob nun die 32-bit-Integer-Routinen
wirklich so viel sparsamer sind als die 32-bit-Gleitkomma-Routinen,
musst du dir selbst mal ansehen.  Letztere sind praktisch handgefeilt,
erstere lieblos generierter Code des Compilers.

von Gerry L. (Gast)


Lesenswert?

>
1
> (gdb) print ((1024.0 - $adcw) / 1024) * $adcw
2
> $2 = 248.089844
3
>
>
> (Ich vermute, die Skalierung um 10 ist gewollt.)
>
Nein, ist sie nicht.... 20 Jahre aus der Schule und nu brauch ich das- 
Formeln umstellen, ich könnt ....
Es fällt mir wirklich wahnsinnig schwer das ganze in brauchbare 
Ergebnise zu fassen. Deswegen ist dieser Thread auch so lang und ich 
habe immer noch kein Ergebnis.

Ich möcht jetzt mal zusammenfassen:
Ich brauch den Temp. Bereich von -20° bis +40°
Ich habe wie oben gezeichnet einen Spannungsteiler 1k und KTY81-110
Ich habe die Ohm Werte für den Tempbereich vom Datenblatt und bring es 
nicht fertig diese für mich zu nutzen.
Ich möchte mit 3V arbeiten, weiss aber nie die genaue ARef Spannung da 
diese ja von der aktuellen Batteriespannung abhängt.

Mitlerweile hab ich mir diverse Threads durchgelesen aber es wird keine 
detaillierte Lösung für mein Problem angeboten (jedenfalls haben ich 
keine gesehen)

Ich bekomme es nichtmal mehr mit das ich Divisionen nicht mit Integer 
machen kann was ja völlig logisch ist.

Ich glaube auch mitlerweile das mein Spannungsteiler völlig falsch 
dimensioniert ist.

Ich habe keine Ahnung!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, so weit weg vom Ergebnis bist du doch gar nicht!

Die 248 scheint ja korrekt zu sein für deine 24,8 °C.  Formatier' dir
die doch mit itoa() in einen Puffer und gib sie aus, das
Dezimalzeichen stellst du einfach an die richtige Stelle (daher
dachte ich ja, dass du diese Skalierung so haben wolltest).

von Thomas O. (tarzanwiejane)


Lesenswert?

@ Gerry L.
wenn ich mir diesen Thread so anschaue... irgendwie scheint es immer 
irgendwie aufwendig zu werden und ungenau. Von Eichung/Kalibrierung des 
ganzen Deseasters mal ganz abgesehen.
Ich will dich an dieser Stelle nur noch mal an meinen Post erinnern...
Nimm nen digitalen I2C oder 1-Wire Sensor. Dranpappen, auslesen, fertig.

cu Tarzanwiejane.

von Gerry L. (Gast)


Lesenswert?

@Jörg
Ja, das ist schon so gewollt nur das meine Werte nicht stimmen.
Die Kühlschrank Temp. zbsp. kann definitiv keine 20° haben, ergo stimmt 
meine Formel nicht.

@Thomas

Mitlerweile bekomme ich die Temperatur als 2 Stelligen Wert.
Und stelle fest : Auch wenn hier der Preis entscheidet, selbst als 
Zimmerthermometer scheint der KTY ohne OpAmp bzw. gescheiter 
Kalibrierung/Linerarisierung ungeignet (auch ein Mittelwert hilft 
nicht).
Okay die Kühlschrank Temperatur stimmt jetzt, das ist aber auch alles 
meine Finger zum Beispiel haben starkes Fieber (40°) :)

Ich mach jetzt ne Pause und schau mir den Strombedarf eines fertigen 
Sensors an.

Danke an alle

von Lars Lochmann (Gast)


Lesenswert?

Ich würde den LM75 nehmen, den gibt es auch als 3,3V Version und auch 
bei reichelt. Es ist auch ein I2C-Sensor. Fertig kalibriert mit 0,5°C 
Auflösung. Leider ist er nur in SMD-Version verfügbar, aber funzt ganz 
gut.
Heute habe ich mir den internen Temperatursensor am ATtiny45 mal 
angeschaut. Er reagierte auch ganz gut. Nur eben wie auch im Datenblatt 
steht, ist er nicht kalibriert. Da müsste man sich einfach mal bei 20°C 
oder so den Digitalwert nehmen und dann locker approxieren wenns übern 
Daumen reicht. Aber nicht vergessen vorher auf 1,1V interne Referenz zu 
stellen.

von egon (Gast)


Lesenswert?

Genau. Verwende den gleichen Typ,habe im Bereich zwischen 10 und 40 Grad 
kalibriert und mittle jeweils über 1024 Messungen.Das funktioniert 
stabil aufs Grad genau.Spart Euch jeden zusätzlichen externen Aufwand 
wenn das langt!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.