- Labornetzteil AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Einstiegshilfe: Tempmessung mit KTY

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.09.2005
    Beiträge
    47

    Einstiegshilfe: Tempmessung mit KTY

    Hi,

    kann mir einer von euch ein einfaches Beispiel geben um mit einem KTY und einem ATMega Temp zu messen? Ich hab schon gesucht und das Prinzip verstanden, aber an der Umsetzung haperts noch ....
    Ein einfaches Schaltbild und ein kurzes Beispiel wie ich die Messspannung im ATMega auslese wären super, dann kann ich weiter probieren ....

    Danke!

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    39
    Beiträge
    37
    also ich hab das ma so gemacht:

    5V---------r1----adc0----kty--------gnd

    adc0= adc eingang am kontroller

    Ist also vom Prinzip her ein einfacher spannungswandler. als adc referenzspannung nimmst auch 5V und für r1 zum beispiel 3,9k.
    Mit 10bit genauigkeit kannst du dann zum beispiel folgende Formel verwenden: (1023*x)\(x+3900)
    X ist der Widerstandswert abhängig von der Temperatur(im datenblatt nachschauen) des kty in ohm.
    Das Ergebnis ist dann das was der ad Wandler rausbekommt, halt in Dezimal ^^
    Nach dem Prinzip hab ich ein Thermometer mit mega8 und LCD als ausgabe gemacht, wenn du willst kann ich noch den quellcode posten

  3. #3
    Gast
    ja quellcode wäre super!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2004
    Beiträge
    5
    Ich habe auch interesse am Quellcode!

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    45
    Beiträge
    324
    Hallo,
    ja ein Beispiel Quellcode ist immer gut.
    Habe aber noch eine Frage. Suche bei Reichelt einen PT1000 Sensor finde aber nur NTC Widerstände. Bin dann über diesen Thread auf den KTY gestoßen, welcher auch einen positiven Temperaturkoeffizienten hat. Gibt es vielleicht doch einen PT1000 aber unter einer anderen Bezeichnung, oder müßte ich eine KTY nehmen und den Unterschied zu einem PT1000 mit einer Reihenschaltung mit einem anderen Widerstand ausgleichen. PT100 und PT1000 sind doch recht gängige Fühler; kann mir nicht vorstellen, dass Reichelt die nicht hat. Brauche auch nur den Widerstandsbereich von 20°C bis 70°C

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.04.2005
    Beiträge
    181
    Hallo,
    PT1000 ist ein Platinsensor.
    Das hat allerlei Vorteile (Messbereich, Linearität, ...)
    Jedoch ist die Empfindlichkeit deutlich kleiner als bei den Silizium Sensoren (KTY10, KT100,...)

    Die Siliziumsensoren kannst Du nach Methode von eric101 machen.
    Bei PT1000 brauchst Du noch OP´s um das Signal zu verstärken.

    Bernhard

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    45
    Beiträge
    324
    ok, danke für die Info

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    39
    Beiträge
    37
    So also hier mein quellcode:
    Code:
    .include "C:\Dokumente und Einstellungen\eric\Desktop\asm\m8def.inc"
    
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;Thermometer 4Mhz	Eric Schneider		        ;;
    ;;						        ;;
    ;;        				      ;;
    ;;							;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    
    
    
    
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18
    .def adcwh = r19
    .def adcwl = r20
    
    
    
    
    .cseg
    ;	############
    ;	##Tabellen##
    ;	############
    .org 0x0071
    .db	0b01010101, 0b01010100, 0b01010011, 0b01010010, 0b01010001, 0b01010000		;-55 bis -50
    .db	0b01001001, 0b01001000, 0b01000111, 0b01000110, 0b01000110, 0b01000101		;-49 bis -45
    .db	0b01000100, 0b01000011, 0b01000010, 0b01000001, 0b01000000, 0b00111001		;-44 bis -39
    .db	0b00111000, 0b00110111, 0b00110110, 0b00110101, 0b00110100, 0b00110011		;-38 bis -33
    .db	0b00110010, 0b00110010, 0b00110001, 0b00110000, 0b00101001, 0b00101000		;-32 bis -28
    .db	0b00100111, 0b00100110, 0b00100101, 0b00100101, 0b00100100, 0b00100011		;-27 bis -23
    .db	0b00100010, 0b00100001, 0b00100000, 0b00011001, 0b00011001, 0b00011000		;-22 bis -18
    .db	0b00010111, 0b00010110, 0b00010101, 0b00010100, 0b00010100, 0b00010011		;-17 bis -13
    .db	0b00010010, 0b00010001, 0b00010000, 0b00001001, 0b00001000, 0b00001000		;-12 bis -8
    .db	0b00000111, 0b00000110, 0b00000101, 0b00000100, 0b00000100, 0b00000011		;-7 bis -3
    .db	0b00000010, 0b00000001, 0b00000000, 0b00000001, 0b00000001, 0b00000010		;-2 bis 2
    .db	0b00000011, 0b00000100, 0b00000101, 0b00000101, 0b00000110, 0b00000111		;3 bis 7
    .db	0b00001000, 0b00001001, 0b00001001, 0b00010000, 0b00010001, 0b00010010		;8 bis 12
    .db	0b00010010, 0b00010011, 0b00010100, 0b00010101, 0b00010110, 0b00010110		;13 bis 16
    .db	0b00010111, 0b00011000, 0b00011001, 0b00100000, 0b00100000, 0b00100001		;17 bis 21
    .db	0b00100010, 0b00100011, 0b00100011, 0b00100100, 0b00100101, 0b00100110		;22 bis 26
    .db	0b00100110, 0b00100111, 0b00101000, 0b00101001, 0b00110000, 0b00110000		;26 bis 30
    .db	0b00110001, 0b00110010, 0b00110011, 0b00110011, 0b00110100, 0b00110101		;31 bis 35
    .db	0b00110110, 0b00110110, 0b00110111, 0b00111000, 0b00111001, 0b00111001		;36 bis 39
    .db	0b01000000, 0b01000001, 0b01000010, 0b01000010, 0b01000011, 0b01000100		;40 bis 44
    .db	0b01000101, 0b01000101, 0b01000110, 0b01000111, 0b01001000, 0b01001000		;45 bis 48
    .db	0b01001001, 0b01010000, 0b01010001, 0b01010001, 0b01010010, 0b01010011		;49 bis 53
    .db	0b01010100, 0b01010100, 0b01010101, 0b01010110, 0b01010111, 0b01010111		;54 bis 57
    .db	0b01011000, 0b01011001, 0b01100000, 0b01100000, 0b01100001, 0b01100010		;58 bis 62
    .db	0b01100010, 0b01100011, 0b01100100, 0b01100101, 0b01100101, 0b01100110		;62 bis 66
    .db	0b01100111, 0b01101000, 0b01101000, 0b01101001, 0b01110000, 0b01110001		;67 bis 71
    .db	0b01110001, 0b01110010, 0b01110011, 0b01110100, 0b01110100, 0b01110101		;71 bis 75
    .db	0b01110110, 0b01110111, 0b01110111, 0b01111000, 0b01111001, 0b01111001		;76 bis 79
    .db	0b10000000, 0b10000001, 0b10000010, 0b10000010, 0b10000011, 0b10000100		;80 bis 84
    .db	0b10000101, 0b10000101, 0b10000110, 0b10000111, 0b10001000, 0b10001000		;85 bis 88
    .db	0b10001001, 0b10010000, 0b10010001, 0b10010001, 0b10010010, 0b10010011		;89 bis 93
    .db	0b10010011, 0b10010100, 0b10010101, 0b10010110, 0b10010110, 0b10010111		;93 bis 97
    .db	0b10011000, 0b10011001, 0b10011001, 0b00000000; 100
    
    
    
    
    .org 0x0000
    		rjmp	reset		;reset
    		reti			;int0
    		reti			;int1
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		reti
    		rjmp	adccomp		;adc complete
    
    
    
    
    
    reset:		ldi	temp1,	low(ramend)    ;Stack initialisiern
    		out	spl,	temp1
    		ldi	temp1,	high(ramend)
    		out	sph,	temp1
    		ldi	temp1,	0x00			;Porteingang initialisieren
    		out	DDRC,	temp1			;input
    		ldi	temp1,	0x00
    		out	PORTC,	temp1			;interne pullups aus
    		ldi	temp1,	0b00111111		;lcd ausgänge initialisieren
    		out	DDRD,	temp1
    		cbi	ADMUX,	7			
    		cbi	ADMUX,	6			;reference spannung an Aref
    		cbi	ADMUX,	5			;rechts(9..0) angeordnetes Ergebnis
    		cbi	ADMUX,	0
    		cbi	ADMUX,	1
    		cbi	ADMUX,	2
    		cbi	ADMUX,	3			;ADC0 ist analoger eingang
    		sbi	ADCSRA,	7			;ADC einschalten
    		cbi	ADCSRA,	5			;free running mode aus
    		sbi	ADCSRA,	3			;ADC interrupt ein
    		sbi	ADCSRA,	0
    		cbi	ADCSRA,	1
    		sbi	ADCSRA,	2			;Prescaler auf 32
    		SEI					;interrupts anschalten
    		rcall	lcd_init			;lcd initialisieren
    
    
    
    main:		
    		ldi	temp1,	0x01
    		sbi	ADCSRA,	6			;adc starten
    fertig:		cpi	temp1,	0x00
    		brne	fertig	
    		andi	adcwh,	0b00000011		;bit 9 und 10 ausmaskieren
    		sbrc	adcwh,	0			;Vorzeichen erkennen, ab 175 ohne minus
    		rjmp	pos
    		cpi	adcwl,	0xaf			
    		brlo	neg				;springe wenn weniger
    		rjmp	pos					
    neg:		ldi	temp1,	0b10110000		;minuszeichen						
    		rcall	lcd_data
    		rjmp	hunderter
    pos:		ldi	temp1,	0b00100000		;leerstelle
    		rcall	lcd_data
    hunderter:	sbrs	adcwh,	0			;überprüfen ab wert 308 oder mehr, fals ja dann temperatur dreistellig
    		rjmp	leer				;sonst leerstelle
    		cpi	adcwl,	0x34			;springe wenn mehr oder gleich
    		brsh	hundert
    leer:		ldi	temp1,	0b00100000
    		rcall	lcd_data			;leerstelle ausgeben
    		rjmp	rest
    hundert:	ldi	temp1,	0b00110001		;eins ausgeben
    		rcall	lcd_data
    
    rest:		ldi	temp1,	0x71			;tabellenadresse festlegen
    		add	adcwl,	temp1			;zu low adc wert dazu zählen
    		brcc	keinue				
    		inc	adcwh				;carry in high adc wert
    keinue:		mov	zh,	adcwh			
    		mov	zl,	adcwl			;in das pointerregister laden
    		LPM					;programminhalt laden
    		mov	temp1,	r0
    		swap	temp1
    		andi	temp1,	0b00001111		;zehnerstelle sind obere 4bit
    		sbr	temp1,	0b00110000
    		rcall	lcd_data
    		mov	temp1,	r0
    		andi	temp1,	0b00001111		;einerstelle sind untere 4bit
    		sbr	temp1,	0b00110000
    		rcall	lcd_data
    		rcall	grad
    		rcall	time
    		rjmp	main
    
    
    
    time:		ldi	temp1,	0x20		
    loop2:		ldi	temp2,	0xff		
    loop1:		ldi	temp3,	0xff		
    loop0:		dec	temp3					brne	loop0		
    		dec	temp2			
    		brne	loop1			
    		dec	temp1			
    		brne	loop2						ret
    
    grad:		ldi	temp1,	0b01000111		;"G"	
    		rcall	lcd_data
    		ldi	temp1,	0b01110010		;"r"
    		rcall	lcd_data
    		ldi	temp1,	0b01100001		;"a"
    		rcall	lcd_data
    		ldi	temp1,	0b01100100		;"d"
    		rcall	lcd_data
    		ret
    
    
    ;	##############
    ;	##Interrupts##
    ;	##############
    
    adccomp:	in	adcwl,	ADCL			;Ergebnis in adcwl (untere 8bit)
    		in	adcwh,	ADCH			;Ergebnis in adcwh (0bere 2bit)
    		clr	temp1
    		rcall	lcd_clear			;lcd reset
    		reti 	
    
    
    
    
    
    
    
    .org 0x0100
    
    
    
    
    
    ;	############
    ;	##routinen##
    ;	############	
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;                 LCD-Routinen                ;;
    ;;                 ============                ;;
    ;;              (c)andreas-s@web.de            ;;
    ;;                                             ;;
    ;; 4bit-Interface 4Mhz       temp1-3           ;;
    ;; DB4-DB7:       PD0-PD3    2 und 3 noch      ;;
    ;; RS:            PD4        verwendbar        ;;
    ;; E:             PD5	     1 ist befehl      ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
     
     
     ;sendet ein Datenbyte an das LCD
    lcd_data:
    	   push temp2	
               mov temp2, temp1             ;"Sicherungskopie" für
                                            ;die Übertragung des 2.Nibbles
               swap temp1                   ;Vertauschen
               andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
               sbr temp1, 1<<4              ;entspricht 0b00010000
               out PORTD, temp1             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
                                            ;2. Nibble, kein swap da es schon
                                            ;an der richtigen stelle ist
               andi temp2, 0b00001111       ;obere Hälfte auf Null setzen 
               sbr temp2, 1<<4              ;entspricht 0b00010000
               out PORTD, temp2             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
               rcall delay50us              ;Delay-Routine aufrufen
    	   pop temp2
               ret                          ;zurück zum Hauptprogramm
    
     ;sendet einen Befehl an das LCD
    lcd_command:                            ;wie lcd_data, nur ohne RS zu setzen
    	   push temp2
               mov temp2, temp1
               swap temp1
               andi temp1, 0b00001111
               out PORTD, temp1
               rcall lcd_enable
               andi temp2, 0b00001111
               out PORTD, temp2
               rcall lcd_enable
               rcall delay50us
    	   pop temp2
               ret
    
     ;erzeugt den Enable-Puls
    lcd_enable:
               sbi PORTD, 5                 ;Enable high
               nop                          ;3 Taktzyklen warten
               nop
               nop
               cbi PORTD, 5                 ;Enable wieder low
               ret                          ;Und wieder zurück                     
    
     ;Pause nach jeder Übertragung
    delay50us:                              ;50us Pause
               ldi  temp1, $42
    delay50us_:dec  temp1
               brne delay50us_
               ret                          ;wieder zurück
    
     ;Längere Pause für manche Befehle
    delay5ms:                               ;5ms Pause
    	   push temp2
               ldi  temp1, $21
    WGLOOP0:   ldi  temp2, $C9
    WGLOOP1:   dec  temp2
               brne WGLOOP1
               dec  temp1
               brne WGLOOP0
    	   pop temp2
               ret                          ;wieder zurück
    
     ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
    lcd_init:
    	   push temp3
               ldi	temp3,50
    powerupwait:
               rcall	delay5ms
               dec	temp3
               brne	powerupwait
               ldi temp1, 0b00000011        ;muss 3mal hintereinander gesendet
               out PORTD, temp1             ;werden zur Initialisierung
               rcall lcd_enable             ;1
               rcall delay5ms
               rcall lcd_enable             ;2
               rcall delay5ms
               rcall lcd_enable             ;und 3!
               rcall delay5ms
               ldi temp1, 0b00000010        ;4bit-Modus einstellen
               out PORTD, temp1
               rcall lcd_enable
               rcall delay5ms
               ldi temp1, 0b00101000        ;noch was einstellen...
               rcall lcd_command
               ldi temp1, 0b00001100        ;...nochwas...
               rcall lcd_command
               ldi temp1, 0b00000100        ;endlich fertig
               rcall lcd_command
    	   pop temp3
               ret
    
     ;Sendet den Befehl zur Löschung des Displays
    lcd_clear:
               ldi temp1, 0b00000001   ;Display löschen
               rcall lcd_command
               rcall delay5ms
               ret
    ist leider alles etwas verrutscht, da ichs im texteditor etwas zu breit geschrieben hab, müsst ihr halt gegebenfals überarbeiten
    Also die ADC Werte nehm ich als Sprungadresse und an dieser stehen dann die Zahlen im ASCII und zwar immer die unteren nibbles beider zahlen. die tabelle ist leider nötig da sich der temperatursensor nicht linear verhält. ich habs bis jetzt von -55 bis 100 gerechnet. Die Zeitverzögerung hab ich gemacht damit das Thermometer nicht ständig springt Alles klar soweit?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    39
    Beiträge
    37
    achja nochwas zur abweichung, die ist bei mir relativ gering. ich habs mit nem infrarot thermometer geprüft und sie liegt bei unter einem grad. voraussetzung dafür ist natürlich das man einen präzisionswiderstand verwendet und die leitungen vom spannungsteiler sowie zum adc eingang so kurz wie möglich macht

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    11.09.2005
    Beiträge
    47
    Zitat Zitat von eric101
    (1023*x)\(x+3900)
    Leider kann ich asm nicht lesen ;(

    kannst du mir deine formel nochmal kurz erklären?
    ich komm noch nicht ganz her wie ich aus dem ergebnis am adc z.b. 2,73V den widerstandswert des kty bekomme - dann könnte ich ja in der tabelle nachschauen welche temp am besten hinkommt ....

    danke!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test