PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Problem mit Temperaturmessung mittels ATtiny 13 und LM335



MB12
02.08.2015, 21:04
Hallo,

ich versuche mittels eines LM335 Temperatursensors (Datenblatt) (https://cdn-reichelt.de/documents/datenblatt/A200/LM135_LM235_LM335TO92%23STM.pdf)und einem ATtiny 13 die Temperatur zu messen, um einen Lüfter zu steuern.
Meine Schaltung sieht so aus:30544

Das Zugehörige Bascom Programm misst alle 10 Sekunden über den ADC die Temperatur und wenn der gemessene Wert über 600 (also über 23 Grad) liegt werden der Lüfter und die Grüne LED eingeschaltet, liegt er über 800 werden der Lüfter und die rote LED eingeschaltet. Ansonsten bleiben der Lüfter und die LEDs aus.

Dazu initialisiere ich zuerst den Tiny



$regfile = "attiny13.dat" 'Tiny13
$crystal = 4000000
$hwstack = 10
$swstack = 20
$framesize = 20


Definiere die benötigten Ports



Config Portb.2 = Output 'Anschluss Lüfter
Luefter Alias Portb.2
Luefter = 0

Config Portb.1 = Output 'Anschluss LED Rot
Ledrot Alias Portb.1
Ledrot = 0

Config Portb.0 = Output 'Anschluss LED Grün
Ledgruen Alias Portb.0
Ledgruen = 0

Config Portb.3 = Output
Sensorversorgung Alias Portb.3 'GND oder +5V für Messung
Sensorversorgung = 1


Starte den ADC und führe die erste Messung durch



Config Portb.4 = Input 'ADC Initialisieren
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Messergebnis As Word 'Variable für gemessenen Wert
Waitms 500
Ledgruen = 1

Messergebnis = Getadc(3) 'Erste Temperaturmessung
Waitms 500
Sensorversorgung = 0


und gehe schließlich in das Hauptprogramm über



Do

If Messergebnis > 600 Then

Luefter = 1
Ledgruen = 1
Else

Luefter = 0
Ledgruen = 0
Ledrot = 0

End If


If Messergebnis > 800 Then

Luefter = 1
Ledrot = 1

End If

Waitms 8500

Sensorversorgung = 1
Waitms 500
Messergebnis = Getadc(3) 'Temperaturmessung
Waitms 5000
Sensorversorgung = 0

Ledrot = 0
Ledgruen = 0
Waitms 500


Loop

End


Mein Problem ist folgendes:

Bei normaler Raumtemperatur (gerade ca. 22 Grad) ermittelt der ADC einen Wert zwischen 1010 und 1020, was absolut unrealistisch ist.
Nach meiner Berechnung anhand des Datenblatts des LM 335 müsste es bei 23 Grad Celsius 2,9V also über den ADC bei Referenzspannung 5V ca 600 ergeben-
(Rechnung: [ 273,15 (Kelvin) + 23 (Grad Celsius) ] * 10mV (pro Kelvin) =~ 2,9V ;
[1024 (Auflösung des ADC):5 (V Referanzspannung)] * 2,9(Volt) =~ 595 ).

Wenn ich mit dem Multimeter an den Beinchen 3 und 4 manuell nachmesse komme ich auf 3,2 Volt, was ca 48 Grad Celsius entspricht und ebenfalls zu hoch aber dennoch realistischer als die Messung des ADC ist. Da es mir nicht auf ein halbes Grad ankommt habe ich das Adjust Beinchen des LM 335 frei gelassen.

Hat jemand eine Idee wie ich einen realistischen Temperaturwert ermittelt bekomme?

Gruß,

Marius

malthy
02.08.2015, 22:15
Hey,

ich hab den LM335 noch nicht verwendet, aber auf den ersten Blick ins Datenblatt sieht's mir so aus, als sei Deine Beschaltung falsch. Der Sensor ist so eine Art spannungsabhäniger Zenerdiode. Du musst quasi einen Spannungsteiler aus einem Widerstand und dem LM335 aufbauen und dann die Spannung über dem LM335 messen. Also VCC-R-LM335-GND, zwischen R und LM335 greift dann der ADC vom AVR das Temperatursignal ab.

Das war nur ein flüchtiger Blick ins DB, guck's Dir auch nochmal an.

Gruß
Malte

MB12
02.08.2015, 22:28
Also VCC-R-LM335-GND, zwischen R und LM335 greift dann der ADC vom AVR das Temperatursignal ab.

Genauso hab ich es ja, nur dass bei mir VCC durch Pin 1 ausgegeben wird. Dadurch ändert aber doch nichts an der Beschaltung, oder?

Gruß,
Marius

- - - Aktualisiert - - -

Ich sehe gerade, dass da im Schaltplan ein Fehler ist, ich habe es so geschaltet: Pin 2 (führt während der Messung VCC) - R - LM 335 - GND und zwischen R und dem LM 335 greife ich das Signal ab und messe es an Pin 3.

- - - Aktualisiert - - -

30545

So ist es geschaltet

oberallgeier
02.08.2015, 22:46
Hi Marius,

denk an Maltes Anmerkung in Deinem andern Thread über Deine "$crystal = ..."-Zeile. Da Du auch in diesem Schaltplan keinen Quarz hast, ist Deine Codezeile mit "$crystal = 4000000" keinen Pfifferling wert - vielmehr schickt sie den Controller "in die Irre". Dein Controller dürfte (nach Deinen Angaben im andern Thread - CKSEL[1:0] = 01) mit 4,8 MHz tickern. Mit andern Fuses allenfalls mit einer der anderen möglichen Frequenzen, die Du mit dem internen Oszillator erreichen kannst: 9,6 MHz, 4,8 MHz, 1,2 MHz, 128 kHz etcetc.

Im anderen Thread wurde schon darauf hingewiesen, dass Du den internen Oszillator per Fuses parameterisieren kannst; dabei sind aber die 4,000 MHz nicht drin. Und Dein Code ist NUR DANN richtig und bringt das gewünschte Ergebnis, wenn diese Angabe "$crystal = .." der tatsächlichen Frequenz des Controllers entspricht.

Übrigens: für den ADC gelten Einschränkungen in der Programmierung des Taktes, der muss zwischen 50 kHz und 200 kHz getaktet werden für gute Wandlungsergebnisse, bei geringen Ansprüchen könnte der Takt schneller sein (die Samplezeit wird dann kürzer). Wie das in Bascom geschieht musste selbst raussuchen, vielleicht macht das Dein "Prescaler = Auto", vielleicht auch nicht.

MB12
02.08.2015, 23:19
Hi,

danke für den Hinweis, die Zeile ist natürlich überflüssig, aber das ist das Problem leider nicht, habe es gerade getestet.
Der Takt des ADC wird meines Wissens nach über den Prescaler eingestellt.

Gruß

Marius

oberallgeier
02.08.2015, 23:44
..aber das ist das Problem leider nicht, habe es gerade getestet..Liegts vielleicht am Portpin den Du als ADC benutzen willst?


Config Portb.3 = Output
Sensorversorgung Alias Portb.3 'GND oder +5V für Messung
Sensorversorgung = 1und weiter gehts mit:

Config Portb.4 = Input 'ADC Initialisieren
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Messergebnis As Word 'Variable für gemessenen Wert
Waitms 500
Ledgruen = 1

Messergebnis = Getadc(3) 'Erste TemperaturmessungMit Getadc(3) wird doch der PB3 abgefragt, der ist aber weiter oben als Output definiert ? ? ? Oder ? ?

malthy
02.08.2015, 23:53
Liegts vielleicht am Portpin den Du als ADC benutzen willst?

Ich wollt's auch gerade schreiben, irgendwas ist jetzt durcheinander ... Dein letztes Posting verstehe ich so, dass der Sensor an ADC2 hängt :-)

Ansonsten sorry, ich hatte nur einmal schnell auf das Schaltbild und nicht in Deinen Code geguckt, daher habe ich die Versorgung des Sensors über den Port nicht erkannt (wobei ich den Sinn auch nicht ganz verstehe ...).

Gruß
Malte

021aet04
03.08.2015, 05:00
Vielleicht ist der Sensor an den Port angeschlossen um Strom zu sparen.

MfG Hannes

MB12
03.08.2015, 15:25
Mit Getadc(3) wird doch der PB3 abgefragt, der ist aber weiter oben als Output definiert ? ?
Aber Pin 3 ist doch PB4 oder verstehe ich das falsch?


Dein letztes Posting verstehe ich so, dass der Sensor an ADC2 hängt
Ja, genau so ist es


Sensor an den Port angeschlossen um Strom zu sparen
Korrekt :)

