|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
ivan Mojster
Pridružen/-a: Pon Mar 2004 18:49 Prispevkov: 45 Kraj: Cerkno
|
Objavljeno: Čet Jan 07, 2010 5:49 pm Naslov sporočila: DS1820 - negativne temperature ! |
|
|
Pozdravljeni ,
po dolgem času sem spet vzel v "roke" senzor DS1820, pa bi želel z njiim meriti tudi negatvne temperature. Malo sem gledal po netu, pa nisem uspel dobiti kakšnih koristnih informacij. S spodnjim programom sem posnel, kaj se dogaja ob prehodu skozi negativne vrednosti. Senzor sem
v zaščitni cevki potopil v kopel z alkoholom in zniževal temperaturo
Koda: |
'-----------------------------------------------------------------------------------------
'copyright : (c) 2008-2009, AVRprojects.info
'purpose : DS1820 / DS18S20 Temperature Indicator
'-----------------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000 ' nastavimo interni kvarc na 4.000.000 Mhz
$baud = 9600
Declare Sub Read1820
Config 1wire = Pb.0
'Config Lcd = 16 * 2
'Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
'Temp variables
Dim Bd1 As Byte
Dim Bd2 As Byte
Dim Bd7 As Byte
Dim Bd8 As Byte
Dim I As Byte , Tmp As Byte
Dim T As Integer , T1 As Integer
Dim T_neg As Single , T1_neg As Single
Dim Bd(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS1820
'Sc(1) 'Temperature LSB
'Sc(2) 'Temperature MSB
'Sc(3) 'TH/user byte 1 also SRAM
'Sc(4) 'TL/user byte 2 also SRAM
'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6) 'res
'Sc(7) 'res
'Sc(8) 'res
'Sc(9) '8 CRC
'DALLAS DS1820 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33 read rom - single sensor
'&H CC skip rom
'&H BE read scratchpad
'&H 44 convert T
'Main loop
'Cls
'Cursor Off
Do
1wwrite &HCC : 1wwrite &H44 ' start measure
Waitms 400 ' wait for end of conversion
Read1820
Wait 1
Loop
End 'end program
'Read the DS1820 by skipping the ROM checking, since we are using only 1 sensor
Sub Read1820 ' reads sensor ans calculate ' T for 0.1 C
1wreset ' reset the bus
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9)
Bd1 = Bd(1)
Bd2 = Bd(2)
Bd7 = Bd(7)
Bd8 = Bd(8)
' read bytes in array
1wreset ' reset the bus
Tmp = Bd1 And 1
If Tmp = 1 Then Decr Bd1 ' 0.1C precision
T = Bd1
T = T * 50
T = T - 25
T1 = Bd8 - Bd7
T1 = T1 * 100
T1 = T1 / Bd8
T = T + T1
T1 = T / 100 'store tens
T = T Mod 100 'store decimal number
Cls
Locate 1 , 3
' Lcd "Temperature"
' Locate 2 , 7
' Lcd T1 ; "." ; T
Print
Print T1 ; "." ; T
End Sub
End |
Koda: |
Izmerjene vrednosti vrednosti so v °C
kopel DS1820
10:59:20 - 1.29 - 0.31
10:59:27 - 1.09 - 0.28
10:59:34 - 0.99 - 0.28
10:59:41 - 1.06 - 0.25
10:59:48 - 1.11 - 0.16
10:59:54 - 0.91 - 0.11
11:00:01 - 1.06 - 0.8
11:00:08 - 0.91 - 0.4
11:00:15 - 0.89 - 0.2
11:00:22 - 1.09 - 0.-1
11:00:29 - 0.66 - 0.-4
11:00:36 - 0.73 - 0.-9
11:00:43 - 0.53 - 0.-15
11:00:50 - 0.27 - 0.-24
11:00:57 - 0.17 - 127.68
11:01:04 - 0.2 - 127.56
11:01:11 - 0.17 - 127.45
11:01:18 - 0.1 - 127.31
11:01:25 - 0.07 - 127.22
11:01:32 - 0.02 - 127.15
11:01:39 - 0.02 - 127.5
11:01:45 - -0.08 - 126.96
11:01:52 - -0.16 - 126.93
11:01:59 - -0.74 - 126.91
11:02:06 - -0.31 - 126.88
11:02:13 - -0.56 - 126.87
11:02:20 - -0.74 - 126.84
11:02:27 - -0.62 - 126.81
11:02:34 - -0.69 - 126.75
11:02:41 - -0.62 - 126.68
11:02:48 - -1 - 126.5
11:02:55 - -0.87 - 126.35
11:03:02 - -1.15 - 126.26
11:03:09 - -1.33 - 126.17
11:03:16 - -1.07 - 126.9
11:03:23 - -1.28 - 126.3
11:03:30 - -1.18 - 125.96
11:03:36 - -1.1 - 125.92
11:03:43 - -1.53 - 125.85
11:03:50 - -1.56 - 125.79
11:03:57 - -1.46 - 125.75
11:04:04 - -1.35 - 125.67
11:04:11 - -1.81 - 125.6
11:04:18 - -1.84 - 125.51
End |
Opaženo je tudi manjše odstopanje od dejanske vrednosti.
Lahko tudi zaradi prevelikega naklona temperature.
Ob prehodu skozi 0 se na prvem mestu pojavi 127
Ali se je kdo že ukvarjal s tem in ima kakšen konkreten predlog.
LP ivan[/code] |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Čet Jan 07, 2010 6:41 pm Naslov sporočila: |
|
|
Format zapisa v senzorju ni nujno enak formatu zapisa v tvojem programskem orodju. Preuci datasheet senzorja da vidis kako so oblikovani podatkim, katere dobis iz senzorja, in potem vrednost prilagodi za izpis v svojem programu. |
|
Nazaj na vrh |
|
|
galex4 Novinec
Pridružen/-a: Čet Jan 2009 10:39 Prispevkov: 5
|
Objavljeno: Ned Jan 16, 2011 11:17 pm Naslov sporočila: |
|
|
jaz pa imam sledeč problem, ko merim pozitivno temperaturo mi delo ok, ko pa se pozitivna vrednost približa nuli, se mi vključi segment, ki opozarja, da je temperatura pod lediščem, vendar mi z 0 skoči na 19 in nato šteje dalje vse do 30, vendar te negativne vrednosti niso dobre, kje torej je problem? |
|
Nazaj na vrh |
|
|
NUFAN Profesionalec
Pridružen/-a: Tor Maj 2004 19:57 Prispevkov: 133 Kraj: Žalec
|
Objavljeno: Pon Jan 17, 2011 3:36 pm Naslov sporočila: |
|
|
Verjetno v programu _________________ Prihodnost je v nas! |
|
Nazaj na vrh |
|
|
galex4 Novinec
Pridružen/-a: Čet Jan 2009 10:39 Prispevkov: 5
|
Objavljeno: Pon Jan 17, 2011 4:13 pm Naslov sporočila: |
|
|
tudi to je možno, bo še treba malo preštudirat datasheet |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Tor Jan 18, 2011 9:52 am Naslov sporočila: |
|
|
Obstajata vsaj dva tipa senzorja
DS18S20 in DS18B20
Se uporabljata enako, če si zadovoljen z natančnostjo do 0.5 C
Desetinke se izračunajo drugače.
Nikoli se nisem ubadal z desetinkami. _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
galex4 Novinec
Pridružen/-a: Čet Jan 2009 10:39 Prispevkov: 5
|
Objavljeno: Tor Jan 18, 2011 10:58 am Naslov sporočila: |
|
|
ja to vem, vendar nevidim potrebe po tistih 0.5°C, ker nimam zadosti 7 segmentnih prikazovalnikov in je zadovoljivo samo, da prikaže v celoti.
Vendar ne razumam zakaj je tak velik skok iz 0 na -19, pozitivne stopinje pa so zadovoljive vrednosti |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Tor Jan 18, 2011 12:33 pm Naslov sporočila: |
|
|
galex4 je napisal/a: | ja to vem, vendar nevidim potrebe po tistih 0.5°C, ker nimam zadosti 7 segmentnih prikazovalnikov in je zadovoljivo samo, da prikaže v celoti.
|
Če ti je na polovico stopinje dovolj natančno, potem je dovolj, da iz prvih dveh bajtov narediš integer.
V njem je temperatura v polovičkah stopinje.
Če si zadovoljen s stopinjami, potem to samo deliš z 2 in imaš stopinje.
Definicije:
Koda: | Dim Bd(9) As Byte
dim polovicka as integer at Bd(1) overlay
|
Integer sem definiral kar preko definicije Bd(1) in Bd(2) ker ima integer dva bajta.
Subread12 bi napisal morda tako:
Koda: | Sub Read1820 ' reads sensor ans calculate ' T for 0.1 C
1wreset ' reset the bus
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9)
1wreset ' reset the bus
T = polovicka / 2
Print T ; " C"
End Sub |
Seveda tega nisem testiral, lahko da sem naredil kako manjšo napako, ki jo popravi sam! _________________ Sliši se paradoksalno, a je vendarle res:
Nekateri ljudje imajo vedno vse prav. No, včasih. |
|
Nazaj na vrh |
|
|
galex4 Novinec
Pridružen/-a: Čet Jan 2009 10:39 Prispevkov: 5
|
Objavljeno: Tor Jan 18, 2011 12:44 pm Naslov sporočila: |
|
|
se opravičujem ker nisem napisal v katerem jeziku programiram in katere čipe programiram,
čipe PIC programiram v mikrobasic-u, saj načeloma je podobno, le da moram paziti pri ukazih
kako izgleda koda je pa tule:
program ds
symbol segment2 = PORTD
symbol segment1 = PORTC
symbol minus = PORTB.5
dim i as short
temp as word
const x = 0.488
main:
TRISA = %00000111
'vsi pini so digitalni razen AN0, ki je analogen
ADCON1 = %00101110
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
segment1 = 0
segment2 = 0
i = 0
minus = 0
while true
Ow_Reset(PORTA, 1) ' Onewire reset signal
Ow_Write(PORTA, 1, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA, 1, 0x44) ' Issue command CONVERT_T
delay_us(120)
Ow_Reset(PORTA, 1)
Ow_Write(PORTA, 1, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTA, 1, 0xBE) ' Issue command READ_SCRATCHPAD
temp = Ow_Read(PORTA, 1)
temp = (Ow_Read(PORTA, 1) << + temp
i = x * temp
......
wend
end. |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu You cannot attach files in this forum You cannot download files in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|