malthy
03.08.2015, 15:43
Hey,

laaaangsam :-) PB4 ist Pin 3 des tiny13, soweit so gut. Aber Du möchtest doch ADC2 abfragen, oder? Das sollte mit "getadc(2)" funktionieren, Dein o.g. Code versucht's aber wie oberallgeier bemerkt hat mit "getadc(3)".

An Stromsparen hatte ich nicht gedacht, weil Du 12V auf 5V mit einem 7805 runterknüppelst. Selbst wenn da nicht viel Strom fließt, dürfte das 1 mA, das Du beim Sensor temporär sparst, nicht so ins Gewicht fallen ...

Gruß
Malte

MB12
03.08.2015, 16:12
Das sollte mit "getadc(2)" funktionieren

dürfte das 1 mA ... nicht so ins Gewicht fallen ...

Hey,

Ja du hast recht, das macht Sinn! :) Habe den Code auf getadc(2) geändert aber der Messwert den der Tiny ausgibt liegt immernoch über 1000...

So gesehen macht es vielleicht wirklich mehr Sinn den Sensor direkt an 5V zu betreiben :D

Gruß,

Marius

- - - Aktualisiert - - -

Erstaunlicherweise funktioniert der Code, sobald der Sensor direkt an 5V betrieben und nicht über den Tiny gespeist wird...

Vielen Dank für eure nützlichen Tipps und Hinweise!

Gruß,

Marius

oberallgeier
03.08.2015, 17:24
.. Ich sehe gerade, dass da im Schaltplan ein Fehler ist, ich habe es so geschaltet: ... zwischen R und dem LM 335 greife ich das Signal ab und messe es an Pin 3 ...Ich teile Maltes Meinung, irgendwas ist durcheinander.

Der offensichtlichvermutlichhoffentlich richtige Anschluss des LM335 im ZULETZT gezeigten Schaltplan geht an
Pin 3 (des Gehäuses) = PB4 = ADC2 = PCINT4 (was für ein Chaos :-/ ).
Da es ein "getadc(0)" gibt (ich habe das erste Mal in meinem Leben Bascom-Lehrseiten zu Rate gezogen (http://avrhelp.mcselec.com/index.html?getadc.htm)) , scheint das getadc(x) mit x den ADC-PORT zu bezeichnen, in diesem Fall also wohl getadc(2) ADC>>2<< - hoffe ich. Im Code steht aber - siehe meinen obigen Beitrag, Malte hats gelesen*gg* - getadc(3). Knapp vorbei ist eben auch daneben.

Und das ist möglicherweise das hinterhältige Dilemma: ADC2 ist PB4 - und Bascom holt sich wohl ADC3. Deutlicher kann ich es nu nich mehr sagen. Wenn doch Fehler auftreten, sollte das woanders liegen:

.. Wenn ich mit dem Multimeter an den Beinchen 3 und 4 manuell nachmesse komme ich auf 3,2 Volt, was ca 48 Grad Celsius entspricht ..Eben.